Check items before deleting by 'Delete' key.

This commit is contained in:
John Preston 2020-10-26 11:54:59 +03:00
parent e4f039b141
commit 75c420b9d7
5 changed files with 93 additions and 76 deletions

View File

@ -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<QMimeData> 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<FullMsgId> ListWidget::readMessageRequested() const {
ListWidget::~ListWidget() = default;
void ConfirmDeleteSelectedItems(not_null<ListWidget*> 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<DeleteMessagesBox>(
&widget->controller()->session(),
widget->getSelectedIds()));
box->setDeleteConfirmedCallback([=] {
if (const auto strong = weak.data()) {
strong->cancelSelection();
}
});
}
void ConfirmForwardSelectedItems(not_null<ListWidget*> 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<ListWidget*> 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

View File

@ -183,8 +183,9 @@ public:
Data::MessagePosition position,
Fn<bool()> 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<HistoryItem*> item);
void selectItemAsGroup(not_null<HistoryItem*> item);
@ -551,4 +552,8 @@ private:
};
void ConfirmDeleteSelectedItems(not_null<ListWidget*> widget);
void ConfirmForwardSelectedItems(not_null<ListWidget*> widget);
void ConfirmSendNowSelectedItems(not_null<ListWidget*> widget);
} // namespace HistoryView

View File

@ -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<HistoryItem*> 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<DeleteMessagesBox>(
&_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() {

View File

@ -1629,7 +1629,7 @@ bool RepliesWidget::listAllowsMultiSelect() {
bool RepliesWidget::listIsItemGoodForSelection(
not_null<HistoryItem*> 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<DeleteMessagesBox>(
&_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() {

View File

@ -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<DeleteMessagesBox>(
&_history->session(),
std::move(items)));
box->setDeleteConfirmedCallback([=] {
if (const auto strong = weak.data()) {
strong->clearSelected();
}
});
ConfirmDeleteSelectedItems(_inner);
}
void ScheduledWidget::clearSelected() {