From 5f97d683dfb582c549680c09a83c77a0c2114046 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 18 Jan 2024 13:26:14 +0400 Subject: [PATCH] Count senders / captions count correctly in forwards. --- Telegram/SourceFiles/boxes/share_box.cpp | 12 ++++--- Telegram/SourceFiles/boxes/share_box.h | 4 +-- .../history/history_item_helpers.cpp | 26 ++++++++++++++ .../history/history_item_helpers.h | 3 ++ .../controls/history_view_forward_panel.cpp | 34 ++++++------------- .../ui/chat/forward_options_box.cpp | 11 +++--- .../SourceFiles/ui/chat/forward_options_box.h | 4 +-- .../SourceFiles/window/window_peer_menu.cpp | 12 +++++-- 8 files changed, 65 insertions(+), 41 deletions(-) diff --git a/Telegram/SourceFiles/boxes/share_box.cpp b/Telegram/SourceFiles/boxes/share_box.cpp index db06d0043..2d081a513 100644 --- a/Telegram/SourceFiles/boxes/share_box.cpp +++ b/Telegram/SourceFiles/boxes/share_box.cpp @@ -495,7 +495,6 @@ void ShareBox::showMenu(not_null parent) { }; Ui::FillForwardOptions( std::move(createView), - _descriptor.forwardOptions.messagesCount, _forwardOptions, [=](Ui::ForwardOptions value) { _forwardOptions = value; }, _menu->lifetime()); @@ -522,7 +521,10 @@ void ShareBox::createButtons() { const auto send = addButton(tr::lng_share_confirm(), [=] { submit({}); }); - _forwardOptions.hasCaptions = _descriptor.forwardOptions.hasCaptions; + _forwardOptions.sendersCount + = _descriptor.forwardOptions.sendersCount; + _forwardOptions.captionsCount + = _descriptor.forwardOptions.captionsCount; send->setAcceptBoth(); send->clicks( @@ -575,7 +577,7 @@ void ShareBox::innerSelectedChanged( void ShareBox::submit(Api::SendOptions options) { if (const auto onstack = _descriptor.submitCallback) { - const auto forwardOptions = (_forwardOptions.hasCaptions + const auto forwardOptions = (_forwardOptions.captionsCount && _forwardOptions.dropCaptions) ? Data::ForwardOptions::NoNamesAndCaptions : _forwardOptions.dropNames @@ -1659,9 +1661,9 @@ void FastShareMessage( msgIds), .filterCallback = std::move(filterCallback), .forwardOptions = { - .messagesCount = int(msgIds.size()), + .sendersCount = ItemsForwardSendersCount(items), + .captionsCount = ItemsForwardCaptionsCount(items), .show = !hasOnlyForcedForwardedInfo, - .hasCaptions = hasCaptions, }, .premiumRequiredError = SharePremiumRequiredError(), }), diff --git a/Telegram/SourceFiles/boxes/share_box.h b/Telegram/SourceFiles/boxes/share_box.h index f0cdc5711..d5cd22ffa 100644 --- a/Telegram/SourceFiles/boxes/share_box.h +++ b/Telegram/SourceFiles/boxes/share_box.h @@ -100,9 +100,9 @@ public: const style::PeerList *st = nullptr; const style::InputField *stLabel = nullptr; struct { - int messagesCount = 0; + int sendersCount = 0; + int captionsCount = 0; bool show = false; - bool hasCaptions = false; } forwardOptions; HistoryView::ScheduleBoxStyleArgs scheduleBoxStyle; diff --git a/Telegram/SourceFiles/history/history_item_helpers.cpp b/Telegram/SourceFiles/history/history_item_helpers.cpp index a249195c9..51c1e72a2 100644 --- a/Telegram/SourceFiles/history/history_item_helpers.cpp +++ b/Telegram/SourceFiles/history/history_item_helpers.cpp @@ -808,3 +808,29 @@ void ClearMediaAsExpired(not_null item) { } } } + +int ItemsForwardSendersCount(const HistoryItemsList &list) { + auto peers = base::flat_set>(); + auto names = base::flat_set(); + for (const auto &item : list) { + if (const auto peer = item->originalSender()) { + peers.emplace(peer); + } else { + names.emplace(item->originalHiddenSenderInfo()->name); + } + } + return int(peers.size()) + int(names.size()); +} + +int ItemsForwardCaptionsCount(const HistoryItemsList &list) { + auto result = 0; + for (const auto &item : list) { + if (const auto media = item->media()) { + if (!item->originalText().text.isEmpty() + && media->allowsEditCaption()) { + ++result; + } + } + } + return result; +} diff --git a/Telegram/SourceFiles/history/history_item_helpers.h b/Telegram/SourceFiles/history/history_item_helpers.h index c438eccbe..89a3e0a92 100644 --- a/Telegram/SourceFiles/history/history_item_helpers.h +++ b/Telegram/SourceFiles/history/history_item_helpers.h @@ -158,3 +158,6 @@ ClickHandlerPtr JumpToStoryClickHandler( void ShowTrialTranscribesToast(int left, TimeId until); void ClearMediaAsExpired(not_null item); + +[[nodiscard]] int ItemsForwardSendersCount(const HistoryItemsList &list); +[[nodiscard]] int ItemsForwardCaptionsCount(const HistoryItemsList &list); diff --git a/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.cpp b/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.cpp index 868e55383..13c6dace6 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.cpp @@ -44,18 +44,6 @@ constexpr auto kUnknownVersion = -1; constexpr auto kNameWithCaptionsVersion = -2; constexpr auto kNameNoCaptionsVersion = -3; -[[nodiscard]] bool HasCaptions(const HistoryItemsList &list) { - for (const auto &item : list) { - if (const auto media = item->media()) { - if (!item->originalText().text.isEmpty() - && media->allowsEditCaption()) { - return true; - } - } - } - return false; -} - [[nodiscard]] bool HasOnlyForcedForwardedInfo(const HistoryItemsList &list) { for (const auto &item : list) { if (const auto media = item->media()) { @@ -257,10 +245,10 @@ void ForwardPanel::editOptions(std::shared_ptr show) { const auto now = _data.options; const auto count = _data.items.size(); const auto dropNames = (now != Options::PreserveInfo); - const auto hasCaptions = HasCaptions(_data.items); - const auto hasOnlyForcedForwardedInfo = hasCaptions - ? false - : HasOnlyForcedForwardedInfo(_data.items); + const auto sendersCount = ItemsForwardSendersCount(_data.items); + const auto captionsCount = ItemsForwardCaptionsCount(_data.items); + const auto hasOnlyForcedForwardedInfo = !captionsCount + && HasOnlyForcedForwardedInfo(_data.items); const auto dropCaptions = (now == Options::NoNamesAndCaptions); const auto weak = base::make_weak(this); const auto changeRecipient = crl::guard(this, [=] { @@ -283,7 +271,7 @@ void ForwardPanel::editOptions(std::shared_ptr show) { if (_data.items.empty()) { return; } - const auto newOptions = (options.hasCaptions + const auto newOptions = (options.captionsCount && options.dropCaptions) ? Options::NoNamesAndCaptions : options.dropNames @@ -302,8 +290,9 @@ void ForwardPanel::editOptions(std::shared_ptr show) { Ui::ForwardOptionsBox, count, Ui::ForwardOptions{ + .sendersCount = sendersCount, + .captionsCount = captionsCount, .dropNames = dropNames, - .hasCaptions = hasCaptions, .dropCaptions = dropCaptions, }, optionsChanged, @@ -312,10 +301,9 @@ void ForwardPanel::editOptions(std::shared_ptr show) { void ForwardPanel::editToNextOption() { using Options = Data::ForwardOptions; - const auto hasCaptions = HasCaptions(_data.items); - const auto hasOnlyForcedForwardedInfo = hasCaptions - ? false - : HasOnlyForcedForwardedInfo(_data.items); + const auto captionsCount = ItemsForwardCaptionsCount(_data.items); + const auto hasOnlyForcedForwardedInfo = !captionsCount + && HasOnlyForcedForwardedInfo(_data.items); if (hasOnlyForcedForwardedInfo) { return; } @@ -323,7 +311,7 @@ void ForwardPanel::editToNextOption() { const auto now = _data.options; const auto next = (now == Options::PreserveInfo) ? Options::NoSenderNames - : ((now == Options::NoSenderNames) && hasCaptions) + : ((now == Options::NoSenderNames) && captionsCount) ? Options::NoNamesAndCaptions : Options::PreserveInfo; diff --git a/Telegram/SourceFiles/ui/chat/forward_options_box.cpp b/Telegram/SourceFiles/ui/chat/forward_options_box.cpp index 760ab5dad..f6174968e 100644 --- a/Telegram/SourceFiles/ui/chat/forward_options_box.cpp +++ b/Telegram/SourceFiles/ui/chat/forward_options_box.cpp @@ -19,20 +19,19 @@ void FillForwardOptions( Fn( rpl::producer &&, bool)> createView, - int count, ForwardOptions options, Fn optionsChanged, rpl::lifetime &lifetime) { Expects(optionsChanged != nullptr); const auto names = createView( - (count == 1 + (options.sendersCount == 1 ? tr::lng_forward_show_sender : tr::lng_forward_show_senders)(), !options.dropNames); - const auto captions = options.hasCaptions + const auto captions = options.captionsCount ? createView( - (count == 1 + (options.captionsCount == 1 ? tr::lng_forward_show_caption : tr::lng_forward_show_captions)(), !options.dropCaptions).get() @@ -40,8 +39,9 @@ void FillForwardOptions( const auto notify = [=] { optionsChanged({ + .sendersCount = options.sendersCount, + .captionsCount = options.captionsCount, .dropNames = !names->checked(), - .hasCaptions = options.hasCaptions, .dropCaptions = (captions && !captions->checked()), }); }; @@ -118,7 +118,6 @@ void ForwardOptionsBox( }; FillForwardOptions( std::move(createView), - count, options, std::move(optionsChanged), box->lifetime()); diff --git a/Telegram/SourceFiles/ui/chat/forward_options_box.h b/Telegram/SourceFiles/ui/chat/forward_options_box.h index 057c3f348..9d8cfd97f 100644 --- a/Telegram/SourceFiles/ui/chat/forward_options_box.h +++ b/Telegram/SourceFiles/ui/chat/forward_options_box.h @@ -14,8 +14,9 @@ namespace Ui { class AbstractCheckView; struct ForwardOptions { + int sendersCount = 0; + int captionsCount = 0; bool dropNames = false; - bool hasCaptions = false; bool dropCaptions = false; }; @@ -23,7 +24,6 @@ void FillForwardOptions( Fn( rpl::producer &&, bool)> createView, - int count, ForwardOptions options, Fn optionsChanged, rpl::lifetime &lifetime); diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 3b9925bcf..b260dad69 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -1761,7 +1761,10 @@ QPointer ShowForwardMessagesBox( Fn &&successCallback) { const auto session = &show->session(); const auto owner = &session->data(); - const auto msgIds = owner->itemsToIds(owner->idsToItems(draft.ids)); + const auto itemsList = owner->idsToItems(draft.ids); + const auto msgIds = owner->itemsToIds(itemsList); + const auto sendersCount = ItemsForwardSendersCount(itemsList); + const auto captionsCount = ItemsForwardCaptionsCount(itemsList); if (msgIds.empty()) { return nullptr; } @@ -1779,7 +1782,7 @@ QPointer ShowForwardMessagesBox( } [[nodiscard]] Data::ForwardOptions forwardOptionsData() const { - return (_forwardOptions.hasCaptions + return (_forwardOptions.captionsCount && _forwardOptions.dropCaptions) ? Data::ForwardOptions::NoNamesAndCaptions : _forwardOptions.dropNames @@ -1868,6 +1871,10 @@ QPointer ShowForwardMessagesBox( const auto controllerRaw = controller.get(); auto box = Box(std::move(controller), nullptr); const auto boxRaw = box.data(); + boxRaw->setForwardOptions({ + .sendersCount = sendersCount, + .captionsCount = captionsCount, + }); show->showBox(std::move(box)); auto state = State{ boxRaw, controllerRaw }; return boxRaw->lifetime().make_state(std::move(state)); @@ -1988,7 +1995,6 @@ QPointer ShowForwardMessagesBox( }; Ui::FillForwardOptions( std::move(createView), - msgIds.size(), state->box->forwardOptions(), [=](Ui::ForwardOptions o) { state->box->setForwardOptions(o);