info_wrap_widget.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "window/section_widget.h"
  9. #include "ui/effects/animations.h"
  10. namespace Storage {
  11. enum class SharedMediaType : signed char;
  12. } // namespace Storage
  13. namespace Ui {
  14. class FadeShadow;
  15. class PlainShadow;
  16. class PopupMenu;
  17. class IconButton;
  18. class RoundRect;
  19. struct StringWithNumbers;
  20. } // namespace Ui
  21. namespace Window {
  22. enum class SlideDirection;
  23. } // namespace Window
  24. namespace Info {
  25. namespace Profile {
  26. class Widget;
  27. } // namespace Profile
  28. namespace Media {
  29. class Widget;
  30. } // namespace Media
  31. class Key;
  32. class Controller;
  33. class Section;
  34. class Memento;
  35. class MoveMemento;
  36. class ContentMemento;
  37. class ContentWidget;
  38. class TopBar;
  39. enum class Wrap {
  40. Layer,
  41. Narrow,
  42. Side,
  43. Search,
  44. };
  45. struct SelectedItem {
  46. explicit SelectedItem(GlobalMsgId globalId) : globalId(globalId) {
  47. }
  48. GlobalMsgId globalId;
  49. bool canDelete = false;
  50. bool canForward = false;
  51. bool canToggleStoryPin = false;
  52. bool canUnpinStory = false;
  53. };
  54. struct SelectedItems {
  55. SelectedItems() = default;
  56. explicit SelectedItems(Storage::SharedMediaType type);
  57. Fn<Ui::StringWithNumbers(int)> title;
  58. std::vector<SelectedItem> list;
  59. };
  60. enum class SelectionAction {
  61. Clear,
  62. Forward,
  63. Delete,
  64. ToggleStoryPin,
  65. ToggleStoryInProfile,
  66. };
  67. class WrapWidget final : public Window::SectionWidget {
  68. public:
  69. WrapWidget(
  70. QWidget *parent,
  71. not_null<Window::SessionController*> window,
  72. Wrap wrap,
  73. not_null<Memento*> memento);
  74. Key key() const;
  75. Dialogs::RowDescriptor activeChat() const override;
  76. Wrap wrap() const {
  77. return _wrap.current();
  78. }
  79. rpl::producer<Wrap> wrapValue() const;
  80. void setWrap(Wrap wrap);
  81. rpl::producer<> contentChanged() const;
  82. not_null<Controller*> controller() {
  83. return _controller.get();
  84. }
  85. bool hasTopBarShadow() const override;
  86. QPixmap grabForShowAnimation(
  87. const Window::SectionSlideParams &params) override;
  88. void forceContentRepaint();
  89. bool showInternal(
  90. not_null<Window::SectionMemento*> memento,
  91. const Window::SectionShow &params) override;
  92. bool showBackFromStackInternal(const Window::SectionShow &params);
  93. void removeFromStack(const std::vector<Section> &sections);
  94. std::shared_ptr<Window::SectionMemento> createMemento() override;
  95. rpl::producer<int> desiredHeightValue() const override;
  96. // Float player interface.
  97. bool floatPlayerHandleWheelEvent(QEvent *e) override;
  98. QRect floatPlayerAvailableRect() override;
  99. object_ptr<Ui::RpWidget> createTopBarSurrogate(QWidget *parent);
  100. [[nodiscard]] bool hasBackButton() const;
  101. [[nodiscard]] bool closeByOutsideClick() const;
  102. void updateGeometry(
  103. QRect newGeometry,
  104. bool expanding,
  105. int additionalScroll,
  106. int maxVisibleHeight);
  107. [[nodiscard]] int scrollBottomSkip() const;
  108. [[nodiscard]] int scrollTillBottom(int forHeight) const;
  109. [[nodiscard]] rpl::producer<int> scrollTillBottomChanges() const;
  110. [[nodiscard]] rpl::producer<bool> grabbingForExpanding() const;
  111. [[nodiscard]] const Ui::RoundRect *bottomSkipRounding() const;
  112. [[nodiscard]] rpl::producer<> removeRequests() const override {
  113. return _removeRequests.events();
  114. }
  115. ~WrapWidget();
  116. protected:
  117. void resizeEvent(QResizeEvent *e) override;
  118. void keyPressEvent(QKeyEvent *e) override;
  119. void doSetInnerFocus() override;
  120. void showFinishedHook() override;
  121. void showAnimatedHook(
  122. const Window::SectionSlideParams &params) override;
  123. private:
  124. using SlideDirection = Window::SlideDirection;
  125. using SectionSlideParams = Window::SectionSlideParams;
  126. struct StackItem;
  127. void startInjectingActivePeerProfiles();
  128. void injectActiveProfile(Dialogs::Key key);
  129. void injectActivePeerProfile(not_null<PeerData*> peer);
  130. void injectActiveProfileMemento(
  131. std::shared_ptr<ContentMemento> memento);
  132. void checkBeforeClose(Fn<void()> close);
  133. void checkBeforeCloseByEscape(Fn<void()> close);
  134. void restoreHistoryStack(
  135. std::vector<std::shared_ptr<ContentMemento>> stack);
  136. bool hasStackHistory() const {
  137. return !_historyStack.empty();
  138. }
  139. void showNewContent(not_null<ContentMemento*> memento);
  140. void showNewContent(
  141. not_null<ContentMemento*> memento,
  142. const Window::SectionShow &params);
  143. bool returnToFirstStackFrame(
  144. not_null<ContentMemento*> memento,
  145. const Window::SectionShow &params);
  146. void setupTop();
  147. void setupTopBarMenuToggle();
  148. void createTopBar();
  149. void highlightTopBar();
  150. void setupShortcuts();
  151. [[nodiscard]] bool willHaveBackButton(
  152. const Window::SectionShow &params) const;
  153. not_null<RpWidget*> topWidget() const;
  154. QRect contentGeometry() const;
  155. rpl::producer<int> desiredHeightForContent() const;
  156. void finishShowContent();
  157. rpl::producer<bool> topShadowToggledValue() const;
  158. void updateContentGeometry();
  159. void showContent(object_ptr<ContentWidget> content);
  160. object_ptr<ContentWidget> createContent(
  161. not_null<ContentMemento*> memento,
  162. not_null<Controller*> controller);
  163. std::unique_ptr<Controller> createController(
  164. not_null<Window::SessionController*> window,
  165. not_null<ContentMemento*> memento);
  166. rpl::producer<SelectedItems> selectedListValue() const;
  167. bool requireTopBarSearch() const;
  168. void addTopBarMenuButton();
  169. void addProfileCallsButton();
  170. void showTopBarMenu(bool check);
  171. const bool _isSeparatedWindow = false;
  172. rpl::variable<Wrap> _wrap;
  173. std::unique_ptr<Controller> _controller;
  174. object_ptr<ContentWidget> _content = { nullptr };
  175. int _additionalScroll = 0;
  176. int _maxVisibleHeight = 0;
  177. bool _expanding = false;
  178. rpl::variable<bool> _grabbingForExpanding = false;
  179. object_ptr<TopBar> _topBar = { nullptr };
  180. object_ptr<Ui::RpWidget> _topBarSurrogate = { nullptr };
  181. Ui::Animations::Simple _topBarOverrideAnimation;
  182. bool _topBarOverrideShown = false;
  183. object_ptr<Ui::FadeShadow> _topShadow;
  184. object_ptr<Ui::FadeShadow> _bottomShadow;
  185. base::unique_qptr<Ui::IconButton> _topBarMenuToggle;
  186. base::unique_qptr<Ui::PopupMenu> _topBarMenu;
  187. std::vector<StackItem> _historyStack;
  188. rpl::event_stream<> _removeRequests;
  189. rpl::event_stream<rpl::producer<int>> _desiredHeights;
  190. rpl::event_stream<rpl::producer<bool>> _desiredShadowVisibilities;
  191. rpl::event_stream<rpl::producer<bool>> _desiredBottomShadowVisibilities;
  192. rpl::event_stream<rpl::producer<SelectedItems>> _selectedLists;
  193. rpl::event_stream<rpl::producer<int>> _scrollTillBottomChanges;
  194. rpl::event_stream<> _contentChanges;
  195. };
  196. } // namespace Info