From 062c451c2725640d2b926e218102bfd7c2b2b33f Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sun, 31 Jan 2021 07:22:46 +0300 Subject: [PATCH] Refactored handle of last editable message on Up arrow in sections. --- .../SourceFiles/data/data_replies_list.cpp | 19 ---------------- Telegram/SourceFiles/data/data_replies_list.h | 2 -- .../data/data_scheduled_messages.cpp | 22 ------------------- .../data/data_scheduled_messages.h | 2 -- .../history_view_compose_controls.cpp | 20 +++++++++-------- .../controls/history_view_compose_controls.h | 4 +++- .../history/view/history_view_list_widget.cpp | 20 ++++++++++++++++- .../history/view/history_view_list_widget.h | 3 ++- .../view/history_view_replies_section.cpp | 15 +++---------- .../view/history_view_scheduled_section.cpp | 17 +++----------- 10 files changed, 41 insertions(+), 83 deletions(-) diff --git a/Telegram/SourceFiles/data/data_replies_list.cpp b/Telegram/SourceFiles/data/data_replies_list.cpp index e184460b4c..b2004fa79e 100644 --- a/Telegram/SourceFiles/data/data_replies_list.cpp +++ b/Telegram/SourceFiles/data/data_replies_list.cpp @@ -7,7 +7,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "data/data_replies_list.h" -#include "base/unixtime.h" #include "history/history.h" #include "history/history_item.h" #include "history/history_service.h" @@ -627,22 +626,4 @@ bool RepliesList::processMessagesIsEmpty(const MTPmessages_Messages &result) { return (list.size() == skipped); } -HistoryItem *RepliesList::lastEditableMessage() { - const auto message = [&](MsgId msgId) { - return _history->owner().message(_history->channelId(), msgId); - }; - - const auto now = base::unixtime::now(); - auto proj = [&](MsgId msgId) { - if (const auto item = message(msgId)) { - return item->allowsEdit(now); - } - return false; - }; - const auto it = ranges::find_if(_list, std::move(proj)); - return (it == end(_list)) - ? nullptr - : _history->owner().groups().findItemToEdit(message(*it)).get(); -} - } // namespace Data diff --git a/Telegram/SourceFiles/data/data_replies_list.h b/Telegram/SourceFiles/data/data_replies_list.h index 945e70da86..36932b82b1 100644 --- a/Telegram/SourceFiles/data/data_replies_list.h +++ b/Telegram/SourceFiles/data/data_replies_list.h @@ -31,8 +31,6 @@ public: [[nodiscard]] rpl::producer fullCount() const; - [[nodiscard]] HistoryItem *lastEditableMessage(); - private: struct Viewer; diff --git a/Telegram/SourceFiles/data/data_scheduled_messages.cpp b/Telegram/SourceFiles/data/data_scheduled_messages.cpp index 754d78ec86..f6bb515272 100644 --- a/Telegram/SourceFiles/data/data_scheduled_messages.cpp +++ b/Telegram/SourceFiles/data/data_scheduled_messages.cpp @@ -546,26 +546,4 @@ int32 ScheduledMessages::countListHash(const List &list) const { return HashFinalize(hash); } -HistoryItem *ScheduledMessages::lastEditableMessage( - not_null history) { - const auto i = _data.find(history); - if (i == end(_data)) { - return nullptr; - } - auto &list = i->second; - - sort(list); - const auto items = ranges::view::reverse(list.items); - - const auto now = base::unixtime::now(); - auto proj = [&](const OwnedItem &item) { - return item->allowsEdit(now); - }; - - const auto it = ranges::find_if(items, std::move(proj)); - return (it == end(items)) - ? nullptr - : history->owner().groups().findItemToEdit((*it).get()).get(); -} - } // namespace Data diff --git a/Telegram/SourceFiles/data/data_scheduled_messages.h b/Telegram/SourceFiles/data/data_scheduled_messages.h index 650434c2c7..b6656f23f7 100644 --- a/Telegram/SourceFiles/data/data_scheduled_messages.h +++ b/Telegram/SourceFiles/data/data_scheduled_messages.h @@ -32,8 +32,6 @@ public: [[nodiscard]] HistoryItem *lookupItem(PeerId peer, MsgId msg) const; [[nodiscard]] HistoryItem *lookupItem(FullMsgId itemId) const; [[nodiscard]] int count(not_null history) const; - [[nodiscard]] HistoryItem *lastEditableMessage( - not_null history); void checkEntitiesAndUpdate(const MTPDmessage &data); void apply(const MTPDupdateNewScheduledMessage &update); diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index 1fcead3648..92b1f51461 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -712,20 +712,16 @@ rpl::producer<> ComposeControls::cancelRequests() const { return _cancelRequests.events(); } -rpl::producer> ComposeControls::keyEvents() const { - return _wrap->events( - ) | rpl::map([=](not_null e) -> not_null { - return static_cast(e.get()); - }) | rpl::filter([=](not_null event) { - return (event->type() == QEvent::KeyPress); - }); -} - auto ComposeControls::scrollKeyEvents() const -> rpl::producer> { return _scrollKeyEvents.events(); } +auto ComposeControls::editLastMessageRequests() const +-> rpl::producer> { + return _editLastMessageRequests.events(); +} + auto ComposeControls::sendContentRequests(SendRequestType requestType) const { auto filter = rpl::filter([=] { const auto type = (_mode == Mode::Normal) @@ -1061,6 +1057,12 @@ void ComposeControls::initKeyHandler() { }) | rpl::start_with_next([=](not_null e) { auto keyEvent = static_cast(e.get()); const auto key = keyEvent->key(); + if (key == Qt::Key_Up) { + if (!isEditingMessage()) { + _editLastMessageRequests.fire(std::move(keyEvent)); + return; + } + } if ((key == Qt::Key_Up) || (key == Qt::Key_Down) || (key == Qt::Key_PageUp) diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h index 2e04bb2901..6570d560e3 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h @@ -118,12 +118,13 @@ public: [[nodiscard]] rpl::producer fileChosen() const; [[nodiscard]] rpl::producer photoChosen() const; [[nodiscard]] rpl::producer scrollRequests() const; - [[nodiscard]] rpl::producer> keyEvents() const; [[nodiscard]] rpl::producer inlineResultChosen() const; [[nodiscard]] rpl::producer sendActionUpdates() const; [[nodiscard]] rpl::producer> viewportEvents() const; [[nodiscard]] auto scrollKeyEvents() const -> rpl::producer>; + [[nodiscard]] auto editLastMessageRequests() const + -> rpl::producer>; using MimeDataHook = Fn data, @@ -294,6 +295,7 @@ private: rpl::event_stream _sendActionUpdates; rpl::event_stream _sendCommandRequests; rpl::event_stream> _scrollKeyEvents; + rpl::event_stream> _editLastMessageRequests; TextUpdateEvents _textUpdateEvents = TextUpdateEvents() | TextUpdateEvent::SaveDraft diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index c639b9bcf3..fe21642b30 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "history/view/history_view_list_widget.h" +#include "base/unixtime.h" #include "history/history_message.h" #include "history/history_item_components.h" #include "history/history_item_text.h" @@ -2725,10 +2726,27 @@ rpl::producer ListWidget::editMessageRequested() const { return _requestedToEditMessage.events(); } -void ListWidget::editMessageRequestNotify(FullMsgId item) { +void ListWidget::editMessageRequestNotify(FullMsgId item) const { _requestedToEditMessage.fire(std::move(item)); } +bool ListWidget::lastMessageEditRequestNotify() const { + const auto now = base::unixtime::now(); + auto proj = [&](not_null view) { + return view->data()->allowsEdit(now); + }; + const auto &list = ranges::view::reverse(_items); + const auto it = ranges::find_if(list, std::move(proj)); + if (it == end(list)) { + return false; + } else { + const auto item = + session().data().groups().findItemToEdit((*it)->data()).get(); + editMessageRequestNotify(item->fullId()); + return true; + } +} + rpl::producer ListWidget::replyToMessageRequested() const { return _requestedToReplyToMessage.events(); } diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.h b/Telegram/SourceFiles/history/view/history_view_list_widget.h index d01e5dd060..95a2174cd0 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.h @@ -206,7 +206,8 @@ public: bool tooltipWindowActive() const override; [[nodiscard]] rpl::producer editMessageRequested() const; - void editMessageRequestNotify(FullMsgId item); + void editMessageRequestNotify(FullMsgId item) const; + [[nodiscard]] bool lastMessageEditRequestNotify() const; [[nodiscard]] rpl::producer replyToMessageRequested() const; void replyToMessageRequestNotify(FullMsgId item); [[nodiscard]] rpl::producer readMessageRequested() const; diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index 25f9e2566f..9044de419c 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -493,19 +493,10 @@ void RepliesWidget::setupComposeControls() { _scroll->keyPressEvent(e); }, lifetime()); - _composeControls->keyEvents( + _composeControls->editLastMessageRequests( ) | rpl::start_with_next([=](not_null e) { - if (e->key() == Qt::Key_Up) { - if (!_composeControls->isEditingMessage()) { - if (const auto item = _replies->lastEditableMessage()) { - _inner->editMessageRequestNotify(item->fullId()); - } else { - _scroll->keyPressEvent(e); - } - } else { - _scroll->keyPressEvent(e); - } - e->accept(); + if (!_inner->lastMessageEditRequestNotify()) { + _scroll->keyPressEvent(e); } }, lifetime()); diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp index 690315db98..f2d11d08ee 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp @@ -236,21 +236,10 @@ void ScheduledWidget::setupComposeControls() { _scroll->keyPressEvent(e); }, lifetime()); - _composeControls->keyEvents( + _composeControls->editLastMessageRequests( ) | rpl::start_with_next([=](not_null e) { - if (e->key() == Qt::Key_Up) { - if (!_composeControls->isEditingMessage()) { - const auto item = session().data().scheduledMessages() - .lastEditableMessage(_history); - if (item) { - _inner->editMessageRequestNotify(item->fullId()); - } else { - _scroll->keyPressEvent(e); - } - } else { - _scroll->keyPressEvent(e); - } - e->accept(); + if (!_inner->lastMessageEditRequestNotify()) { + _scroll->keyPressEvent(e); } }, lifetime());