From cc97093c5aba61f469f7f9a23fc2ce09ab74e8d9 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 1 Nov 2023 22:13:21 +0400 Subject: [PATCH] Instantly jump-to-message on reply bar ctrl+click. --- .../SourceFiles/history/history_widget.cpp | 17 ++++++---- Telegram/SourceFiles/history/history_widget.h | 1 + .../history_view_compose_controls.cpp | 31 +++++++++---------- .../controls/history_view_compose_controls.h | 4 +-- .../controls/history_view_draft_options.cpp | 4 ++- .../controls/history_view_draft_options.h | 2 +- .../view/history_view_replies_section.cpp | 8 +++-- .../view/history_view_scheduled_section.cpp | 12 +++++-- 8 files changed, 47 insertions(+), 32 deletions(-) diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 0935f0865..60c32aded 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -6279,6 +6279,8 @@ void HistoryWidget::mousePressEvent(QMouseEvent *e) { } else { _forwardPanel->editOptions(controller()->uiShow()); } + } else if (_replyTo && (e->modifiers() & Qt::ControlModifier)) { + jumpToReply(_replyTo); } else if (_replyTo) { editDraftOptions(); } else if (_kbReplyTo) { @@ -6307,12 +6309,9 @@ void HistoryWidget::editDraftOptions() { _preview->apply(webpage); }; const auto replyToId = reply.messageId; - const auto highlight = [=] { - controller()->showPeerHistory( - replyToId.peer, - Window::SectionShow::Way::Forward, - replyToId.msg); - }; + const auto highlight = crl::guard(this, [=](FullReplyTo to) { + jumpToReply(to); + }); using namespace HistoryView::Controls; EditDraftOptions({ @@ -6328,6 +6327,12 @@ void HistoryWidget::editDraftOptions() { }); } +void HistoryWidget::jumpToReply(FullReplyTo to) { + if (const auto item = session().data().message(to.messageId)) { + JumpToMessageClickHandler(item, {}, to.quote)->onClick({}); + } +} + void HistoryWidget::keyPressEvent(QKeyEvent *e) { if (!_history) return; diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index 4bf971ff2..87b7edde9 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -550,6 +550,7 @@ private: void setupPreview(); void editDraftOptions(); + void jumpToReply(FullReplyTo to); void messagesReceived(not_null peer, const MTPmessages_Messages &messages, int requestId); void messagesFailed(const MTP::Error &error, int requestId); 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 71e784f0b..d2da74625 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -130,7 +130,7 @@ public: [[nodiscard]] FullReplyTo replyingToMessage() const; [[nodiscard]] FullMsgId editMsgId() const; [[nodiscard]] rpl::producer editMsgIdValue() const; - [[nodiscard]] rpl::producer scrollToItemRequests() const; + [[nodiscard]] rpl::producer jumpToItemRequests() const; [[nodiscard]] rpl::producer<> editPhotoRequests() const; [[nodiscard]] rpl::producer<> editOptionsRequests() const; [[nodiscard]] MessageToEdit queryToEdit(); @@ -206,7 +206,7 @@ private: QRect _shownMessagePreviewRect; rpl::event_stream _visibleChanged; - rpl::event_stream _scrollToItemRequests; + rpl::event_stream _jumpToItemRequests; rpl::event_stream<> _editOptionsRequests; rpl::event_stream<> _editPhotoRequests; @@ -372,9 +372,14 @@ void FieldHeader::init() { if (_preview.parsed) { _editOptionsRequests.fire({}); } else if (isEditingMessage()) { - _scrollToItemRequests.fire(_editMsgId.current()); + _jumpToItemRequests.fire(FullReplyTo{ + .messageId = _editMsgId.current() + }); } else if (readyToForward()) { _forwardPanel->editOptions(_show); + } else if (reply + && (e->modifiers() & Qt::ControlModifier)) { + _jumpToItemRequests.fire_copy(reply); } else if (reply) { _editOptionsRequests.fire({}); } @@ -729,8 +734,8 @@ rpl::producer FieldHeader::editMsgIdValue() const { return _editMsgId.value(); } -rpl::producer FieldHeader::scrollToItemRequests() const { - return _scrollToItemRequests.events(); +rpl::producer FieldHeader::jumpToItemRequests() const { + return _jumpToItemRequests.events(); } rpl::producer<> FieldHeader::editPhotoRequests() const { @@ -1358,8 +1363,8 @@ void ComposeControls::init() { _field->setFocus(); }; const auto replyToId = reply.messageId; - const auto highlight = crl::guard(_wrap.get(), [=] { - _scrollToItemRequests.fire_copy(replyToId); + const auto highlight = crl::guard(_wrap.get(), [=](FullReplyTo to) { + _jumpToItemRequests.fire_copy(to); }); using namespace HistoryView::Controls; @@ -2888,16 +2893,10 @@ Data::WebPageDraft ComposeControls::webPageDraft() const { return _preview ? _preview->draft() : Data::WebPageDraft(); } -rpl::producer ComposeControls::scrollRequests() const { +rpl::producer ComposeControls::jumpToItemRequests() const { return rpl::merge( - _header->scrollToItemRequests(), - _scrollToItemRequests.events() - ) | rpl::map([=](FullMsgId id) -> Data::MessagePosition { - if (const auto item = session().data().message(id)) { - return item->position(); - } - return {}; - }); + _header->jumpToItemRequests(), + _jumpToItemRequests.events()); } bool ComposeControls::isEditingMessage() const { 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 be07fd1b5..9ae515d6c 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h @@ -159,7 +159,7 @@ public: [[nodiscard]] rpl::producer> attachRequests() const; [[nodiscard]] rpl::producer fileChosen() const; [[nodiscard]] rpl::producer photoChosen() const; - [[nodiscard]] rpl::producer scrollRequests() const; + [[nodiscard]] rpl::producer jumpToItemRequests() const; [[nodiscard]] rpl::producer inlineResultChosen() const; [[nodiscard]] rpl::producer sendActionUpdates() const; [[nodiscard]] rpl::producer> viewportEvents() const; @@ -358,7 +358,7 @@ private: const std::unique_ptr _wrap; const std::unique_ptr _writeRestricted; - rpl::event_stream _scrollToItemRequests; + rpl::event_stream _jumpToItemRequests; std::optional _backgroundRect; diff --git a/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp b/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp index 307aa0224..3438ab15d 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp @@ -673,7 +673,9 @@ void DraftOptionsBox( tr::lng_reply_show_in_chat(), st::settingsButton, { &st::menuIconShowInChat } - )->setClickedCallback(highlight); + )->setClickedCallback([=] { + highlight(resolveReply()); + }); Settings::AddButton( bottom, diff --git a/Telegram/SourceFiles/history/view/controls/history_view_draft_options.h b/Telegram/SourceFiles/history/view/controls/history_view_draft_options.h index 798e1fa0c..abe19b39e 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_draft_options.h +++ b/Telegram/SourceFiles/history/view/controls/history_view_draft_options.h @@ -32,7 +32,7 @@ struct EditDraftOptionsArgs { std::vector links; std::shared_ptr resolver; Fn done; - Fn highlight; + Fn highlight; Fn clearOldDraft; }; diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index 8789099ea..c652ab2e8 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -791,9 +791,11 @@ void RepliesWidget::setupComposeControls() { sendInlineResult(chosen.result, chosen.bot, chosen.options, localId); }, lifetime()); - _composeControls->scrollRequests( - ) | rpl::start_with_next([=](Data::MessagePosition pos) { - showAtPosition(pos); + _composeControls->jumpToItemRequests( + ) | rpl::start_with_next([=](FullReplyTo to) { + if (const auto item = session().data().message(to.messageId)) { + JumpToMessageClickHandler(item, {}, to.quote)->onClick({}); + } }, lifetime()); _composeControls->scrollKeyEvents( diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp index 81fe77299..3f9314c40 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp @@ -274,9 +274,15 @@ void ScheduledWidget::setupComposeControls() { sendInlineResult(chosen.result, chosen.bot); }, lifetime()); - _composeControls->scrollRequests( - ) | rpl::start_with_next([=](Data::MessagePosition pos) { - showAtPosition(pos); + _composeControls->jumpToItemRequests( + ) | rpl::start_with_next([=](FullReplyTo to) { + if (const auto item = session().data().message(to.messageId)) { + if (item->isScheduled() && item->history() == _history) { + showAtPosition(item->position()); + } else { + JumpToMessageClickHandler(item, {}, to.quote)->onClick({}); + } + } }, lifetime()); _composeControls->scrollKeyEvents(