diff --git a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp index 6770474c4a..d94175b9e6 100644 --- a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp +++ b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp @@ -9,6 +9,7 @@ #include "apiwrap.h" #include "lang_auto.h" #include "mainwidget.h" +#include "api/api_sending.h" #include "ayu/ayu_settings.h" #include "ayu/ayu_state.h" #include "ayu/data/messages_storage.h" @@ -25,7 +26,6 @@ #include "data/data_channel.h" #include "data/data_chat.h" #include "data/data_forum_topic.h" -#include "data/data_saved_sublist.h" #include "data/data_search_controller.h" #include "data/data_session.h" #include "data/data_user.h" @@ -39,7 +39,6 @@ #include "ui/boxes/confirm_box.h" #include "ui/widgets/popup_menu.h" #include "ui/widgets/menu/menu_add_action_callback_factory.h" -#include "window/window_controller.h" #include "window/window_peer_menu.h" #include "window/window_session_controller.h" @@ -671,7 +670,7 @@ void AddMessageDetailsAction(not_null menu, HistoryItem *item) { }); } -void AddRepeatMessageAction(not_null menu, HistoryItem *item) { +void AddRepeatMessageAction(not_null menu, HistoryItem *item, HistoryView::Context context) { const auto &settings = AyuSettings::getInstance(); if (!needToShowItem(settings.showRepeatMessageInContextMenu())) { return; @@ -694,45 +693,80 @@ void AddRepeatMessageAction(not_null menu, HistoryItem *item) { tr::ayu_RepeatMessage(tr::now), [=] { - auto sendOptions = Api::SendOptions{ - .sendAs = session->sendAsPeers().resolveChosen(peer), - }; + const auto sendAs = (peer->isUser() || peer->isChat() || history->peer->isMonoforum()) + ? nullptr + : session->sendAsPeers().resolveChosen(peer).get(); - if (peer->isUser() || peer->isChat() || item->history()->peer->isMonoforum()) { - sendOptions.sendAs = nullptr; + const auto inRepliesView = (context == HistoryView::Context::Replies); + const auto replyTo = item->replyTo(); + const auto hasReply = replyTo.messageId.msg != 0; + const auto shiftPressed = base::IsShiftPressed(); + + const auto useNoQuote = shiftPressed || (inRepliesView && !history->peer->isForum()); + const auto preserveReply = inRepliesView ? hasReply : (hasReply && shiftPressed); + + const auto currentItem = history->owner().message(itemId); + if (!currentItem) { + return; } - applyGhostScheduling(session, sendOptions); - - auto action = Api::SendAction(history, sendOptions); + auto action = Api::SendAction( + history, + Api::SendOptions{ .sendAs = sendAs }); + if (history->peer->amMonoforumAdmin()) { + action.replyTo.monoforumPeerId = currentItem->sublistPeerId(); + } action.clearDraft = false; - if (item->topic()) { - action.replyTo.topicRootId = item->topicRootId(); + applyGhostScheduling(session, action.options); + + if (currentItem->topic()) { + action.replyTo.topicRootId = currentItem->topicRootId(); } - if (const auto sublist = item->savedSublist()) { - action.replyTo.monoforumPeerId = sublist->monoforumPeerId(); + if (preserveReply) { + action.replyTo.messageId = replyTo.messageId; } - const auto forwardDraft = Data::ForwardDraft{ - .ids = MessageIdsList{ itemId }, - .options = base::IsShiftPressed() ? Data::ForwardOptions::NoSenderNames : Data::ForwardOptions::PreserveInfo - }; - auto resolvedDraft = history->resolveForwardDraft(forwardDraft); - - if (AyuForward::isFullAyuForwardNeeded(item)) { - crl::async([=] - { - AyuForward::forwardMessages(session, action, false, resolvedDraft); - }); - } else if (AyuForward::isAyuForwardNeeded(item)) { - crl::async([=] - { - AyuForward::intelligentForward(session, action, resolvedDraft); - }); + if (useNoQuote) { + auto message = ApiWrap::MessageToSend(action); + const auto media = currentItem->media(); + if (!currentItem->originalText().text.isEmpty()) { + message.textWithTags = { + currentItem->originalText().text, + TextUtilities::ConvertEntitiesToTextTags( + currentItem->originalText().entities), + }; + } + if (media) { + if (const auto photo = media->photo()) { + Api::SendExistingPhoto(std::move(message), photo); + } else if (const auto document = media->document()) { + Api::SendExistingDocument(std::move(message), document); + } + } else { + session->api().sendMessage(std::move(message)); + } } else { - session->api().forwardMessages(std::move(resolvedDraft), action, [] {}); + const auto forwardDraft = Data::ForwardDraft{ + .ids = MessageIdsList{ itemId }, + .options = Data::ForwardOptions::PreserveInfo, + }; + auto resolvedDraft = history->resolveForwardDraft(forwardDraft); + + if (AyuForward::isFullAyuForwardNeeded(currentItem)) { + crl::async([=] + { + AyuForward::forwardMessages(session, action, false, resolvedDraft); + }); + } else if (AyuForward::isAyuForwardNeeded(currentItem)) { + crl::async([=] + { + AyuForward::intelligentForward(session, action, resolvedDraft); + }); + } else { + session->api().forwardMessages(std::move(resolvedDraft), action, [] {}); + } } }, &st::ayuRepeatMenuIcon); diff --git a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h index 2d43350f36..79e40d3058 100644 --- a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h +++ b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h @@ -13,6 +13,10 @@ #include "ayu/ayu_settings.h" +namespace HistoryView { +enum class Context : char; +} + namespace AyuUi { bool needToShowItem(ContextMenuVisibility state); @@ -41,7 +45,7 @@ void AddHistoryAction(not_null menu, HistoryItem *item); void AddHideMessageAction(not_null menu, HistoryItem *item); void AddUserMessagesAction(not_null menu, HistoryItem *item); void AddMessageDetailsAction(not_null menu, HistoryItem *item); -void AddRepeatMessageAction(not_null menu, HistoryItem *item); +void AddRepeatMessageAction(not_null menu, HistoryItem *item, HistoryView::Context context); void AddReadUntilAction(not_null menu, HistoryItem *item); void AddBurnAction(not_null menu, HistoryItem *item); void AddCreateFilterAction(not_null menu, diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 648c3d7397..260b0567c4 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -2789,7 +2789,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { AyuUi::AddHistoryAction(_menu, item); AyuUi::AddHideMessageAction(_menu, item); AyuUi::AddUserMessagesAction(_menu, item); - AyuUi::AddRepeatMessageAction(_menu, item); + AyuUi::AddRepeatMessageAction(_menu, item, HistoryView::Context::History); AyuUi::AddMessageDetailsAction(_menu, item); }; const auto addPhotoActions = [&](not_null photo, HistoryItem *item) { diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index 48ebd39393..31939588f7 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -1056,10 +1056,11 @@ void AddMessageActions( const ContextMenuRequest &request, not_null list) { if (request.item) { + const auto context = request.view ? request.view->context() : Context::History; AyuUi::AddHistoryAction(menu, request.item); AyuUi::AddHideMessageAction(menu, request.item); AyuUi::AddUserMessagesAction(menu, request.item); - AyuUi::AddRepeatMessageAction(menu, request.item); + AyuUi::AddRepeatMessageAction(menu, request.item, context); AyuUi::AddMessageDetailsAction(menu, request.item); }