177 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
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 "overview/overview_layout.h"
 | 
						|
 | 
						|
namespace Storage {
 | 
						|
enum class SharedMediaType : signed char;
 | 
						|
} // namespace Storage
 | 
						|
 | 
						|
namespace Info::Media {
 | 
						|
 | 
						|
using Type = Storage::SharedMediaType;
 | 
						|
using BaseLayout = Overview::Layout::ItemBase;
 | 
						|
 | 
						|
class Memento;
 | 
						|
class ListSection;
 | 
						|
 | 
						|
inline constexpr auto kPreloadIfLessThanScreens = 2;
 | 
						|
 | 
						|
struct ListItemSelectionData {
 | 
						|
	explicit ListItemSelectionData(TextSelection text) : text(text) {
 | 
						|
	}
 | 
						|
 | 
						|
	TextSelection text;
 | 
						|
	bool canDelete = false;
 | 
						|
	bool canForward = false;
 | 
						|
};
 | 
						|
 | 
						|
inline bool operator==(
 | 
						|
		ListItemSelectionData a,
 | 
						|
		ListItemSelectionData b) {
 | 
						|
	return (a.text == b.text)
 | 
						|
		&& (a.canDelete == b.canDelete)
 | 
						|
		&& (a.canForward == b.canForward);
 | 
						|
}
 | 
						|
 | 
						|
using ListSelectedMap = base::flat_map<
 | 
						|
	not_null<const HistoryItem*>,
 | 
						|
	ListItemSelectionData,
 | 
						|
	std::less<>>;
 | 
						|
 | 
						|
enum class ListDragSelectAction {
 | 
						|
	None,
 | 
						|
	Selecting,
 | 
						|
	Deselecting,
 | 
						|
};
 | 
						|
 | 
						|
struct ListContext {
 | 
						|
	Overview::Layout::PaintContext layoutContext;
 | 
						|
	not_null<ListSelectedMap*> selected;
 | 
						|
	not_null<ListSelectedMap*> dragSelected;
 | 
						|
	ListDragSelectAction dragSelectAction = ListDragSelectAction::None;
 | 
						|
};
 | 
						|
 | 
						|
struct ListScrollTopState {
 | 
						|
	int64 position = 0; // ListProvider-specific.
 | 
						|
	HistoryItem *item = nullptr;
 | 
						|
	int shift = 0;
 | 
						|
};
 | 
						|
 | 
						|
struct ListFoundItem {
 | 
						|
	not_null<BaseLayout*> layout;
 | 
						|
	QRect geometry;
 | 
						|
	bool exact = false;
 | 
						|
};
 | 
						|
 | 
						|
struct CachedItem {
 | 
						|
	CachedItem(std::unique_ptr<BaseLayout> item) : item(std::move(item)) {
 | 
						|
	};
 | 
						|
	CachedItem(CachedItem &&other) = default;
 | 
						|
	CachedItem &operator=(CachedItem &&other) = default;
 | 
						|
	~CachedItem() = default;
 | 
						|
 | 
						|
	std::unique_ptr<BaseLayout> item;
 | 
						|
	bool stale = false;
 | 
						|
};
 | 
						|
 | 
						|
using UniversalMsgId = MsgId;
 | 
						|
 | 
						|
[[nodiscard]] UniversalMsgId GetUniversalId(FullMsgId itemId);
 | 
						|
[[nodiscard]] UniversalMsgId GetUniversalId(
 | 
						|
	not_null<const HistoryItem*> item);
 | 
						|
[[nodiscard]] UniversalMsgId GetUniversalId(
 | 
						|
	not_null<const BaseLayout*> layout);
 | 
						|
 | 
						|
bool ChangeItemSelection(
 | 
						|
	ListSelectedMap &selected,
 | 
						|
	not_null<const HistoryItem*> item,
 | 
						|
	ListItemSelectionData selectionData);
 | 
						|
 | 
						|
class ListSectionDelegate {
 | 
						|
public:
 | 
						|
	[[nodiscard]] virtual bool sectionHasFloatingHeader() = 0;
 | 
						|
	[[nodiscard]] virtual QString sectionTitle(
 | 
						|
		not_null<const BaseLayout*> item) = 0;
 | 
						|
	[[nodiscard]] virtual bool sectionItemBelongsHere(
 | 
						|
		not_null<const BaseLayout*> item,
 | 
						|
		not_null<const BaseLayout*> previous) = 0;
 | 
						|
 | 
						|
	[[nodiscard]] not_null<ListSectionDelegate*> sectionDelegate() {
 | 
						|
		return this;
 | 
						|
	}
 | 
						|
};
 | 
						|
 | 
						|
class ListProvider {
 | 
						|
public:
 | 
						|
	[[nodiscard]] virtual Type type() = 0;
 | 
						|
	[[nodiscard]] virtual bool hasSelectRestriction() = 0;
 | 
						|
	[[nodiscard]] virtual auto hasSelectRestrictionChanges()
 | 
						|
		->rpl::producer<bool> = 0;
 | 
						|
	[[nodiscard]] virtual bool isPossiblyMyItem(
 | 
						|
		not_null<const HistoryItem*> item) = 0;
 | 
						|
 | 
						|
	[[nodiscard]] virtual std::optional<int> fullCount() = 0;
 | 
						|
 | 
						|
	virtual void restart() = 0;
 | 
						|
	virtual void checkPreload(
 | 
						|
		QSize viewport,
 | 
						|
		not_null<BaseLayout*> topLayout,
 | 
						|
		not_null<BaseLayout*> bottomLayout,
 | 
						|
		bool preloadTop,
 | 
						|
		bool preloadBottom) = 0;
 | 
						|
	virtual void refreshViewer() = 0;
 | 
						|
	[[nodiscard]] virtual rpl::producer<> refreshed() = 0;
 | 
						|
 | 
						|
	[[nodiscard]] virtual std::vector<ListSection> fillSections(
 | 
						|
		not_null<Overview::Layout::Delegate*> delegate) = 0;
 | 
						|
	[[nodiscard]] virtual auto layoutRemoved()
 | 
						|
		-> rpl::producer<not_null<BaseLayout*>> = 0;
 | 
						|
	[[nodiscard]] virtual BaseLayout *lookupLayout(
 | 
						|
		const HistoryItem *item) = 0;
 | 
						|
	[[nodiscard]] virtual bool isMyItem(
 | 
						|
		not_null<const HistoryItem*> item) = 0;
 | 
						|
	[[nodiscard]] virtual bool isAfter(
 | 
						|
		not_null<const HistoryItem*> a,
 | 
						|
		not_null<const HistoryItem*> b) = 0;
 | 
						|
 | 
						|
	[[nodiscard]] virtual ListItemSelectionData computeSelectionData(
 | 
						|
		not_null<const HistoryItem*> item,
 | 
						|
		TextSelection selection) = 0;
 | 
						|
	virtual void applyDragSelection(
 | 
						|
		ListSelectedMap &selected,
 | 
						|
		not_null<const HistoryItem*> fromItem,
 | 
						|
		bool skipFrom,
 | 
						|
		not_null<const HistoryItem*> tillItem,
 | 
						|
		bool skipTill) = 0;
 | 
						|
 | 
						|
	[[nodiscard]] virtual bool allowSaveFileAs(
 | 
						|
		not_null<const HistoryItem*> item,
 | 
						|
		not_null<DocumentData*> document) = 0;
 | 
						|
	[[nodiscard]] virtual QString showInFolderPath(
 | 
						|
		not_null<const HistoryItem*> item,
 | 
						|
		not_null<DocumentData*> document) = 0;
 | 
						|
 | 
						|
	virtual void setSearchQuery(QString query) = 0;
 | 
						|
 | 
						|
	[[nodiscard]] virtual int64 scrollTopStatePosition(
 | 
						|
		not_null<HistoryItem*> item) = 0;
 | 
						|
	[[nodiscard]] virtual HistoryItem *scrollTopStateItem(
 | 
						|
		ListScrollTopState state) = 0;
 | 
						|
	virtual void saveState(
 | 
						|
		not_null<Memento*> memento,
 | 
						|
		ListScrollTopState scrollState) = 0;
 | 
						|
	virtual void restoreState(
 | 
						|
		not_null<Memento*> memento,
 | 
						|
		Fn<void(ListScrollTopState)> restoreScrollState) = 0;
 | 
						|
 | 
						|
	virtual ~ListProvider() = default;
 | 
						|
};
 | 
						|
 | 
						|
} // namespace Info::Media
 |