From 03a5619d61617679661ef8af80fd02041c7fa98f Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 1 Feb 2021 04:00:58 +0300 Subject: [PATCH] Added ability to reschedule multiple messages. Fixed #9851. --- Telegram/Resources/langs/lang.strings | 1 + .../view/history_view_context_menu.cpp | 64 ++++++++++++++----- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 7f89d6e4da..dd78fbb46c 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1583,6 +1583,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_copy_selected_items" = "Copy Selected as Text"; "lng_context_forward_selected" = "Forward Selected"; "lng_context_send_now_selected" = "Send selected now"; +"lng_context_reschedule_selected" = "Reschedule Selected"; "lng_context_delete_selected" = "Delete Selected"; "lng_context_clear_selection" = "Clear Selection"; "lng_send_image_empty" = "Could not send an empty file: {name}"; diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index dcabec08a7..20f3990617 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -443,31 +443,61 @@ bool AddSendNowMessageAction( return true; } -bool AddRescheduleMessageAction( +bool AddRescheduleAction( not_null menu, const ContextMenuRequest &request, not_null list) { - if (!HasEditMessageAction(request, list) - || !request.item->isScheduled()) { + const auto owner = &request.navigation->session().data(); + + const auto goodSingle = !(!HasEditMessageAction(request, list) + || !request.item->isScheduled()); + const auto goodMany = [&] { + if (goodSingle) { + return false; + } + if (!request.overSelection || request.selectedItems.empty()) { + return false; + } + return true; + }(); + if (!goodSingle && !goodMany) { return false; } - const auto owner = &request.item->history()->owner(); - const auto itemId = request.item->fullId(); - menu->addAction(tr::lng_context_reschedule(tr::now), [=] { - const auto item = owner->message(itemId); - if (!item) { + auto ids = goodSingle + ? MessageIdsList{ request.item->fullId() } + : ExtractIdsList(request.selectedItems); + ranges::sort(ids, [&](const FullMsgId &a, const FullMsgId &b) { + const auto itemA = owner->message(a); + const auto itemB = owner->message(b); + return (itemA && itemB) && (itemA->position() < itemB->position()); + }); + + auto text = ((ids.size() == 1) + ? tr::lng_context_reschedule + : tr::lng_context_reschedule_selected)(tr::now); + + menu->addAction(std::move(text), [=] { + const auto firstItem = owner->message(ids.front()); + if (!firstItem) { return; } + list->cancelSelection(); const auto callback = [=](Api::SendOptions options) { - if (const auto item = owner->message(itemId)) { + for (const auto &id : ids) { + const auto item = owner->message(id); + if (!item && !item->isScheduled()) { + continue; + } if (!item->media() || !item->media()->webpage()) { options.removeWebPageId = true; } Api::RescheduleMessage(item, options); + // Increase the scheduled date by 1ms to keep the order. + options.scheduled += 1; } }; - const auto peer = item->history()->peer; + const auto peer = firstItem->history()->peer; const auto sendMenuType = !peer ? SendMenu::Type::Disabled : peer->isSelf() @@ -477,9 +507,10 @@ bool AddRescheduleMessageAction( : SendMenu::Type::Scheduled; using S = Data::ScheduledMessages; - const auto date = (item->date() == S::kScheduledUntilOnlineTimestamp) + const auto itemDate = firstItem->date(); + const auto date = (itemDate == S::kScheduledUntilOnlineTimestamp) ? HistoryView::DefaultScheduleTime() - : item->date() + 600; + : itemDate + 600; const auto box = Ui::show( HistoryView::PrepareScheduleBox( @@ -490,9 +521,10 @@ bool AddRescheduleMessageAction( Ui::LayerOption::KeepOther); owner->itemRemoved( - itemId - ) | rpl::start_with_next([=] { - box->closeBox(); + ) | rpl::start_with_next([=](not_null item) { + if (ranges::contains(ids, item->fullId())) { + box->closeBox(); + } }, box->lifetime()); }); return true; @@ -825,7 +857,7 @@ void AddMessageActions( AddDeleteAction(menu, request, list); AddReportAction(menu, request, list); AddSelectionAction(menu, request, list); - AddRescheduleMessageAction(menu, request, list); + AddRescheduleAction(menu, request, list); } void AddCopyLinkAction(