From efe99b3f62ead19c2ace65bccbcf13847509052e Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 13 Nov 2024 13:36:53 +0400 Subject: [PATCH] Fix special userpic menu in topics. --- .../history_view_compose_controls.cpp | 4 ++ .../controls/history_view_compose_controls.h | 2 + .../view/history_view_chat_preview.cpp | 7 ++++ .../history/view/history_view_list_widget.cpp | 39 ++++++++++++++++++- .../history/view/history_view_list_widget.h | 8 ++++ .../view/history_view_replies_section.cpp | 18 +++++++++ .../view/history_view_replies_section.h | 2 + 7 files changed, 79 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index 9eed3aeb4..2fdbc1d15 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -3383,6 +3383,10 @@ Fn ComposeControls::restoreTextCallback( }); } +Ui::InputField *ComposeControls::fieldForMention() const { + return _writeRestriction.current() ? nullptr : _field.get(); +} + TextWithEntities ComposeControls::prepareTextForEditMsg() const { if (!_history) { return {}; diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h index 6024e56de..2b97c4f98 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h @@ -249,6 +249,8 @@ public: Fn restoreTextCallback(const QString &insertTextOnCancel) const; + [[nodiscard]] Ui::InputField *fieldForMention() const; + private: enum class TextUpdateEvent { SaveDraft = (1 << 0), diff --git a/Telegram/SourceFiles/history/view/history_view_chat_preview.cpp b/Telegram/SourceFiles/history/view/history_view_chat_preview.cpp index 4747ce609..da6b492d3 100644 --- a/Telegram/SourceFiles/history/view/history_view_chat_preview.cpp +++ b/Telegram/SourceFiles/history/view/history_view_chat_preview.cpp @@ -161,6 +161,8 @@ private: bool listShowReactPremiumError( not_null item, const Data::ReactionId &id) override; + base::unique_qptr listFillSenderUserpicMenu( + PeerId userpicPeerId) override; void listWindowSetInnerFocus() override; bool listAllowsDragForward() override; void listLaunchDrag( @@ -828,6 +830,11 @@ bool Item::listShowReactPremiumError( return false; } +base::unique_qptr Item::listFillSenderUserpicMenu( + PeerId userpicPeerId) { + return nullptr; +} + void Item::listWindowSetInnerFocus() { } diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index 68a28f1f8..1a67af4ec 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -30,9 +30,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/message_field.h" #include "mainwindow.h" #include "mainwidget.h" -#include "core/click_handler_types.h" #include "core/application.h" +#include "core/click_handler_types.h" #include "core/core_settings.h" +#include "core/phone_click_handler.h" #include "apiwrap.h" #include "api/api_who_reacted.h" #include "api/api_views.h" @@ -171,6 +172,11 @@ bool WindowListDelegate::listShowReactPremiumError( return Window::ShowReactPremiumError(_window, item, id); } +auto WindowListDelegate::listFillSenderUserpicMenu(PeerId userpicPeerId) +-> base::unique_qptr { + return nullptr; +} + void WindowListDelegate::listWindowSetInnerFocus() { _window->widget()->setInnerFocus(); } @@ -2794,6 +2800,12 @@ void ListWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { ? _overElement->data().get() : nullptr; const auto clickedReaction = Reactions::ReactionIdOfLink(link); + const auto linkPhoneNumber = link + ? link->property(kPhoneNumberLinkProperty).toString() + : QString(); + const auto linkUserpicPeerId = (link && _overSenderUserpic) + ? PeerId(link->property(kPeerLinkPeerIdProperty).toULongLong()) + : PeerId(); _whoReactedMenuLifetime.destroy(); if (!clickedReaction.empty() && overItem @@ -2808,6 +2820,19 @@ void ListWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { _whoReactedMenuLifetime); e->accept(); return; + } else if (!linkPhoneNumber.isEmpty()) { + PhoneClickHandler(&session(), linkPhoneNumber).onClick( + prepareClickContext( + Qt::LeftButton, + _overItemExact ? _overItemExact->fullId() : FullMsgId())); + return; + } else if (linkUserpicPeerId) { + _menu = _delegate->listFillSenderUserpicMenu(linkUserpicPeerId); + if (_menu) { + _menu->popup(e->globalPos()); + e->accept(); + return; + } } auto request = ContextMenuRequest(controller()); @@ -3568,6 +3593,15 @@ ClickHandlerContext ListWidget::prepareClickHandlerContext(FullMsgId id) { }; } +ClickContext ListWidget::prepareClickContext( + Qt::MouseButton button, + FullMsgId itemId) { + return { + button, + QVariant::fromValue(prepareClickHandlerContext(itemId)), + }; +} + int ListWidget::SelectionViewOffset( not_null inner, not_null view) { @@ -3629,6 +3663,7 @@ void ListWidget::mouseActionUpdate() { auto inTextSelection = (_overState.pointState != PointState::Outside) && (_overState.itemId == _pressState.itemId) && hasSelectedText(); + auto dragStateUserpic = false; const auto overReaction = reactionView && reactionState.link; if (overReaction) { dragState = reactionState; @@ -3727,6 +3762,7 @@ void ListWidget::mouseActionUpdate() { // stop enumeration if we've found a userpic under the cursor if (point.y() >= userpicTop && point.y() < userpicTop + st::msgPhotoSize) { dragState = TextState(nullptr, view->fromPhotoLink()); + dragStateUserpic = true; _overItemExact = nullptr; lnkhost = view; return false; @@ -3738,6 +3774,7 @@ void ListWidget::mouseActionUpdate() { } } const auto lnkChanged = ClickHandler::setActive(dragState.link, lnkhost); + _overSenderUserpic = dragStateUserpic; if (lnkChanged || dragState.cursor != _mouseCursorState) { Ui::Tooltip::Hide(); } diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.h b/Telegram/SourceFiles/history/view/history_view_list_widget.h index 056d6ce95..a21cea06e 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.h @@ -185,6 +185,8 @@ public: virtual bool listShowReactPremiumError( not_null item, const Data::ReactionId &id) = 0; + virtual base::unique_qptr listFillSenderUserpicMenu( + PeerId userpicPeerId) = 0; virtual void listWindowSetInnerFocus() = 0; virtual bool listAllowsDragForward() = 0; virtual void listLaunchDrag( @@ -218,6 +220,8 @@ public: bool listShowReactPremiumError( not_null item, const Data::ReactionId &id) override; + base::unique_qptr listFillSenderUserpicMenu( + PeerId userpicPeerId) override; void listWindowSetInnerFocus() override; bool listAllowsDragForward() override; void listLaunchDrag( @@ -356,6 +360,9 @@ public: int top) const; [[nodiscard]] ClickHandlerContext prepareClickHandlerContext( FullMsgId id); + [[nodiscard]] ClickContext prepareClickContext( + Qt::MouseButton button, + FullMsgId itemId); // AbstractTooltipShower interface QString tooltipText() const override; @@ -808,6 +815,7 @@ private: CursorState _mouseCursorState = CursorState(); uint16 _mouseTextSymbol = 0; bool _pressWasInactive = false; + bool _overSenderUserpic = false; bool _selectEnabled = false; HistoryItem *_selectedTextItem = nullptr; diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index 081d01f44..5531cae2e 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -27,6 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history_view_swipe.h" #include "ui/chat/pinned_bar.h" #include "ui/chat/chat_style.h" +#include "ui/widgets/menu/menu_add_action_callback_factory.h" #include "ui/widgets/buttons.h" #include "ui/widgets/scroll_area.h" #include "ui/widgets/popup_menu.h" @@ -2705,6 +2706,23 @@ Ui::ChatPaintContext RepliesWidget::listPreparePaintContext( return context; } +base::unique_qptr RepliesWidget::listFillSenderUserpicMenu( + PeerId userpicPeerId) { + const auto searchInEntry = _topic + ? Dialogs::Key(_topic) + : Dialogs::Key(_history); + auto menu = base::make_unique_q( + this, + st::popupMenuWithIcons); + Window::FillSenderUserpicMenu( + controller(), + _history->owner().peer(userpicPeerId), + _composeControls->fieldForMention(), + searchInEntry, + Ui::Menu::CreateAddActionCallback(menu.get())); + return menu->empty() ? nullptr : std::move(menu); +} + void RepliesWidget::setupEmptyPainter() { Expects(_topic != nullptr); diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.h b/Telegram/SourceFiles/history/view/history_view_replies_section.h index 71321f14c..1312eabd7 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.h +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.h @@ -183,6 +183,8 @@ public: not_null tracker) override; Ui::ChatPaintContext listPreparePaintContext( Ui::ChatPaintContextArgs &&args) override; + base::unique_qptr listFillSenderUserpicMenu( + PeerId userpicPeerId) override; // CornerButtonsDelegate delegate. void cornerButtonsShowAtPosition(