/* 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 "base/weak_ptr.h" #include "data/data_stories_ids.h" #include "info/media/info_media_common.h" class DocumentData; class HistoryItem; class PeerData; class History; namespace Data { class Story; } // namespace Data namespace Info { class AbstractController; } // namespace Info namespace Info::Stories { enum class Tab; class Provider final : public Media::ListProvider , private Media::ListSectionDelegate , public base::has_weak_ptr { public: explicit Provider(not_null controller); ~Provider(); Media::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; void setSearchQuery(QString query) override; std::vector fillSections( not_null delegate) override; rpl::producer> layoutRemoved() override; Media::BaseLayout *lookupLayout(const HistoryItem *item) override; bool isMyItem(not_null item) override; bool isAfter( not_null a, not_null b) override; Media::ListItemSelectionData computeSelectionData( not_null item, TextSelection selection) override; void applyDragSelection( Media::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( Media::ListScrollTopState state) override; void saveState( not_null memento, Media::ListScrollTopState scrollState) override; void restoreState( not_null memento, Fn restoreScrollState) override; private: static constexpr auto kMinimalIdsLimit = 16; static constexpr auto kDefaultAroundId = ServerMaxStoryId - 1; bool sectionHasFloatingHeader() override; QString sectionTitle(not_null item) override; bool sectionItemBelongsHere( not_null item, not_null previous) override; void storyRemoved(not_null story); void markLayoutsStale(); void clearStaleLayouts(); void clear(); [[nodiscard]] HistoryItem *ensureItem(StoryId id); [[nodiscard]] Media::BaseLayout *getLayout( StoryId id, not_null delegate); [[nodiscard]] std::unique_ptr createLayout( StoryId id, not_null delegate); const not_null _controller; const not_null _peer; const not_null _history; const Tab _tab; StoryId _aroundId = kDefaultAroundId; int _idsLimit = kMinimalIdsLimit; Data::StoriesIdsSlice _slice; base::flat_map> _items; std::unordered_map _layouts; rpl::event_stream> _layoutRemoved; rpl::event_stream<> _refreshed; bool _started = false; rpl::lifetime _lifetime; rpl::lifetime _viewerLifetime; }; } // namespace Info::Stories