From 9b483c390d73b5a56dc9ca922d2c56efdb78ad7c Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 28 Feb 2026 17:04:23 +0300 Subject: [PATCH] Added ability to open full checked moderate box from left userpic menu. --- Telegram/Resources/langs/lang.strings | 1 + .../history/history_inner_widget.cpp | 21 ++++++++++ .../history/view/history_view_list_widget.cpp | 10 +++++ .../SourceFiles/window/window_peer_menu.cpp | 38 +++++++++++++++++++ .../SourceFiles/window/window_peer_menu.h | 6 +++ 5 files changed, 76 insertions(+) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index ee75d5e9c9..eae8c30d18 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -4864,6 +4864,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_edit_permissions" = "Edit admin rights"; "lng_context_restrict_user" = "Restrict user"; "lng_context_ban_user" = "Ban"; +"lng_context_delete_and_ban" = "Delete and ban"; "lng_context_remove_from_group" = "Remove from group"; "lng_context_add_to_group" = "Add to group"; diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 88b51b7e81..0b62173dcb 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -2459,6 +2459,27 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { _widget->fillSenderUserpicMenu( _menu.get(), session->data().peer(PeerId(linkUserpicPeerId))); + Window::AddSenderUserpicModerateAction( + _controller, + [&] { + auto moderateItem = _dragStateItem; + const auto contextY = mapFromGlobal(e->globalPos()).y(); + enumerateItems( + [&](not_null view, int top, int bottom) { + if (bottom <= contextY) { + return true; + } else if (top > contextY) { + return false; + } + const auto item = view->data(); + if (item->from()->id == PeerId(linkUserpicPeerId)) { + moderateItem = item; + } + return false; + }); + return moderateItem; + }(), + Ui::Menu::CreateAddActionCallback(_menu.get())); if (_menu->empty()) { _menu = nullptr; } else { diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index fa66c458c5..9a22de5626 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -46,6 +46,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_peer_menu.h" #include "main/main_session.h" #include "ui/layers/generic_box.h" +#include "ui/widgets/menu/menu_add_action_callback_factory.h" #include "ui/widgets/popup_menu.h" #include "ui/widgets/scroll_area.h" #include "ui/toast/toast.h" @@ -2914,6 +2915,15 @@ void ListWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { } else if (linkUserpicPeerId) { _menu = _delegate->listFillSenderUserpicMenu(linkUserpicPeerId); if (_menu) { + Window::AddSenderUserpicModerateAction( + controller(), + [&] { + const auto contextY = _visibleTop + + mapFromGlobal(e->globalPos()).y(); + const auto contextView = strictFindItemByY(contextY); + return contextView ? contextView->data().get() : overItem; + }(), + Ui::Menu::CreateAddActionCallback(_menu.get())); _menu->popup(e->globalPos()); e->accept(); return; diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 5fd8557386..a6ad45c90b 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -3798,6 +3798,44 @@ void FillSenderUserpicMenu( } } +void AddSenderUserpicModerateAction( + not_null controller, + HistoryItem *moderateItem, + const PeerMenuCallback &addAction) { + const auto moderateChannel = moderateItem + ? moderateItem->history()->peer->asChannel() + : nullptr; + const auto moderateUser = moderateItem + ? moderateItem->from()->asUser() + : nullptr; + const auto canDeleteAndBan = moderateItem + && moderateChannel + && moderateChannel->isMegagroup() + && moderateUser + && !moderateChannel->isGroupAdmin(moderateUser) + && moderateItem->suggestBanReport() + && moderateItem->suggestDeleteAllReport(); + if (canDeleteAndBan) { + addAction({ .isSeparator = true }); + addAction({ + .text = tr::lng_context_delete_and_ban(tr::now), + .handler = [=] { + controller->show(Box( + CreateModerateMessagesBox, + HistoryItemsList{ not_null(moderateItem) }, + nullptr, + ModerateMessagesBoxOptions{ + .reportSpam = true, + .deleteAll = true, + .banUser = true, + })); + }, + .icon = &st::menuIconBlockAttention, + .isAttention = true, + }); + } +} + bool IsUnreadThread(not_null thread) { return thread->chatListBadgesState().unread; } diff --git a/Telegram/SourceFiles/window/window_peer_menu.h b/Telegram/SourceFiles/window/window_peer_menu.h index d2afbcc4d6..4a08e99f49 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.h +++ b/Telegram/SourceFiles/window/window_peer_menu.h @@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/menu/menu_add_action_callback.h" class History; +class HistoryItem; namespace Api { struct SendOptions; @@ -84,6 +85,11 @@ void FillSenderUserpicMenu( Dialogs::Key searchInEntry, const PeerMenuCallback &addAction); +void AddSenderUserpicModerateAction( + not_null controller, + HistoryItem *moderateItem, + const PeerMenuCallback &addAction); + void MenuAddMarkAsReadAllChatsAction( not_null session, std::shared_ptr show,