From 62bd1354dcc53404165e7fac6e970e1189bd9575 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sun, 28 Apr 2024 16:38:37 +0300 Subject: [PATCH] Replaced box for leaving or deleting chat with generic box. --- .../SourceFiles/boxes/delete_messages_box.cpp | 8 +- .../boxes/moderate_messages_box.cpp | 128 ++++++++++++++++++ .../SourceFiles/boxes/moderate_messages_box.h | 3 + .../SourceFiles/window/window_peer_menu.cpp | 5 +- 4 files changed, 134 insertions(+), 10 deletions(-) diff --git a/Telegram/SourceFiles/boxes/delete_messages_box.cpp b/Telegram/SourceFiles/boxes/delete_messages_box.cpp index 1def53870..247cad699 100644 --- a/Telegram/SourceFiles/boxes/delete_messages_box.cpp +++ b/Telegram/SourceFiles/boxes/delete_messages_box.cpp @@ -379,13 +379,7 @@ auto DeleteMessagesBox::revokeText(not_null peer) const return result; } - const auto items = ranges::views::all( - _ids - ) | ranges::views::transform([&](FullMsgId id) { - return peer->owner().message(id); - }) | ranges::views::filter([](HistoryItem *item) { - return (item != nullptr); - }) | ranges::to_vector; + const auto items = peer->owner().idsToItems(_ids); if (items.size() != _ids.size()) { // We don't have information about all messages. diff --git a/Telegram/SourceFiles/boxes/moderate_messages_box.cpp b/Telegram/SourceFiles/boxes/moderate_messages_box.cpp index 61464e2f9..e6079a0b7 100644 --- a/Telegram/SourceFiles/boxes/moderate_messages_box.cpp +++ b/Telegram/SourceFiles/boxes/moderate_messages_box.cpp @@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/timer.h" #include "boxes/delete_messages_box.h" #include "boxes/peers/edit_peer_permissions_box.h" +#include "core/application.h" #include "core/ui_integration.h" #include "data/data_channel.h" #include "data/data_chat.h" @@ -41,6 +42,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/slide_wrap.h" #include "styles/style_boxes.h" #include "styles/style_layers.h" +#include "styles/style_window.h" namespace { @@ -714,3 +716,129 @@ bool CanCreateModerateMessagesBox(const HistoryItemsList &items) { return (options.allCanBan || options.allCanDelete) && !options.users.empty(); } + +void DeleteChatBox(not_null box, not_null peer) { + const auto container = box->verticalLayout(); + + const auto maybeUser = peer->asUser(); + + Ui::AddSkip(container); + Ui::AddSkip(container); + + base::install_event_filter(box, [=](not_null event) { + if (event->type() == QEvent::KeyPress) { + if (const auto k = static_cast(event.get())) { + if ((k->key() == Qt::Key_Enter) + || (k->key() == Qt::Key_Return)) { + box->uiShow()->show(Ui::MakeConfirmBox({ + .text = tr::lng_gigagroup_warning_title(), + .confirmed = [=](Fn close) { + box->triggerButton(0); + close(); + }, + .confirmText = tr::lng_box_yes(), + .cancelText = tr::lng_box_no(), + })); + } + } + } + return base::EventFilterResult::Continue; + }); + + const auto line = container->add(object_ptr(container)); + const auto &st = st::mainMenuUserpic; + line->resize(line->width(), st.size.height()); + + const auto userpic = Ui::CreateChild( + line, + peer, + st); + userpic->showSavedMessagesOnSelf(true); + const auto label = Ui::CreateChild( + line, + peer->isSelf() + ? tr::lng_saved_messages() | rpl::map(Ui::Text::Bold) + : maybeUser + ? tr::lng_profile_delete_conversation() | rpl::map(Ui::Text::Bold) + : rpl::single(Ui::Text::Bold(peer->name())), + box->getDelegate()->style().title); + line->widthValue( + ) | rpl::start_with_next([=](int width) { + userpic->moveToLeft(st::boxRowPadding.left(), 0); + const auto skip = st::defaultBoxCheckbox.textPosition.x(); + label->resizeToWidth(width + - rect::right(userpic) + - skip + - st::boxRowPadding.right()); + label->moveToLeft( + rect::right(userpic) + skip, + ((userpic->height() - label->height()) / 2)); + }, label->lifetime()); + + userpic->setAttribute(Qt::WA_TransparentForMouseEvents); + label->setAttribute(Qt::WA_TransparentForMouseEvents); + + Ui::AddSkip(container); + Ui::AddSkip(container); + + box->addRow( + object_ptr( + container, + peer->isSelf() + ? tr::lng_sure_delete_saved_messages() + : maybeUser + ? tr::lng_sure_delete_history( + lt_contact, + rpl::single(peer->name())) + : (peer->isChannel() && !peer->isMegagroup()) + ? tr::lng_sure_leave_channel() + : tr::lng_sure_leave_group(), + st::boxLabel)); + + const auto maybeCheckbox = [&]() -> Ui::Checkbox* { + if (!peer->canRevokeFullHistory()) { + return nullptr; + } + Ui::AddSkip(container); + Ui::AddSkip(container); + return box->addRow( + object_ptr( + container, + maybeUser + ? tr::lng_delete_for_other_check( + tr::now, + lt_user, + TextWithEntities{ maybeUser->firstName }, + Ui::Text::RichLangValue) + : tr::lng_delete_for_everyone_check( + tr::now, + Ui::Text::WithEntities), + false, + st::defaultBoxCheckbox)); + }(); + + Ui::AddSkip(container); + + auto buttonText = maybeUser + ? tr::lng_box_delete() + : !maybeCheckbox + ? tr::lng_box_leave() + : maybeCheckbox->checkedValue() | rpl::map([](bool checked) { + return checked ? tr::lng_box_delete() : tr::lng_box_leave(); + }) | rpl::flatten_latest(); + + const auto close = crl::guard(box, [=] { box->closeBox(); }); + box->addButton(std::move(buttonText), [=] { + const auto revoke = maybeCheckbox && maybeCheckbox->checked(); + Core::App().closeChatFromWindows(peer); + // Don't delete old history by default, + // because Android app doesn't. + // + //if (const auto from = peer->migrateFrom()) { + // peer->session().api().deleteConversation(from, false); + //} + peer->session().api().deleteConversation(peer, revoke); + close(); + }, st::attentionBoxButton); + box->addButton(tr::lng_cancel(), close); +} diff --git a/Telegram/SourceFiles/boxes/moderate_messages_box.h b/Telegram/SourceFiles/boxes/moderate_messages_box.h index 351b49741..eb2402612 100644 --- a/Telegram/SourceFiles/boxes/moderate_messages_box.h +++ b/Telegram/SourceFiles/boxes/moderate_messages_box.h @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +class PeerData; namespace Ui { class GenericBox; @@ -18,3 +19,5 @@ void CreateModerateMessagesBox( Fn confirmed); [[nodiscard]] bool CanCreateModerateMessagesBox(const HistoryItemsList &); + +void DeleteChatBox(not_null box, not_null peer); diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index f6473b07b..7648e4543 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/unixtime.h" #include "boxes/delete_messages_box.h" #include "boxes/max_invite_box.h" +#include "boxes/moderate_messages_box.h" #include "boxes/choose_filter_box.h" #include "boxes/create_poll_box.h" #include "boxes/pin_messages_box.h" @@ -2549,9 +2550,7 @@ Fn ClearHistoryHandler( Fn DeleteAndLeaveHandler( not_null controller, not_null peer) { - return [=] { - controller->show(Box(peer, false)); - }; + return [=] { controller->show(Box(DeleteChatBox, peer)); }; } void FillDialogsEntryMenu(