1 /*
2 This file is part of Telegram Desktop,
3 the official desktop application for the Telegram messaging service.
4 
5 For license and copyright information please follow this link:
6 https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
7 */
8 #pragma once
9 
10 #include "data/data_auto_download.h"
11 #include "ui/rect_part.h"
12 
13 namespace Support {
14 enum class SwitchSettings;
15 } // namespace Support
16 
17 namespace ChatHelpers {
18 enum class SelectorTab;
19 } // namespace ChatHelpers
20 
21 namespace Main {
22 
23 class SessionSettings final {
24 public:
25 	SessionSettings();
26 
27 	[[nodiscard]] QByteArray serialize() const;
28 	void addFromSerialized(const QByteArray &serialized);
29 
setSupportSwitch(Support::SwitchSettings value)30 	void setSupportSwitch(Support::SwitchSettings value) {
31 		_supportSwitch = value;
32 	}
supportSwitch()33 	[[nodiscard]] Support::SwitchSettings supportSwitch() const {
34 		return _supportSwitch;
35 	}
setSupportFixChatsOrder(bool fix)36 	void setSupportFixChatsOrder(bool fix) {
37 		_supportFixChatsOrder = fix;
38 	}
supportFixChatsOrder()39 	[[nodiscard]] bool supportFixChatsOrder() const {
40 		return _supportFixChatsOrder;
41 	}
setSupportTemplatesAutocomplete(bool enabled)42 	void setSupportTemplatesAutocomplete(bool enabled) {
43 		_supportTemplatesAutocomplete = enabled;
44 	}
supportTemplatesAutocomplete()45 	[[nodiscard]] bool supportTemplatesAutocomplete() const {
46 		return _supportTemplatesAutocomplete;
47 	}
48 	void setSupportChatsTimeSlice(int slice);
49 	[[nodiscard]] int supportChatsTimeSlice() const;
50 	[[nodiscard]] rpl::producer<int> supportChatsTimeSliceValue() const;
51 	void setSupportAllSearchResults(bool all);
52 	[[nodiscard]] bool supportAllSearchResults() const;
53 	[[nodiscard]] rpl::producer<bool> supportAllSearchResultsValue() const;
setSupportAllSilent(bool enabled)54 	void setSupportAllSilent(bool enabled) {
55 		_supportAllSilent = enabled;
56 	}
supportAllSilent()57 	[[nodiscard]] bool supportAllSilent() const {
58 		return _supportAllSilent;
59 	}
60 
selectorTab()61 	[[nodiscard]] ChatHelpers::SelectorTab selectorTab() const {
62 		return _selectorTab;
63 	}
setSelectorTab(ChatHelpers::SelectorTab tab)64 	void setSelectorTab(ChatHelpers::SelectorTab tab) {
65 		_selectorTab = tab;
66 	}
67 
setGroupStickersSectionHidden(PeerId peerId)68 	void setGroupStickersSectionHidden(PeerId peerId) {
69 		_groupStickersSectionHidden.insert(peerId);
70 	}
isGroupStickersSectionHidden(PeerId peerId)71 	[[nodiscard]] bool isGroupStickersSectionHidden(PeerId peerId) const {
72 		return _groupStickersSectionHidden.contains(peerId);
73 	}
removeGroupStickersSectionHidden(PeerId peerId)74 	void removeGroupStickersSectionHidden(PeerId peerId) {
75 		_groupStickersSectionHidden.remove(peerId);
76 	}
77 
78 	void setMediaLastPlaybackPosition(DocumentId id, crl::time time);
79 	[[nodiscard]] crl::time mediaLastPlaybackPosition(DocumentId id) const;
80 
autoDownload()81 	[[nodiscard]] Data::AutoDownload::Full &autoDownload() {
82 		return _autoDownload;
83 	}
autoDownload()84 	[[nodiscard]] const Data::AutoDownload::Full &autoDownload() const {
85 		return _autoDownload;
86 	}
87 
88 	void setArchiveCollapsed(bool collapsed);
89 	[[nodiscard]] bool archiveCollapsed() const;
90 	[[nodiscard]] rpl::producer<bool> archiveCollapsedChanges() const;
91 
92 	void setArchiveInMainMenu(bool inMainMenu);
93 	[[nodiscard]] bool archiveInMainMenu() const;
94 	[[nodiscard]] rpl::producer<bool> archiveInMainMenuChanges() const;
95 
96 	void setSkipArchiveInSearch(bool skip);
97 	[[nodiscard]] bool skipArchiveInSearch() const;
98 	[[nodiscard]] rpl::producer<bool> skipArchiveInSearchChanges() const;
99 
hadLegacyCallsPeerToPeerNobody()100 	[[nodiscard]] bool hadLegacyCallsPeerToPeerNobody() const {
101 		return _hadLegacyCallsPeerToPeerNobody;
102 	}
103 
hiddenPinnedMessageId(PeerId peerId)104 	[[nodiscard]] MsgId hiddenPinnedMessageId(PeerId peerId) const {
105 		const auto i = _hiddenPinnedMessages.find(peerId);
106 		return (i != end(_hiddenPinnedMessages)) ? i->second : 0;
107 	}
setHiddenPinnedMessageId(PeerId peerId,MsgId msgId)108 	void setHiddenPinnedMessageId(PeerId peerId, MsgId msgId) {
109 		if (msgId) {
110 			_hiddenPinnedMessages[peerId] = msgId;
111 		} else {
112 			_hiddenPinnedMessages.remove(peerId);
113 		}
114 	}
115 
dialogsFiltersEnabled()116 	[[nodiscard]] bool dialogsFiltersEnabled() const {
117 		return _dialogsFiltersEnabled;
118 	}
setDialogsFiltersEnabled(bool value)119 	void setDialogsFiltersEnabled(bool value) {
120 		_dialogsFiltersEnabled = value;
121 	}
122 
123 	[[nodiscard]] bool photoEditorHintShown() const;
124 	void incrementPhotoEditorHintShown();
125 
126 private:
127 	static constexpr auto kDefaultSupportChatsLimitSlice = 7 * 24 * 60 * 60;
128 	static constexpr auto kPhotoEditorHintMaxShowsCount = 5;
129 
130 	ChatHelpers::SelectorTab _selectorTab; // per-window
131 	base::flat_set<PeerId> _groupStickersSectionHidden;
132 	bool _hadLegacyCallsPeerToPeerNobody = false;
133 	Data::AutoDownload::Full _autoDownload;
134 	rpl::variable<bool> _archiveCollapsed = false;
135 	rpl::variable<bool> _archiveInMainMenu = false;
136 	rpl::variable<bool> _skipArchiveInSearch = false;
137 	std::vector<std::pair<DocumentId, crl::time>> _mediaLastPlaybackPosition;
138 	base::flat_map<PeerId, MsgId> _hiddenPinnedMessages;
139 	bool _dialogsFiltersEnabled = false;
140 	int _photoEditorHintShowsCount = 0;
141 
142 	Support::SwitchSettings _supportSwitch;
143 	bool _supportFixChatsOrder = true;
144 	bool _supportTemplatesAutocomplete = true;
145 	bool _supportAllSilent = false;
146 	rpl::variable<int> _supportChatsTimeSlice
147 		= kDefaultSupportChatsLimitSlice;
148 	rpl::variable<bool> _supportAllSearchResults = false;
149 
150 };
151 
152 } // namespace Main
153