/* 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 "info/media/info_media_common.h" #include "data/data_shared_media.h" namespace Info { class AbstractController; } // namespace Info namespace Info::Media { class Provider final : public ListProvider, private ListSectionDelegate { public: explicit Provider(not_null controller); Type type() override; bool hasSelectRestriction() override; rpl::producer hasSelectRestrictionChanges() override; bool isPossiblyMyItem(not_null item) override; std::optional fullCount() override; void restart() override; void checkPreload( QSize viewport, not_null topLayout, not_null bottomLayout, bool preloadTop, bool preloadBottom) override; void refreshViewer() override; rpl::producer<> refreshed() override; std::vector fillSections( not_null delegate) override; rpl::producer> layoutRemoved() override; BaseLayout *lookupLayout(const HistoryItem *item) override; bool isMyItem(not_null item) override; bool isAfter( not_null a, not_null b) override; void setSearchQuery(QString query) override; ListItemSelectionData computeSelectionData( not_null item, TextSelection selection) override; void applyDragSelection( ListSelectedMap &selected, not_null fromItem, bool skipFrom, not_null tillItem, bool skipTill) override; bool allowSaveFileAs( not_null item, not_null document) override; QString showInFolderPath( not_null item, not_null document) override; int64 scrollTopStatePosition(not_null item) override; HistoryItem *scrollTopStateItem(ListScrollTopState state) override; void saveState( not_null memento, ListScrollTopState scrollState) override; void restoreState( not_null memento, Fn restoreScrollState) override; private: static constexpr auto kMinimalIdsLimit = 16; static constexpr auto kDefaultAroundId = (ServerMaxMsgId - 1); bool sectionHasFloatingHeader() override; QString sectionTitle(not_null item) override; bool sectionItemBelongsHere( not_null item, not_null previous) override; [[nodiscard]] bool isPossiblyMyPeerId(PeerId peerId) const; [[nodiscard]] FullMsgId computeFullId(UniversalMsgId universalId) const; [[nodiscard]] BaseLayout *getLayout( UniversalMsgId universalId, not_null delegate); [[nodiscard]] std::unique_ptr createLayout( UniversalMsgId universalId, not_null delegate, Type type); [[nodiscard]] SparseIdsMergedSlice::Key sliceKey( UniversalMsgId universalId) const; void itemRemoved(not_null item); void markLayoutsStale(); void clearStaleLayouts(); const not_null _controller; const not_null _peer; const MsgId _topicRootId = 0; PeerData * const _migrated = nullptr; const Type _type = Type::Photo; UniversalMsgId _universalAroundId = kDefaultAroundId; int _idsLimit = kMinimalIdsLimit; SparseIdsMergedSlice _slice; std::unordered_map _layouts; rpl::event_stream> _layoutRemoved; rpl::event_stream<> _refreshed; rpl::lifetime _lifetime; rpl::lifetime _viewerLifetime; }; } // namespace Info::Media