From 9c03c310d848a61ac54dacc1fa272f784977f780 Mon Sep 17 00:00:00 2001 From: RadRussianRus Date: Sat, 10 Sep 2022 20:30:57 +0300 Subject: [PATCH] [Improvement] Hiding and showing pinned messages --- Telegram/CMakeLists.txt | 2 + Telegram/Resources/langs/rewrites/en.json | 3 + Telegram/SourceFiles/history/history.cpp | 52 ++++++++++++ Telegram/SourceFiles/history/history.h | 3 + .../SourceFiles/history/history_widget.cpp | 14 ++-- Telegram/SourceFiles/history/history_widget.h | 2 +- .../kotato/boxes/kotato_unpin_box.cpp | 80 +++++++++++++++++++ .../kotato/boxes/kotato_unpin_box.h | 39 +++++++++ .../SourceFiles/window/window_peer_menu.cpp | 43 +++++----- 9 files changed, 211 insertions(+), 27 deletions(-) create mode 100644 Telegram/SourceFiles/kotato/boxes/kotato_unpin_box.cpp create mode 100644 Telegram/SourceFiles/kotato/boxes/kotato_unpin_box.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 2bcfb3c63..6ab601deb 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -777,6 +777,8 @@ PRIVATE kotato/boxes/kotato_fonts_box.h kotato/boxes/kotato_radio_box.cpp kotato/boxes/kotato_radio_box.h + kotato/boxes/kotato_unpin_box.cpp + kotato/boxes/kotato_unpin_box.h kotato/kotato_lang.cpp kotato/kotato_lang.h kotato/kotato_settings.cpp diff --git a/Telegram/Resources/langs/rewrites/en.json b/Telegram/Resources/langs/rewrites/en.json index 57fe91744..7057087ac 100644 --- a/Telegram/Resources/langs/rewrites/en.json +++ b/Telegram/Resources/langs/rewrites/en.json @@ -31,6 +31,8 @@ "ktg_settings_show_json_settings": "Show settings file", "ktg_settings_restart": "Restart Kotatogram", "ktg_copy_btn_callback": "Copy callback data", + "ktg_pinned_message_show": "Show pinned message", + "ktg_pinned_message_hide": "Hide pinned message", "ktg_settings_chats": "Chats", "ktg_settings_sticker_height": "Sticker height: {pixels}px", "ktg_settings_sticker_scale_both": "Apply to sticker width", @@ -101,6 +103,7 @@ "ktg_settings_top_bar_mute": "Mute in profile top bar", "ktg_settings_messages": "Messages", "ktg_settings_filters_hide_all": "Hide \"All chats\" folder", + "ktg_hide_pinned_message": "Hide", "ktg_settings_userpic_rounding": "Profile pictures rounding", "ktg_settings_userpic_rounding_none": "Square", "ktg_settings_userpic_rounding_small": "Small", diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index 9a4bd0289..58f15bfcc 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -38,6 +38,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwidget.h" #include "mainwindow.h" #include "main/main_session.h" +#include "main/main_session_settings.h" #include "window/notifications_manager.h" #include "calls/calls_instance.h" #include "storage/localstorage.h" @@ -3191,6 +3192,57 @@ void History::setHasPinnedMessages(bool has) { session().changes().historyUpdated(this, UpdateFlag::PinnedMessages); } +bool History::hasHiddenPinnedMessage() { + auto result = false; + const auto migrated = peer->migrateFrom(); + const auto currentPinnedId = Data::ResolveTopPinnedId(peer, migrated); + const auto universalPinnedId = !currentPinnedId + ? int32(0) + : (migrated && !peerIsChannel(currentPinnedId.peer)) + ? (currentPinnedId.msg - ServerMaxMsgId) + : currentPinnedId.msg; + if (universalPinnedId) { + const auto hiddenId = session().settings().hiddenPinnedMessageId(peer->id); + if (hiddenId == universalPinnedId) { + result = true; + } + } else { + session().api().requestFullPeer(peer); + } + return result; +} + +bool History::switchPinnedHidden(bool hidden) { + auto result = false; + if (hidden) { + const auto migrated = peer->migrateFrom(); + const auto currentPinnedId = Data::ResolveTopPinnedId(peer, migrated); + const auto universalPinnedId = !currentPinnedId + ? int32(0) + : (migrated && !peerIsChannel(currentPinnedId.peer)) + ? (currentPinnedId.msg - ServerMaxMsgId) + : currentPinnedId.msg; + if (universalPinnedId) { + session().settings().setHiddenPinnedMessageId(peer->id, universalPinnedId); + session().saveSettingsDelayed(); + result = true; + } else { + session().api().requestFullPeer(peer); + } + } else { + const auto hiddenId = session().settings().hiddenPinnedMessageId(peer->id); + if (hiddenId != 0) { + session().settings().setHiddenPinnedMessageId(peer->id, 0); + session().saveSettingsDelayed(); + result = true; + } + } + if (result) { + session().changes().historyUpdated(this, UpdateFlag::PinnedMessages); + } + return result; +} + History::~History() = default; HistoryBlock::HistoryBlock(not_null history) diff --git a/Telegram/SourceFiles/history/history.h b/Telegram/SourceFiles/history/history.h index 7aae08c30..a678ae244 100644 --- a/Telegram/SourceFiles/history/history.h +++ b/Telegram/SourceFiles/history/history.h @@ -464,6 +464,9 @@ public: [[nodiscard]] bool hasPinnedMessages() const; void setHasPinnedMessages(bool has); + bool hasHiddenPinnedMessage(); + bool switchPinnedHidden(bool hidden); + // Still public data. std::deque> blocks; diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 727b07aae..f387d3453 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -6244,9 +6244,7 @@ void HistoryWidget::setupPinnedTracker() { void HistoryWidget::checkPinnedBarState() { Expects(_pinnedTracker != nullptr); - const auto hiddenId = _peer->canPinMessages() - ? MsgId(0) - : session().settings().hiddenPinnedMessageId(_peer->id); + const auto hiddenId = session().settings().hiddenPinnedMessageId(_peer->id); const auto currentPinnedId = Data::ResolveTopPinnedId( _peer, _migrated ? _migrated->peer.get() : nullptr); @@ -6392,7 +6390,11 @@ void HistoryWidget::refreshPinnedBarButton(bool many) { button->clicks( ) | rpl::start_with_next([=] { if (close) { - hidePinnedMessage(); + // if (button->clickModifiers() & Qt::ControlModifier) { + // hidePinnedMessage(true); + // } else { + hidePinnedMessage(); + // } } else { const auto id = _pinnedTracker->currentMessageId(); if (id.message) { @@ -6776,14 +6778,14 @@ void HistoryWidget::editMessage(not_null item) { _field->setFocus(); } -void HistoryWidget::hidePinnedMessage() { +void HistoryWidget::hidePinnedMessage(bool force) { Expects(_pinnedBar != nullptr); const auto id = _pinnedTracker->currentMessageId(); if (!id.message) { return; } - if (_peer->canPinMessages()) { + if (_peer->canPinMessages() && !force) { Window::ToggleMessagePinned(controller(), id.message, false); } else { const auto callback = [=] { diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index fdb9a381a..22ea26410 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -402,7 +402,7 @@ private: void reportSelectedMessages(); void toggleKeyboard(bool manual = true); void startBotCommand(); - void hidePinnedMessage(); + void hidePinnedMessage(bool force = false); void cancelFieldAreaState(); void unblockUser(); void sendBotStartCommand(); diff --git a/Telegram/SourceFiles/kotato/boxes/kotato_unpin_box.cpp b/Telegram/SourceFiles/kotato/boxes/kotato_unpin_box.cpp new file mode 100644 index 000000000..b3a5f39d7 --- /dev/null +++ b/Telegram/SourceFiles/kotato/boxes/kotato_unpin_box.cpp @@ -0,0 +1,80 @@ +/* +This file is part of Kotatogram Desktop, +the unofficial app based on Telegram Desktop. + +For license and copyright information please follow this link: +https://github.com/kotatogram/kotatogram-desktop/blob/dev/LEGAL +*/ +#include "kotato/boxes/kotato_unpin_box.h" + +#include "kotato/kotato_lang.h" +#include "lang/lang_keys.h" +#include "apiwrap.h" +#include "history/history_widget.h" +#include "ui/widgets/labels.h" +#include "data/data_channel.h" +#include "data/data_chat.h" +#include "data/data_changes.h" +#include "data/data_user.h" +#include "data/data_session.h" +#include "main/main_session.h" +#include "styles/style_layers.h" +#include "styles/style_boxes.h" + +UnpinMessageBox::UnpinMessageBox( + QWidget*, + not_null peer, + MsgId msgId) +: _peer(peer) +, _api(&peer->session().mtp()) +, _msgId(msgId) +, _text(this, tr::lng_pinned_unpin_sure(tr::now), st::boxLabel) { +} + +void UnpinMessageBox::prepare() { + addLeftButton(rktr("ktg_hide_pinned_message"), [this] { hideMessage(); }); + + addButton(tr::lng_pinned_unpin(), [this] { unpinMessage(); }); + addButton(tr::lng_cancel(), [this] { closeBox(); }); + + auto height = st::boxPadding.top() + _text->height() + st::boxPadding.bottom(); + setDimensions(st::boxWidth, height); +} + +void UnpinMessageBox::resizeEvent(QResizeEvent *e) { + BoxContent::resizeEvent(e); + _text->moveToLeft(st::boxPadding.left(), st::boxPadding.top()); +} + +void UnpinMessageBox::keyPressEvent(QKeyEvent *e) { + if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { + unpinMessage(); + } else if (e->key() == Qt::Key_Backspace) { + hideMessage(); + } else { + BoxContent::keyPressEvent(e); + } +} + +void UnpinMessageBox::unpinMessage() { + if (_requestId) return; + + //auto flags = MTPmessages_UpdatePinnedMessage::Flags(0); + _requestId = _api.request(MTPmessages_UpdatePinnedMessage( + MTP_flags(MTPmessages_UpdatePinnedMessage::Flag::f_unpin), + _peer->input, + MTP_int(_msgId) + )).done([=](const MTPUpdates &result) { + _peer->session().api().applyUpdates(result); + Ui::hideLayer(); + }).fail([=](const MTP::Error &error) { + Ui::hideLayer(); + }).send(); +} + +void UnpinMessageBox::hideMessage() { + if (_requestId) return; + + _peer->owner().history(_peer)->switchPinnedHidden(true); + Ui::hideLayer(); +} diff --git a/Telegram/SourceFiles/kotato/boxes/kotato_unpin_box.h b/Telegram/SourceFiles/kotato/boxes/kotato_unpin_box.h new file mode 100644 index 000000000..c45bfde51 --- /dev/null +++ b/Telegram/SourceFiles/kotato/boxes/kotato_unpin_box.h @@ -0,0 +1,39 @@ +/* +This file is part of Kotatogram Desktop, +the unofficial app based on Telegram Desktop. + +For license and copyright information please follow this link: +https://github.com/kotatogram/kotatogram-desktop/blob/dev/LEGAL +*/ +#pragma once + +#include "boxes/abstract_box.h" +#include "mtproto/sender.h" + +namespace Ui { +class FlatLabel; +} // namespace Ui + +class UnpinMessageBox final : public Ui::BoxContent { +public: + UnpinMessageBox(QWidget*, not_null peer, MsgId msgId); + +protected: + void prepare() override; + + void resizeEvent(QResizeEvent *e) override; + void keyPressEvent(QKeyEvent *e) override; + +private: + void unpinMessage(); + void hideMessage(); + + const not_null _peer; + MTP::Sender _api; + MsgId _msgId = 0; + + object_ptr _text; + + mtpRequestId _requestId = 0; + +}; diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index df40ca8e4..3a05a9c28 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -8,9 +8,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_peer_menu.h" #include "kotato/kotato_settings.h" +#include "kotato/kotato_lang.h" #include "api/api_chat_participants.h" #include "lang/lang_keys.h" -#include "ui/boxes/confirm_box.h" #include "base/options.h" #include "boxes/delete_messages_box.h" #include "boxes/max_invite_box.h" @@ -21,6 +21,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/peers/add_participants_box.h" #include "boxes/peers/edit_contact_box.h" #include "boxes/share_box.h" +#include "kotato/boxes/kotato_unpin_box.h" +#include "ui/boxes/confirm_box.h" #include "ui/boxes/report_box.h" #include "ui/toast/toast.h" #include "ui/text/text_utilities.h" @@ -174,9 +176,7 @@ private: void addBotToGroup(); void addNewMembers(); void addDeleteContact(); - - void addChatActions(not_null chat); - void addChannelActions(not_null channel); + void addHidePin(); not_null _controller; Dialogs::EntryState _request; @@ -679,6 +679,23 @@ void Filler::addDeleteContact() { &st::menuIconDelete); } +void Filler::addHidePin() { + const auto history = _peer->owner().history(_peer); + if (history->hasPinnedMessages()) { + if (history->hasHiddenPinnedMessage()) { + _addAction( + ktr("ktg_pinned_message_show"), + [=] { history->switchPinnedHidden(false); }, + &st::menuIconPin); + } else { + _addAction( + ktr("ktg_pinned_message_hide"), + [=] { history->switchPinnedHidden(true); }, + &st::menuIconUnpin); + } + } +} + void Filler::addManageChat() { if (!EditPeerInfoBox::Available(_peer)) { return; @@ -782,6 +799,7 @@ void Filler::fillChatsListActions() { void Filler::fillHistoryActions() { addToggleMute(); addSupportInfo(); + addHidePin(); addManageChat(); addCreatePoll(); addThemeEdit(); @@ -1483,22 +1501,7 @@ void ToggleMessagePinned( if (pin) { Ui::show(Box(item->history()->peer, item->id)); } else { - const auto peer = item->history()->peer; - const auto session = &peer->session(); - const auto callback = crl::guard(session, [=] { - Ui::hideLayer(); - session->api().request(MTPmessages_UpdatePinnedMessage( - MTP_flags(MTPmessages_UpdatePinnedMessage::Flag::f_unpin), - peer->input, - MTP_int(itemId.msg) - )).done([=](const MTPUpdates &result) { - session->api().applyUpdates(result); - }).send(); - }); - Ui::show(Box( - tr::lng_pinned_unpin_sure(tr::now), - tr::lng_pinned_unpin(tr::now), - callback)); + Ui::show(Box(item->history()->peer, item->id)); } }