diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index 4a6d38f81..71ceca6bb 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_session_controller.h" #include "window/window_peer_menu.h" #include "main/main_session.h" +#include "boxes/confirm_box.h" #include "ui/widgets/popup_menu.h" #include "ui/toast/toast.h" #include "ui/inactive_press.h" @@ -1642,10 +1643,14 @@ TextForMimeData ListWidget::getSelectedText() const { return result; } -MessageIdsList ListWidget::getSelectedItems() const { +MessageIdsList ListWidget::getSelectedIds() const { return collectSelectedIds(); } +SelectedItems ListWidget::getSelectedItems() const { + return collectSelectedItems(); +} + int ListWidget::findItemIndexByY(int y) const { Expects(!_items.empty()); @@ -2482,7 +2487,7 @@ std::unique_ptr ListWidget::prepareDrag() { return true; }(); auto items = canForwardAll - ? getSelectedItems() + ? collectSelectedIds() : MessageIdsList(); if (!items.empty()) { session().data().setMimeForwardIds(std::move(items)); @@ -2711,4 +2716,74 @@ rpl::producer ListWidget::readMessageRequested() const { ListWidget::~ListWidget() = default; +void ConfirmDeleteSelectedItems(not_null widget) { + const auto items = widget->getSelectedItems(); + if (items.empty()) { + return; + } + for (const auto &item : items) { + if (!item.canDelete) { + return; + } + } + const auto weak = Ui::MakeWeak(widget); + const auto box = Ui::show(Box( + &widget->controller()->session(), + widget->getSelectedIds())); + box->setDeleteConfirmedCallback([=] { + if (const auto strong = weak.data()) { + strong->cancelSelection(); + } + }); +} + +void ConfirmForwardSelectedItems(not_null widget) { + const auto items = widget->getSelectedItems(); + if (items.empty()) { + return; + } + for (const auto &item : items) { + if (!item.canForward) { + return; + } + } + auto ids = widget->getSelectedIds(); + const auto weak = Ui::MakeWeak(widget); + Window::ShowForwardMessagesBox(widget->controller(), std::move(ids), [=] { + if (const auto strong = weak.data()) { + strong->cancelSelection(); + } + }); +} + +void ConfirmSendNowSelectedItems(not_null widget) { + const auto items = widget->getSelectedItems(); + if (items.empty()) { + return; + } + const auto navigation = widget->controller(); + const auto history = [&]() -> History* { + auto result = (History*)nullptr; + auto &data = navigation->session().data(); + for (const auto &item : items) { + if (!item.canSendNow) { + return nullptr; + } + const auto message = data.message(item.msgId); + if (message) { + result = message->history(); + } + } + return result; + }(); + if (!history) { + return; + } + Window::ShowSendNowMessagesBox( + navigation, + history, + widget->getSelectedIds(), + [=] { navigation->showBackFromStack(); }); +} + } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.h b/Telegram/SourceFiles/history/view/history_view_list_widget.h index c0c3b3d70..38ecc163c 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.h @@ -183,8 +183,9 @@ public: Data::MessagePosition position, Fn overrideInitialScroll); - TextForMimeData getSelectedText() const; - MessageIdsList getSelectedItems() const; + [[nodiscard]] TextForMimeData getSelectedText() const; + [[nodiscard]] MessageIdsList getSelectedIds() const; + [[nodiscard]] SelectedItems getSelectedItems() const; void cancelSelection(); void selectItem(not_null item); void selectItemAsGroup(not_null item); @@ -551,4 +552,8 @@ private: }; +void ConfirmDeleteSelectedItems(not_null widget); +void ConfirmForwardSelectedItems(not_null widget); +void ConfirmSendNowSelectedItems(not_null widget); + } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp b/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp index 3aa58d258..5b64324ad 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp @@ -502,7 +502,7 @@ void PinnedWidget::listScrollTo(int top) { } void PinnedWidget::listCancelRequest() { - if (_inner && !_inner->getSelectedItems().empty()) { + if (_inner && !_inner->getSelectedIds().empty()) { clearSelected(); return; } @@ -588,7 +588,7 @@ bool PinnedWidget::listAllowsMultiSelect() { bool PinnedWidget::listIsItemGoodForSelection( not_null item) { - return !item->isSending() && !item->hasFailed(); + return IsServerMsgId(item->id); } bool PinnedWidget::listIsLessInOrder( @@ -640,32 +640,11 @@ bool PinnedWidget::listIsGoodForAroundPosition( } void PinnedWidget::confirmDeleteSelected() { - auto items = _inner->getSelectedItems(); - if (items.empty()) { - return; - } - const auto weak = Ui::MakeWeak(this); - const auto box = Ui::show(Box( - &_history->session(), - std::move(items))); - box->setDeleteConfirmedCallback([=] { - if (const auto strong = weak.data()) { - strong->clearSelected(); - } - }); + ConfirmDeleteSelectedItems(_inner); } void PinnedWidget::confirmForwardSelected() { - auto items = _inner->getSelectedItems(); - if (items.empty()) { - return; - } - const auto weak = Ui::MakeWeak(this); - Window::ShowForwardMessagesBox(controller(), std::move(items), [=] { - if (const auto strong = weak.data()) { - strong->clearSelected(); - } - }); + ConfirmForwardSelectedItems(_inner); } void PinnedWidget::clearSelected() { diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index f1baa2b04..ead53c4ae 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -1629,7 +1629,7 @@ bool RepliesWidget::listAllowsMultiSelect() { bool RepliesWidget::listIsItemGoodForSelection( not_null item) { - return !item->isSending() && !item->hasFailed(); + return IsServerMsgId(item->id); } bool RepliesWidget::listIsLessInOrder( @@ -1739,32 +1739,11 @@ bool RepliesWidget::listIsGoodForAroundPosition( } void RepliesWidget::confirmDeleteSelected() { - auto items = _inner->getSelectedItems(); - if (items.empty()) { - return; - } - const auto weak = Ui::MakeWeak(this); - const auto box = Ui::show(Box( - &_history->session(), - std::move(items))); - box->setDeleteConfirmedCallback([=] { - if (const auto strong = weak.data()) { - strong->clearSelected(); - } - }); + ConfirmDeleteSelectedItems(_inner); } void RepliesWidget::confirmForwardSelected() { - auto items = _inner->getSelectedItems(); - if (items.empty()) { - return; - } - const auto weak = Ui::MakeWeak(this); - Window::ShowForwardMessagesBox(controller(), std::move(items), [=] { - if (const auto strong = weak.data()) { - strong->clearSelected(); - } - }); + ConfirmForwardSelectedItems(_inner); } void RepliesWidget::clearSelected() { diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp index 804d68393..b2417000e 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp @@ -1166,32 +1166,11 @@ bool ScheduledWidget::listIsGoodForAroundPosition( } void ScheduledWidget::confirmSendNowSelected() { - auto items = _inner->getSelectedItems(); - if (items.empty()) { - return; - } - const auto navigation = controller(); - Window::ShowSendNowMessagesBox( - navigation, - _history, - std::move(items), - [=] { navigation->showBackFromStack(); }); + ConfirmSendNowSelectedItems(_inner); } void ScheduledWidget::confirmDeleteSelected() { - auto items = _inner->getSelectedItems(); - if (items.empty()) { - return; - } - const auto weak = Ui::MakeWeak(this); - const auto box = Ui::show(Box( - &_history->session(), - std::move(items))); - box->setDeleteConfirmedCallback([=] { - if (const auto strong = weak.data()) { - strong->clearSelected(); - } - }); + ConfirmDeleteSelectedItems(_inner); } void ScheduledWidget::clearSelected() {