diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 612f3024c..10a57e408 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2460,4 +2460,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "ktg_settings_recent_stickers_limit#other" = "Recent stickers: show {count} stickers"; "ktg_settings_recent_stickers_limit_none" = "Recent stickers: hide all"; +"ktg_filters_default" = "Default folder"; + // Keys finished diff --git a/Telegram/Resources/langs/rewrites/ru.json b/Telegram/Resources/langs/rewrites/ru.json index 09ab40c1a..7575b175f 100644 --- a/Telegram/Resources/langs/rewrites/ru.json +++ b/Telegram/Resources/langs/rewrites/ru.json @@ -97,5 +97,6 @@ "many": "Недавние стикеры: показывать {count} стикеров", "other": "Недавние стикеры: показывать {count} стикеров" }, - "ktg_settings_recent_stickers_limit_none": "Недавние стикеры: скрыть все" + "ktg_settings_recent_stickers_limit_none": "Недавние стикеры: скрыть все", + "ktg_filters_default": "Папка по умолчанию" } diff --git a/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp b/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp index f18f53c34..0955fd11d 100644 --- a/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp +++ b/Telegram/SourceFiles/boxes/filters/edit_filter_box.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/emoji_suggestions_widget.h" #include "ui/layers/generic_box.h" #include "ui/text/text_utilities.h" +#include "ui/widgets/checkbox.h" #include "ui/widgets/buttons.h" #include "ui/widgets/input_fields.h" #include "ui/effects/panel_animation.h" @@ -19,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_chat_filters.h" #include "data/data_peer.h" #include "data/data_session.h" +#include "core/kotato_settings.h" #include "settings/settings_common.h" #include "base/event_filter.h" #include "lang/lang_keys.h" @@ -539,6 +541,19 @@ void EditFilterBox( name->setFocusFast(); }); + const auto isCurrent = filter.id() == cDefaultFilterId(); + const auto checkboxDefault = content->add( + object_ptr( + box, + tr::ktg_filters_default(tr::now), + (creating ? false : isCurrent), + st::defaultBoxCheckbox), + style::margins( + st::boxPadding.left(), + st::boxPadding.bottom(), + st::boxPadding.right(), + st::boxPadding.bottom())); + AddSkip(content); AddDivider(content); AddSkip(content); @@ -618,6 +633,7 @@ void EditFilterBox( const auto save = [=] { const auto title = name->getLastText().trimmed(); const auto rules = data->current(); + const auto checked = checkboxDefault && checkboxDefault->checked(); const auto result = Data::ChatFilter( rules.id(), title, @@ -625,7 +641,8 @@ void EditFilterBox( rules.flags(), rules.always(), rules.pinned(), - rules.never()); + rules.never(), + checked); if (title.isEmpty()) { name->showError(); return; @@ -670,6 +687,12 @@ void EditExistingFilter( MTP_int(id), tl )).send(); + const auto isCurrentDefault = result.id() == cDefaultFilterId(); + if ((isCurrentDefault && !result.isDefault()) + || (!isCurrentDefault && result.isDefault())) { + cSetDefaultFilterId(result.isDefault() ? result.id() : 0); + KotatoSettings::Write(); + } }; window->window().show(Box( EditFilterBox, diff --git a/Telegram/SourceFiles/data/data_chat_filters.cpp b/Telegram/SourceFiles/data/data_chat_filters.cpp index b8ed5ac08..ad9606429 100644 --- a/Telegram/SourceFiles/data/data_chat_filters.cpp +++ b/Telegram/SourceFiles/data/data_chat_filters.cpp @@ -29,6 +29,9 @@ constexpr auto kLoadExceptionsPerRequest = 100; } // namespace +ChatFilter::ChatFilter(FilterId id) : _id(id) { +} + ChatFilter::ChatFilter( FilterId id, const QString &title, @@ -36,14 +39,16 @@ ChatFilter::ChatFilter( Flags flags, base::flat_set> always, std::vector> pinned, - base::flat_set> never) + base::flat_set> never, + bool isDefault) : _id(id) , _title(title) , _iconEmoji(iconEmoji) , _always(std::move(always)) , _pinned(std::move(pinned)) , _never(std::move(never)) -, _flags(flags) { +, _flags(flags) +, _isDefault(isDefault) { } ChatFilter ChatFilter::FromTL( @@ -102,7 +107,8 @@ ChatFilter ChatFilter::FromTL( flags, std::move(list), std::move(pinned), - { never.begin(), never.end() }); + { never.begin(), never.end() }, + (data.vid().v == cDefaultFilterId())); }); } @@ -154,6 +160,10 @@ QString ChatFilter::title() const { return _title; } +bool ChatFilter::isDefault() const { + return _isDefault; +} + QString ChatFilter::iconEmoji() const { return _iconEmoji; } @@ -465,7 +475,8 @@ const ChatFilter &ChatFilters::applyUpdatedPinned( i->flags(), std::move(always), std::move(pinned), - i->never())); + i->never(), + (id == cDefaultFilterId()))); return *i; } diff --git a/Telegram/SourceFiles/data/data_chat_filters.h b/Telegram/SourceFiles/data/data_chat_filters.h index 7ad560857..fa591c16e 100644 --- a/Telegram/SourceFiles/data/data_chat_filters.h +++ b/Telegram/SourceFiles/data/data_chat_filters.h @@ -38,6 +38,7 @@ public: static constexpr int kPinnedLimit = 100; ChatFilter() = default; + ChatFilter(FilterId id); ChatFilter( FilterId id, const QString &title, @@ -45,7 +46,8 @@ public: Flags flags, base::flat_set> always, std::vector> pinned, - base::flat_set> never); + base::flat_set> never, + bool isDefault = false); [[nodiscard]] static ChatFilter FromTL( const MTPDialogFilter &data, @@ -54,6 +56,7 @@ public: [[nodiscard]] FilterId id() const; [[nodiscard]] QString title() const; + [[nodiscard]] bool isDefault() const; [[nodiscard]] QString iconEmoji() const; [[nodiscard]] Flags flags() const; [[nodiscard]] const base::flat_set> &always() const; @@ -70,6 +73,7 @@ private: std::vector> _pinned; base::flat_set> _never; Flags _flags; + bool _isDefault = false; }; diff --git a/Telegram/SourceFiles/settings/settings_folders.cpp b/Telegram/SourceFiles/settings/settings_folders.cpp index 9331f89a7..5fc492243 100644 --- a/Telegram/SourceFiles/settings/settings_folders.cpp +++ b/Telegram/SourceFiles/settings/settings_folders.cpp @@ -24,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/slide_wrap.h" #include "ui/painter.h" #include "ui/filter_icons.h" +#include "core/kotato_settings.h" #include "settings/settings_common.h" #include "lang/lang_keys.h" #include "apiwrap.h" @@ -39,6 +40,8 @@ namespace { constexpr auto kRefreshSuggestedTimeout = 7200 * crl::time(1000); constexpr auto kFiltersLimit = 10; +auto currentDefaultRemoved = false; +auto localNewFilterId = kFiltersLimit; using Flag = Data::ChatFilter::Flag; using Flags = Data::ChatFilter::Flags; @@ -309,6 +312,9 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { not_null controller, not_null container) { auto &lifetime = container->lifetime(); + const auto currentDefaultId = cDefaultFilterId(); + localNewFilterId = kFiltersLimit; + currentDefaultRemoved = false; const auto session = &controller->session(); AddSkip(container, st::settingsSectionSkip); @@ -337,6 +343,9 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { button->removeRequests( ) | rpl::start_with_next([=] { button->setRemoved(true); + if (find(button)->filter.id() == cDefaultFilterId()) { + currentDefaultRemoved = true; + } find(button)->removed = true; }, button->lifetime()); button->restoreRequests( @@ -344,6 +353,9 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { if (showLimitReached()) { return; } + if (find(button)->filter.id() == cDefaultFilterId()) { + currentDefaultRemoved = false; + } button->setRemoved(false); find(button)->removed = false; }, button->lifetime()); @@ -354,6 +366,11 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { } const auto doneCallback = [=](const Data::ChatFilter &result) { find(button)->filter = result; + const auto isCurrentDefault = result.id() == cDefaultFilterId(); + if ((isCurrentDefault && !result.isDefault()) + || (!isCurrentDefault && result.isDefault())) { + cSetDefaultFilterId(result.isDefault() ? result.id() : 0); + } button->updateData(result); }; controller->window().show(Box( @@ -414,12 +431,15 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { return; } const auto doneCallback = [=](const Data::ChatFilter &result) { + if (result.isDefault()) { + cSetDefaultFilterId(result.id()); + } addFilter(result); }; controller->window().show(Box( EditFilterBox, controller, - Data::ChatFilter(), + Data::ChatFilter(++localNewFilterId), crl::guard(container, doneCallback))); }); AddSkip(container); @@ -508,6 +528,9 @@ 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); + } } } return result; @@ -565,6 +588,13 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { if (!order.empty() && !addRequests.empty()) { realFilters.saveOrder(order, previousId); } + if (currentDefaultRemoved) { + cSetDefaultFilterId(0); + controller->setActiveChatsFilter(0); + } + if (currentDefaultId != cDefaultFilterId()) { + KotatoSettings::Write(); + } }; } diff --git a/Telegram/SourceFiles/window/window_filters_menu.cpp b/Telegram/SourceFiles/window/window_filters_menu.cpp index 05510ee64..ef562932a 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.cpp +++ b/Telegram/SourceFiles/window/window_filters_menu.cpp @@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/popup_menu.h" #include "boxes/confirm_box.h" #include "boxes/filters/edit_filter_box.h" +#include "core/kotato_settings.h" #include "settings/settings_common.h" #include "api/api_chat_filters.h" #include "apiwrap.h" @@ -292,6 +293,13 @@ void FiltersMenu::remove(FilterId id) { MTP_int(id), MTPDialogFilter() )).send(); + if (id == cDefaultFilterId()) { + cSetDefaultFilterId(0); + KotatoSettings::Write(); + if (id == _session->activeChatsFilterCurrent()) { + _session->setActiveChatsFilter(0); + } + } } void FiltersMenu::applyReorder(