From 9034c9a2c2147aa577d094dee6029697cd09122f Mon Sep 17 00:00:00 2001 From: AlexeyZavar Date: Sat, 25 Apr 2026 22:13:56 +0300 Subject: [PATCH] feat: show / hide filtered messages & move actions into separate subsection --- .../filters/filters_cache_controller.cpp | 14 ++++ .../filters/filters_cache_controller.h | 1 + .../features/filters/filters_controller.cpp | 25 ++++++ .../ayu/features/filters/filters_controller.h | 3 + Telegram/SourceFiles/ayu/ui/ayu_icons.style | 2 + .../ayu/ui/context_menu/context_menu.cpp | 83 +++++++++++++++---- .../ayu/ui/context_menu/context_menu.h | 2 +- .../ayu/ui/settings/filters/edit_filter.cpp | 4 +- .../SourceFiles/info/info_wrap_widget.cpp | 6 +- .../SourceFiles/window/window_peer_menu.cpp | 4 +- 10 files changed, 120 insertions(+), 24 deletions(-) diff --git a/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.cpp b/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.cpp index ef93014630..cb4e5a197b 100644 --- a/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.cpp +++ b/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.cpp @@ -111,6 +111,20 @@ std::optional isFiltered(not_null item) { return it->second; } +bool hasFilteredMessages(not_null peer) { + std::lock_guard lock(mutex); + const auto dialogIt = filteredMessages.find(peer->id.value); + if (dialogIt == filteredMessages.end()) { + return false; + } + for (const auto &entry : dialogIt->second) { + if (entry.second == true) { + return true; + } + } + return false; +} + void putFiltered(not_null item, const Data::Group *group, bool res) { std::lock_guard lock(mutex); filteredMessages[item->history()->peer->id.value][item->id.bare] = res; diff --git a/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.h b/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.h index f4c614ee1a..0ce1d13f0e 100644 --- a/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.h +++ b/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.h @@ -28,6 +28,7 @@ std::unordered_map const std::vector &shared); std::optional isFiltered(not_null item); +bool hasFilteredMessages(not_null peer); void putFiltered(not_null item, const Data::Group *group, bool res); void invalidate(not_null item); diff --git a/Telegram/SourceFiles/ayu/features/filters/filters_controller.cpp b/Telegram/SourceFiles/ayu/features/filters/filters_controller.cpp index abd31943de..7f7a2e008d 100644 --- a/Telegram/SourceFiles/ayu/features/filters/filters_controller.cpp +++ b/Telegram/SourceFiles/ayu/features/filters/filters_controller.cpp @@ -20,8 +20,12 @@ #include "history/history_item_components.h" #include "unicode/regex.h" +#include + namespace FiltersController { +std::unordered_set showingFilteredMessages; + bool filterBlocked(const not_null item) { if (item->from() != item->history()->peer) { if (isBlocked(item)) { @@ -123,6 +127,10 @@ bool isBlocked(const not_null peer) { } bool filtered(const not_null item) { + if (showingFilteredMessages.contains(item->history()->peer->id.value)) { + return false; + } + const auto &settings = AyuSettings::getInstance(); if (!settings.filtersEnabled()) { return false; @@ -153,6 +161,23 @@ bool filtered(const not_null item) { return false; } +std::optional filteredMessagesShown(not_null peer) { + if (!showingFilteredMessages.contains(peer->id.value) + && !FiltersCacheController::hasFilteredMessages(peer)) { + return std::nullopt; + } + return showingFilteredMessages.contains(peer->id.value); +} + +void toggleFilteredMessagesShown(not_null peer) { + if (showingFilteredMessages.contains(peer->id.value)) { + showingFilteredMessages.erase(peer->id.value); + } else { + showingFilteredMessages.insert(peer->id.value); + } + FiltersCacheController::fireUpdate(); +} + void invalidate(not_null item) { const auto &settings = AyuSettings::getInstance(); if (!settings.filtersEnabled()) { diff --git a/Telegram/SourceFiles/ayu/features/filters/filters_controller.h b/Telegram/SourceFiles/ayu/features/filters/filters_controller.h index 810dda3137..09fadc3d18 100644 --- a/Telegram/SourceFiles/ayu/features/filters/filters_controller.h +++ b/Telegram/SourceFiles/ayu/features/filters/filters_controller.h @@ -8,6 +8,7 @@ #include "unicode/regex.h" +#include #include #include @@ -19,6 +20,8 @@ bool isEnabled(PeerData *peer); bool isBlocked(not_null item); bool isBlocked(not_null peer); bool filtered(not_null historyItem); +std::optional filteredMessagesShown(not_null peer); +void toggleFilteredMessagesShown(not_null peer); void invalidate(not_null item); diff --git a/Telegram/SourceFiles/ayu/ui/ayu_icons.style b/Telegram/SourceFiles/ayu/ui/ayu_icons.style index 075437bbb1..63434952d2 100644 --- a/Telegram/SourceFiles/ayu/ui/ayu_icons.style +++ b/Telegram/SourceFiles/ayu/ui/ayu_icons.style @@ -77,3 +77,5 @@ ayuHistoryFileInPlugin: icon {{ "ayu/history_file_plugin", historyFileInIconFg } ayuHistoryFileInPluginSelected: icon {{ "ayu/history_file_plugin", historyFileInIconFgSelected }}; ayuHistoryFileOutPlugin: icon {{ "ayu/history_file_plugin", historyFileOutIconFg }}; ayuHistoryFileOutPluginSelected: icon {{ "ayu/history_file_plugin", historyFileOutIconFgSelected }}; + +menuIconClearAttention: icon {{ "menu/clear", menuIconAttentionColor }}; diff --git a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp index b1606758e9..b712364359 100644 --- a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp +++ b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp @@ -13,10 +13,12 @@ #include "ayu/ayu_settings.h" #include "ayu/ayu_state.h" #include "ayu/data/messages_storage.h" +#include "ayu/features/filters/filters_controller.h" #include "ayu/features/forward/ayu_forward.h" #include "ayu/ui/context_menu/menu_item_subtext.h" #include "ayu/ui/message_history/history_section.h" #include "ayu/ui/settings/filters/edit_filter.h" +#include "ayu/ui/settings/filters/settings_filters_list.h" #include "ayu/utils/qt_key_modifiers_extended.h" #include "ayu/utils/telegram_helpers.h" #include "base/call_delayed.h" @@ -215,7 +217,7 @@ bool needToShowItem(ContextMenuVisibility state) { || (state == ContextMenuVisibility::VisibleWithModifier && base::IsExtendedContextMenuModifierPressed()); } -void AddDeletedMessagesActions(PeerData *peerData, +void AddAyuGramActions(PeerData *peerData, Data::Thread *thread, not_null sessionController, const Window::PeerMenuCallback &addCallback) { @@ -223,27 +225,72 @@ void AddDeletedMessagesActions(PeerData *peerData, return; } + const auto &settings = AyuSettings::getInstance(); + const auto user = peerData->asUser(); + const auto showFilters = settings.filtersEnabled() + && (!user || user->isBot()); + const auto saveDeletedMessages = settings.saveDeletedMessages(); + if (!showFilters && !saveDeletedMessages) { + return; + } + const auto topic = peerData->isForum() ? thread->asTopic() : nullptr; const auto topicId = topic ? topic->rootId().bare : 0; - // const auto has = AyuMessages::hasDeletedMessages(peerData, topicId); - // if (!has) { - // return; - // } - - addCallback( - tr::ayu_ViewDeletedMenuText(tr::now), - [=] - { - sessionController->session().tryResolveWindow() - ->showSection(std::make_shared(peerData, nullptr, topicId)); + addCallback(Window::PeerMenuCallback::Args{ + .text = u"AyuGram"_q, + .handler = nullptr, + .icon = &st::menuIconGroupReactions, + .fillSubmenu = [=](not_null menu) { + const auto addAction = Ui::Menu::CreateAddActionCallback(menu); + if (showFilters) { + addAction( + tr::ayu_ViewFiltersMenuText(tr::now), + [=] + { + sessionController->dialogId = getDialogIdFromPeer(peerData); + sessionController->showExclude = true; + sessionController->shadowBan = false; + sessionController->showSettings(Settings::AyuFiltersList::Id()); + }, + &st::menuIconAddToFolder); + } + const auto filteredToggleShown = FiltersController::filteredMessagesShown(peerData); + if (filteredToggleShown) { + addAction( + *filteredToggleShown + ? tr::ayu_HideFilteredMessagesMenuText(tr::now) + : tr::ayu_ShowFilteredMessagesMenuText(tr::now), + [=] + { + FiltersController::toggleFilteredMessagesShown(peerData); + }, + *filteredToggleShown + ? &st::menuIconCaptionHide + : &st::menuIconCaptionShow); + } + if (saveDeletedMessages) { + addAction( + tr::ayu_ViewDeletedMenuText(tr::now), + [=] + { + sessionController->session().tryResolveWindow() + ->showSection(std::make_shared( + peerData, + nullptr, + topicId)); + }, + &st::menuIconArchive); + if (showFilters || filteredToggleShown.value_or(false)) addAction({ .isSeparator = true }); + addAction({ + .text = tr::ayu_ClearDeletedMenuText(tr::now), + .handler = ClearDeletedMessagesHandler(sessionController, peerData, topicId), + .icon = &st::menuIconClearAttention, + .isAttention = true, + }); + } }, - &st::menuIconArchive); - addCallback( - tr::ayu_ClearDeletedMenuText(tr::now), - ClearDeletedMessagesHandler(sessionController, peerData, topicId), - &st::menuIconDelete); - // todo view filters + }); } void AddJumpToBeginningAction(PeerData *peerData, diff --git a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h index 79e40d3058..02133dda30 100644 --- a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h +++ b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h @@ -21,7 +21,7 @@ namespace AyuUi { bool needToShowItem(ContextMenuVisibility state); -void AddDeletedMessagesActions(PeerData *peerData, +void AddAyuGramActions(PeerData *peerData, Data::Thread *thread, not_null sessionController, const Window::PeerMenuCallback &addCallback); diff --git a/Telegram/SourceFiles/ayu/ui/settings/filters/edit_filter.cpp b/Telegram/SourceFiles/ayu/ui/settings/filters/edit_filter.cpp index fb41e33a3f..236b57de3a 100644 --- a/Telegram/SourceFiles/ayu/ui/settings/filters/edit_filter.cpp +++ b/Telegram/SourceFiles/ayu/ui/settings/filters/edit_filter.cpp @@ -134,10 +134,12 @@ void RegexEditBuilder( RegexFilter data; if (filter) { - box->setTitle(tr::ayu_RegexFiltersEdit()); + box->setTitle(showToast ? tr::ayu_RegexFiltersAdd() : tr::ayu_RegexFiltersEdit()); data = *filter; } else { box->setTitle(tr::ayu_RegexFiltersAdd()); + data.enabled = true; + data.caseInsensitive = true; data.reversed = false; } diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index 801b2934b4..17d0d8fd3f 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -795,9 +795,11 @@ void WrapWidget::finishShowContent() { std::vector> stack; stack.push_back(std::move(contentMemento)); const auto sectionMemento = std::make_shared(std::move(stack)); + const auto params = Window::SectionShow( + Window::SectionShow::Way::Backward, + anim::type::instant); - showBackFromStackInternal(Window::SectionShow(anim::type::instant)); - showInternal(sectionMemento.get(), Window::SectionShow(anim::type::instant)); + showInternal(sectionMemento.get(), params); }, _content->lifetime()); } diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index caaf6c482d..b2d30e29c9 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -1766,6 +1766,7 @@ void Filler::fillContextMenuActions() { void Filler::fillHistoryActions() { addToggleMuteSubmenu(true); + AyuUi::AddAyuGramActions(_peer, _thread, _controller, _addAction); addCreateTopic(); addInfo(); AyuUi::AddJumpToBeginningAction(_peer, _thread, _controller, _addAction); @@ -1784,7 +1785,6 @@ void Filler::fillHistoryActions() { addExportChat(); addTranslate(); addReport(); - AyuUi::AddDeletedMessagesActions(_peer, _thread, _controller, _addAction); addClearHistory(); AyuUi::AddDeleteOwnMessagesAction(_peer, _topic, _controller, _addAction); addDeleteChat(); @@ -1822,6 +1822,7 @@ void Filler::fillProfileActions() { } void Filler::fillRepliesActions() { + AyuUi::AddAyuGramActions(_peer, _thread, _controller, _addAction); if (_topic) { addInfo(); AyuUi::AddJumpToBeginningAction(_peer, _thread, _controller, _addAction); @@ -1832,7 +1833,6 @@ void Filler::fillRepliesActions() { addCreateTodoList(); addToggleTopicClosed(); addDeleteTopic(); - AyuUi::AddDeletedMessagesActions(_peer, _thread, _controller, _addAction); } void Filler::fillScheduledActions() {