/* 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" namespace Info { class AbstractController; } // namespace Info namespace Info::Downloads { class Provider final : public Media::ListProvider { public: explicit Provider(not_null controller); 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; 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; void applyDragSelection( Media::ListSelectedMap &selected, not_null fromItem, bool skipFrom, not_null tillItem, bool skipTill) override; void saveState( not_null memento, Media::ListScrollTopState scrollState) override; void restoreState( not_null memento, Fn restoreScrollState) override; private: struct Element { not_null item; uint64 started = 0; }; const not_null _controller; std::vector _elements; std::unordered_map, Media::CachedItem> _layouts; rpl::event_stream> _layoutRemoved; rpl::event_stream<> _refreshed; rpl::lifetime _lifetime; }; } // namespace Info::Downloads