diff --git a/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp b/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp index 1d9050be2..c3b39bdf5 100644 --- a/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp +++ b/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp @@ -32,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "history/history.h" #include "main/main_session.h" +#include "main/main_account.h" #include "window/window_session_controller.h" #include "window/window_controller.h" #include "apiwrap.h" @@ -637,7 +638,8 @@ void EditFilterBox( name->setFocusFast(); }); - const auto isCurrent = filter.id() == cDefaultFilterId(); + const auto defaultFilterId = window->session().account().defaultFilterId(); + const auto isCurrent = filter.id() == defaultFilterId; const auto checkboxDefault = content->add( object_ptr( box, @@ -783,10 +785,11 @@ void EditExistingFilter( MTP_int(id), tl )).send(); - const auto isCurrentDefault = result.id() == cDefaultFilterId(); + const auto defaultFilterId = session->account().defaultFilterId(); + const auto isCurrentDefault = result.id() == defaultFilterId; if ((isCurrentDefault && !result.isDefault()) || (!isCurrentDefault && result.isDefault())) { - cSetDefaultFilterId(result.isDefault() ? result.id() : 0); + session->account().setDefaultFilterId(result.isDefault() ? result.id() : 0); Kotato::JsonSettings::Write(); } }; diff --git a/Telegram/SourceFiles/data/data_chat_filters.cpp b/Telegram/SourceFiles/data/data_chat_filters.cpp index 6c1abbbea..01a78c644 100644 --- a/Telegram/SourceFiles/data/data_chat_filters.cpp +++ b/Telegram/SourceFiles/data/data_chat_filters.cpp @@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "dialogs/dialogs_main_list.h" #include "ui/ui_utility.h" #include "main/main_session.h" +#include "main/main_account.h" #include "apiwrap.h" namespace Data { @@ -100,6 +101,7 @@ ChatFilter ChatFilter::FromTL( all.begin(), all.end() }; + const auto defaultFilterId = owner->session().account().defaultFilterId(); return ChatFilter( data.vid().v, qs(data.vtitle()), @@ -108,7 +110,7 @@ ChatFilter ChatFilter::FromTL( std::move(list), std::move(pinned), { never.begin(), never.end() }, - (data.vid().v == cDefaultFilterId())); + (data.vid().v == defaultFilterId)); }); } @@ -472,6 +474,7 @@ const ChatFilter &ChatFilters::applyUpdatedPinned( } } } + const auto defaultFilterId = _owner->session().account().defaultFilterId(); set(ChatFilter( id, i->title(), @@ -480,7 +483,7 @@ const ChatFilter &ChatFilters::applyUpdatedPinned( std::move(always), std::move(pinned), i->never(), - (id == cDefaultFilterId()))); + (id == defaultFilterId))); return *i; } diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index c1da80a65..0bf0906dd 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwindow.h" #include "mainwidget.h" #include "main/main_session.h" +#include "main/main_account.h" #include "main/main_session_settings.h" #include "apiwrap.h" #include "base/event_filter.h" @@ -696,10 +697,11 @@ void Widget::escape() { if (controller()->openedFolder().current()) { controller()->closeFolder(); } else if (!onCancelSearch()) { + const auto defaultFilterId = session().account().defaultFilterId(); if (controller()->activeChatEntryCurrent().key) { emit cancelled(); - } else if (controller()->activeChatsFilterCurrent() != cDefaultFilterId()) { - controller()->setActiveChatsFilter(cDefaultFilterId()); + } else if (controller()->activeChatsFilterCurrent() != defaultFilterId) { + controller()->setActiveChatsFilter(defaultFilterId); } } else if (!_searchInChat && !controller()->selectingPeer()) { if (controller()->activeChatEntryCurrent().key) { diff --git a/Telegram/SourceFiles/kotato/json_settings.cpp b/Telegram/SourceFiles/kotato/json_settings.cpp index d55976754..70566b4cf 100644 --- a/Telegram/SourceFiles/kotato/json_settings.cpp +++ b/Telegram/SourceFiles/kotato/json_settings.cpp @@ -137,6 +137,7 @@ QByteArray GenerateSettingsJson(bool areDefault = false) { auto settingsFonts = QJsonObject(); auto settingsFolders = QJsonObject(); + auto settingsFoldersDefault = QJsonObject(); auto settingsScales = QJsonArray(); auto settingsReplaces = QJsonArray(); @@ -173,6 +174,22 @@ QByteArray GenerateSettingsJson(bool areDefault = false) { a << i.key() << i.value(); settingsReplaces << a; } + + const auto defaultFilterIdMap = cDefaultFilterId(); + for (auto i = defaultFilterIdMap.constBegin(), e = defaultFilterIdMap.constEnd(); i != e; ++i) { + auto value = i.value(); + if (value == 0) { + continue; + } + + auto key = QString::number(std::abs(i.key())); + + if (i.key() < 0) { + key.prepend("test_"); + } + + settingsFoldersDefault.insert(key, value); + } } settings.insert(qsl("sticker_height"), StickerHeight()); @@ -199,7 +216,7 @@ QByteArray GenerateSettingsJson(bool areDefault = false) { settingsFonts.insert(qsl("use_system_font"), cUseSystemFont()); settingsFonts.insert(qsl("use_original_metrics"), cUseOriginalMetrics()); - settingsFolders.insert(qsl("default"), cDefaultFilterId()); + settingsFolders.insert(qsl("default"), settingsFoldersDefault); settingsFolders.insert(qsl("count_unmuted_only"), cUnmutedFilterCounterOnly()); settingsFolders.insert(qsl("hide_edit_button"), cHideFilterEditButton()); settingsFolders.insert(qsl("hide_names"), cHideFilterNames()); @@ -443,10 +460,38 @@ bool Manager::readCustomFile() { }); ReadObjectOption(settings, "folders", [&](auto o) { - ReadIntOption(o, "default", [&](auto v) { - cSetDefaultFilterId(v); + auto isDefaultFilterRead = ReadIntOption(o, "default", [&](auto v) { + SetDefaultFilterId(0, v); }); + if (!isDefaultFilterRead) { + ReadObjectOption(o, "default", [&](auto f) { + if (f.empty()) { + return; + } + bool isInt; + + for (auto i = f.begin(), e = f.end(); i != e; ++i) { + auto value = i.value().toInt(0); + + if (value == 0) { + continue; + } + + auto key = i.key(); + if (key.startsWith("test_")) { + key = key.mid(5).prepend("-"); + } + + auto account_id = key.toInt(&isInt, 10); + + if (isInt) { + SetDefaultFilterId(account_id, value); + } + } + }); + } + ReadBoolOption(o, "count_unmuted_only", [&](auto v) { cSetUnmutedFilterCounterOnly(v); }); diff --git a/Telegram/SourceFiles/kotato/settings.cpp b/Telegram/SourceFiles/kotato/settings.cpp index fd54eafdc..69796a45a 100644 --- a/Telegram/SourceFiles/kotato/settings.cpp +++ b/Telegram/SourceFiles/kotato/settings.cpp @@ -149,7 +149,26 @@ bool gDisableTrayCounter = false; bool gUseTelegramPanelIcon = false; int gCustomAppIcon = 0; -int gDefaultFilterId = 0; +DefaultFilterMap gDefaultFilterId; +void SetDefaultFilterId(int account, int filter) { + if (gDefaultFilterId.contains(account)) { + gDefaultFilterId[account] = filter; + } else { + gDefaultFilterId.insert(account, filter); + } +} +int DefaultFilterId(int account) { + if (gDefaultFilterId.contains(account)) { + return gDefaultFilterId[account]; + } + return 0; +} +bool HasDefaultFilterId(int account) { + return gDefaultFilterId.contains(account); +} +bool ClearDefaultFilterId(int account) { + return gDefaultFilterId.remove(account); +} bool gUnmutedFilterCounterOnly = false; bool gHideFilterEditButton = false; bool gHideFilterNames = false; diff --git a/Telegram/SourceFiles/kotato/settings.h b/Telegram/SourceFiles/kotato/settings.h index 0011b8156..71b9db212 100644 --- a/Telegram/SourceFiles/kotato/settings.h +++ b/Telegram/SourceFiles/kotato/settings.h @@ -105,7 +105,12 @@ DeclareSetting(bool, DisableTrayCounter); DeclareSetting(bool, UseTelegramPanelIcon); DeclareSetting(int, CustomAppIcon); -DeclareSetting(int, DefaultFilterId); +using DefaultFilterMap = QMap; +DeclareRefSetting(DefaultFilterMap, DefaultFilterId); +void SetDefaultFilterId(int account, int filter); +int DefaultFilterId(int account); +bool HasDefaultFilterId(int account); +bool ClearDefaultFilterId(int account); DeclareSetting(bool, UnmutedFilterCounterOnly); DeclareSetting(bool, HideFilterEditButton); DeclareSetting(bool, HideFilterNames); diff --git a/Telegram/SourceFiles/main/main_account.cpp b/Telegram/SourceFiles/main/main_account.cpp index a4b2eb8fb..1492a7809 100644 --- a/Telegram/SourceFiles/main/main_account.cpp +++ b/Telegram/SourceFiles/main/main_account.cpp @@ -30,6 +30,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session.h" #include "main/main_domain.h" #include "main/main_session_settings.h" +#include "kotato/json_settings.h" #include "facades.h" namespace Main { @@ -188,6 +189,19 @@ void Account::createSession( _sessionValue = _session.get(); Ensures(_session != nullptr); + + const auto defaultFilterUserId = _mtp->isTestMode() + ? -session().userId() + : session().userId(); + + if (HasDefaultFilterId(0)) { + const auto newDefaultFilterId = DefaultFilterId(0); + ClearDefaultFilterId(0); + setDefaultFilterId(newDefaultFilterId); + Kotato::JsonSettings::Write(); + } else { + _defaultFilterId = DefaultFilterId(defaultFilterUserId); + } } void Account::destroySession(DestroyReason reason) { @@ -577,6 +591,22 @@ void Account::destroyStaleAuthorizationKeys() { } } +void Account::setDefaultFilterId(int id) { + Expects(_mtp != nullptr); + Expects(_session != nullptr); + + _defaultFilterId = id; + const auto defaultFilterUserId = _mtp->isTestMode() + ? -session().userId() + : session().userId(); + + if (id == 0) { + ClearDefaultFilterId(defaultFilterUserId); + } else { + SetDefaultFilterId(defaultFilterUserId, id); + } +} + void Account::resetAuthorizationKeys() { Expects(_mtp != nullptr); diff --git a/Telegram/SourceFiles/main/main_account.h b/Telegram/SourceFiles/main/main_account.h index 8c14b1793..2ac6252e1 100644 --- a/Telegram/SourceFiles/main/main_account.h +++ b/Telegram/SourceFiles/main/main_account.h @@ -107,6 +107,11 @@ public: return _lifetime; } + [[nodiscard]] int defaultFilterId() { + return _defaultFilterId; + } + void setDefaultFilterId(int id); + private: static constexpr auto kDefaultSaveDelay = crl::time(1000); enum class DestroyReason { @@ -152,6 +157,7 @@ private: MTP::Instance::Fields _mtpFields; MTP::AuthKeysList _mtpKeysToDestroy; bool _loggingOut = false; + int _defaultFilterId = 0; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/settings/settings_folders.cpp b/Telegram/SourceFiles/settings/settings_folders.cpp index 33cec1c61..2f4862231 100644 --- a/Telegram/SourceFiles/settings/settings_folders.cpp +++ b/Telegram/SourceFiles/settings/settings_folders.cpp @@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_chat_filters.h" #include "history/history.h" #include "main/main_session.h" +#include "main/main_account.h" #include "window/window_session_controller.h" #include "window/window_controller.h" #include "ui/layers/generic_box.h" @@ -312,11 +313,13 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { not_null controller, not_null container) { auto &lifetime = container->lifetime(); - const auto currentDefaultId = cDefaultFilterId(); + + const auto session = &controller->session(); + const auto account = &session->account(); + const auto currentDefaultId = account->defaultFilterId(); localNewFilterId = kFiltersLimit; currentDefaultRemoved = false; - const auto session = &controller->session(); AddSkip(container, st::settingsSectionSkip); AddSubsectionTitle(container, tr::lng_filters_subtitle()); @@ -343,7 +346,7 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { button->removeRequests( ) | rpl::start_with_next([=] { button->setRemoved(true); - if (find(button)->filter.id() == cDefaultFilterId()) { + if (find(button)->filter.id() == account->defaultFilterId()) { currentDefaultRemoved = true; } find(button)->removed = true; @@ -353,7 +356,7 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { if (showLimitReached()) { return; } - if (find(button)->filter.id() == cDefaultFilterId()) { + if (find(button)->filter.id() == account->defaultFilterId()) { currentDefaultRemoved = false; } button->setRemoved(false); @@ -366,10 +369,10 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { } const auto doneCallback = [=](const Data::ChatFilter &result) { find(button)->filter = result; - const auto isCurrentDefault = result.id() == cDefaultFilterId(); + const auto isCurrentDefault = result.id() == account->defaultFilterId(); if ((isCurrentDefault && !result.isDefault()) || (!isCurrentDefault && result.isDefault())) { - cSetDefaultFilterId(result.isDefault() ? result.id() : 0); + account->setDefaultFilterId(result.isDefault() ? result.id() : 0); } button->updateData(result); }; @@ -432,7 +435,7 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { } const auto doneCallback = [=](const Data::ChatFilter &result) { if (result.isDefault()) { - cSetDefaultFilterId(result.id()); + account->setDefaultFilterId(result.id()); } addFilter(result); }; @@ -528,8 +531,8 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { continue; } else if (!ranges::contains(list, id, &Data::ChatFilter::id)) { result.emplace(row.button, chooseNextId()); - if (cDefaultFilterId() == id) { - cSetDefaultFilterId(localId); + if (account->defaultFilterId() == id) { + account->setDefaultFilterId(localId); } } } @@ -589,10 +592,10 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { realFilters.saveOrder(order, previousId); } if (currentDefaultRemoved) { - cSetDefaultFilterId(0); + account->setDefaultFilterId(0); controller->setActiveChatsFilter(0); } - if (currentDefaultId != cDefaultFilterId()) { + if (currentDefaultId != account->defaultFilterId()) { Kotato::JsonSettings::Write(); } }; diff --git a/Telegram/SourceFiles/window/window_controller.cpp b/Telegram/SourceFiles/window/window_controller.cpp index 586868027..fce4b134d 100644 --- a/Telegram/SourceFiles/window/window_controller.cpp +++ b/Telegram/SourceFiles/window/window_controller.cpp @@ -23,6 +23,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/emoji_config.h" #include "chat_helpers/emoji_sets_manager.h" #include "window/window_session_controller.h" +#include "window/window_filters_menu.h" #include "window/themes/window_theme.h" #include "window/themes/window_theme_editor.h" #include "boxes/confirm_box.h" @@ -68,6 +69,7 @@ void Controller::showAccount(not_null account) { }, session->lifetime()); } if (session && session->settings().dialogsFiltersEnabled()) { + ResetFiltersFirstLoad(); _sessionController->toggleFiltersMenu(true); } else { sideBarChanged(); diff --git a/Telegram/SourceFiles/window/window_filters_menu.cpp b/Telegram/SourceFiles/window/window_filters_menu.cpp index 418d64f46..0d13cd064 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.cpp +++ b/Telegram/SourceFiles/window/window_filters_menu.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_session_controller.h" #include "window/window_controller.h" #include "main/main_session.h" +#include "main/main_account.h" #include "data/data_session.h" #include "data/data_chat_filters.h" #include "data/data_folder.h" @@ -61,6 +62,10 @@ bool FiltersFirstLoad = true; } // namespace +void ResetFiltersFirstLoad() { + FiltersFirstLoad = true; +} + FiltersMenu::FiltersMenu( not_null parent, not_null session) @@ -101,6 +106,7 @@ void FiltersMenu::setup() { }, _outer.lifetime()); const auto filters = &_session->session().data().chatsFilters(); + _activeFilterId = _session->activeChatsFilterCurrent(); rpl::single( rpl::empty_value() ) | rpl::then( @@ -109,7 +115,6 @@ void FiltersMenu::setup() { refresh(); }, _outer.lifetime()); - _activeFilterId = _session->activeChatsFilterCurrent(); _session->activeChatsFilter( ) | rpl::filter([=](FilterId id) { return id != _activeFilterId; @@ -200,7 +205,7 @@ void FiltersMenu::refresh() { } if (FiltersFirstLoad) { - _session->setActiveChatsFilter(cDefaultFilterId()); + _session->setActiveChatsFilter(_session->session().account().defaultFilterId()); FiltersFirstLoad = false; } } @@ -321,11 +326,12 @@ void FiltersMenu::showMenu(QPoint position, FilterId id) { if (i == end(_filters)) { return; } + const auto defaultFilterId = _session->session().account().defaultFilterId(); _popupMenu = base::make_unique_q(i->second.get()); _popupMenu->addAction( tr::lng_filters_context_edit(tr::now), crl::guard(&_outer, [=] { showEditBox(id); })); - if (cDefaultFilterId() != id) { + if (defaultFilterId != id) { _popupMenu->addAction( tr::ktg_filters_context_make_default(tr::now), crl::guard(&_outer, [=] { setDefaultFilter(id); })); @@ -345,11 +351,12 @@ void FiltersMenu::showAllMenu(QPoint position) { _popupMenu = nullptr; return; } + const auto defaultFilterId = _session->session().account().defaultFilterId(); _popupMenu = base::make_unique_q(_all); _popupMenu->addAction( tr::ktg_filters_context_edit_all(tr::now), crl::guard(&_outer, [=] { _session->showSettings(Settings::Type::Folders); })); - if (cDefaultFilterId() != 0) { + if (defaultFilterId != 0) { _popupMenu->addAction( tr::ktg_filters_context_make_default(tr::now), crl::guard(&_outer, [=] { setDefaultFilter(0); })); @@ -359,8 +366,9 @@ void FiltersMenu::showAllMenu(QPoint position) { } void FiltersMenu::setDefaultFilter(FilterId id) { - if (cDefaultFilterId() != id) { - cSetDefaultFilterId(id); + const auto defaultFilterId = _session->session().account().defaultFilterId(); + if (defaultFilterId != id) { + _session->session().account().setDefaultFilterId(id); Kotato::JsonSettings::Write(); } } @@ -378,6 +386,7 @@ void FiltersMenu::showRemoveBox(FilterId id) { } void FiltersMenu::remove(FilterId id) { + const auto defaultFilterId = _session->session().account().defaultFilterId(); _session->session().data().chatsFilters().apply(MTP_updateDialogFilter( MTP_flags(MTPDupdateDialogFilter::Flag(0)), MTP_int(id), @@ -387,8 +396,8 @@ void FiltersMenu::remove(FilterId id) { MTP_int(id), MTPDialogFilter() )).send(); - if (id == cDefaultFilterId()) { - cSetDefaultFilterId(0); + if (id == defaultFilterId) { + _session->session().account().setDefaultFilterId(0); Kotato::JsonSettings::Write(); if (id == _session->activeChatsFilterCurrent()) { _session->setActiveChatsFilter(0); diff --git a/Telegram/SourceFiles/window/window_filters_menu.h b/Telegram/SourceFiles/window/window_filters_menu.h index f89bf2bea..88bc42f49 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.h +++ b/Telegram/SourceFiles/window/window_filters_menu.h @@ -26,6 +26,8 @@ namespace Window { class SessionController; +void ResetFiltersFirstLoad(); + class FiltersMenu final { public: FiltersMenu( diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index cccb73f83..5eff2b9d8 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -39,6 +39,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwidget.h" #include "mainwindow.h" #include "main/main_session.h" +#include "main/main_account.h" #include "main/main_session_settings.h" #include "apiwrap.h" #include "support/support_helper.h" @@ -290,8 +291,9 @@ void SessionController::checkOpenedFilter() { const auto &list = session().data().chatsFilters().list(); const auto i = ranges::find(list, filterId, &Data::ChatFilter::id); if (i == end(list)) { - const auto j = ranges::find(list, FilterId(cDefaultFilterId()), &Data::ChatFilter::id); - setActiveChatsFilter(j == end(list) ? 0 : cDefaultFilterId()); + const auto defaultFilterId = session().account().defaultFilterId(); + const auto j = ranges::find(list, FilterId(defaultFilterId), &Data::ChatFilter::id); + setActiveChatsFilter(j == end(list) ? 0 : defaultFilterId); } } } @@ -311,10 +313,11 @@ void SessionController::openFolder(not_null folder) { } void SessionController::closeFolder(bool force) { - if (cDefaultFilterId() == 0 || force) { + const auto defaultFilterId = session().account().defaultFilterId(); + if (defaultFilterId == 0 || force) { _openedFolder = nullptr; } else { - setActiveChatsFilter(cDefaultFilterId()); + setActiveChatsFilter(defaultFilterId); checkOpenedFilter(); } }