/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include #include "ui/rp_widget.h" #include "info/info_wrap_widget.h" namespace Storage { enum class SharedMediaType : char; } // namespace Storage namespace Ui { class ScrollArea; class InputField; struct ScrollToRequest; template class PaddingWrap; } // namespace Ui namespace Info { class ContentMemento; class Controller; class ContentWidget : public Ui::RpWidget { public: ContentWidget( QWidget *parent, not_null controller); virtual bool showInternal( not_null memento) = 0; std::unique_ptr createMemento(); virtual rpl::producer
sectionRequest() const; virtual void setIsStackBottom(bool isStackBottom) { } rpl::producer scrollHeightValue() const; rpl::producer desiredHeightValue() const override; rpl::producer desiredShadowVisibility() const; bool hasTopBarShadow() const; virtual void setInnerFocus(); // When resizing the widget with top edge moved up or down and we // want to add this top movement to the scroll position, so inner // content will not move. void setGeometryWithTopMoved( const QRect &newGeometry, int topDelta); void applyAdditionalScroll(int additionalScroll); int scrollTillBottom(int forHeight) const; rpl::producer scrollTillBottomChanges() const; // Float player interface. bool wheelEventFromFloatPlayer(QEvent *e); QRect rectForFloatPlayer() const; virtual rpl::producer selectedListValue() const; virtual void cancelSelection() { } protected: template Widget *setInnerWidget(object_ptr inner) { return static_cast( doSetInnerWidget(std::move(inner))); } not_null controller() const { return _controller; } void resizeEvent(QResizeEvent *e) override; void paintEvent(QPaintEvent *e) override; void setScrollTopSkip(int scrollTopSkip); int scrollTopSave() const; void scrollTopRestore(int scrollTop); void scrollTo(const Ui::ScrollToRequest &request); private: RpWidget *doSetInnerWidget(object_ptr inner); void updateControlsGeometry(); void refreshSearchField(bool shown); virtual std::unique_ptr doCreateMemento() = 0; const not_null _controller; style::color _bg; rpl::variable _scrollTopSkip = -1; rpl::event_stream _scrollTillBottomChanges; object_ptr _scroll; Ui::PaddingWrap *_innerWrap = nullptr; base::unique_qptr _searchWrap = nullptr; QPointer _searchField; int _innerDesiredHeight = 0; // Saving here topDelta in setGeometryWithTopMoved() to get it passed to resizeEvent(). int _topDelta = 0; }; class ContentMemento { public: ContentMemento(PeerId peerId, PeerId migratedPeerId) : _peerId(peerId) , _migratedPeerId(migratedPeerId) { } virtual object_ptr createWidget( QWidget *parent, not_null controller, const QRect &geometry) = 0; PeerId peerId() const { return _peerId; } PeerId migratedPeerId() const { return _migratedPeerId; } virtual Section section() const = 0; virtual ~ContentMemento() = default; void setScrollTop(int scrollTop) { _scrollTop = scrollTop; } int scrollTop() const { return _scrollTop; } void setSearchFieldQuery(const QString &query) { _searchFieldQuery = query; } QString searchFieldQuery() const { return _searchFieldQuery; } void setSearchEnabledByContent(bool enabled) { _searchEnabledByContent = enabled; } bool searchEnabledByContent() const { return _searchEnabledByContent; } void setSearchStartsFocused(bool focused) { _searchStartsFocused = focused; } bool searchStartsFocused() const { return _searchStartsFocused; } private: const PeerId _peerId = 0; const PeerId _migratedPeerId = 0; int _scrollTop = 0; QString _searchFieldQuery; bool _searchEnabledByContent = false; bool _searchStartsFocused = false; }; } // namespace Info