From f007e96fdfccee9c34b70dfcb0523ad2dcc05d09 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Sat, 3 Apr 2021 21:05:59 +0300 Subject: [PATCH] feat: add a quick edit workflow using the up arrow key neochat now supports a quick edit shortcut, which helps to edit the last message from the user in a room. Apply 1 suggestion(s) to 1 file(s) remove comment --- imports/NeoChat/Component/ChatBox/ChatBar.qml | 3 ++ imports/NeoChat/Component/ChatBox/ChatBox.qml | 4 +++ imports/NeoChat/Page/RoomPage.qml | 6 ++++ src/messageeventmodel.cpp | 35 +++++++++++++++++++ src/messageeventmodel.h | 1 + 5 files changed, 49 insertions(+) diff --git a/imports/NeoChat/Component/ChatBox/ChatBar.qml b/imports/NeoChat/Component/ChatBox/ChatBar.qml index 066fc6be2..d0b8e27d5 100644 --- a/imports/NeoChat/Component/ChatBox/ChatBar.qml +++ b/imports/NeoChat/Component/ChatBox/ChatBar.qml @@ -28,6 +28,7 @@ ToolBar { signal inputFieldForceActiveFocusTriggered() signal messageSent() signal pasteImageTriggered() + signal editLastUserMessage() property alias isCompleting: completionMenu.visible @@ -141,6 +142,8 @@ ToolBar { switchRoomUp(); } else if (event.key === Qt.Key_V && event.modifiers & Qt.ControlModifier) { chatBar.pasteImage(); + } else if (event.key === Qt.Key_Up && !(event.modifiers & Qt.ControlModifier)) { + editLastUserMessage(); } } diff --git a/imports/NeoChat/Component/ChatBox/ChatBox.qml b/imports/NeoChat/Component/ChatBox/ChatBox.qml index 72196c219..9d5d1c6f0 100644 --- a/imports/NeoChat/Component/ChatBox/ChatBox.qml +++ b/imports/NeoChat/Component/ChatBox/ChatBox.qml @@ -17,6 +17,7 @@ Item { signal fancyEffectsReasonFound(string fancyEffect) signal messageSent() + signal editLastUserMessage() Kirigami.Theme.colorSet: Kirigami.Theme.View @@ -153,6 +154,9 @@ Item { checkForFancyEffectsReason() root.messageSent(); } + onEditLastUserMessage: { + root.editLastUserMessage(); + } } function checkForFancyEffectsReason() { diff --git a/imports/NeoChat/Page/RoomPage.qml b/imports/NeoChat/Page/RoomPage.qml index 3513e8b3d..b5310799d 100644 --- a/imports/NeoChat/Page/RoomPage.qml +++ b/imports/NeoChat/Page/RoomPage.qml @@ -651,6 +651,12 @@ Kirigami.ScrollablePage { goToLastMessage(); } } + onEditLastUserMessage: { + const targetMessage = messageEventModel.getLastLocalUserMessageEventId(); + if (targetMessage) { + ChatBoxHelper.edit(targetMessage["body"], targetMessage["body"], targetMessage["event_id"]); + } + } } background: FancyEffectsContainer { diff --git a/src/messageeventmodel.cpp b/src/messageeventmodel.cpp index 2810ab29b..0443ccf31 100644 --- a/src/messageeventmodel.cpp +++ b/src/messageeventmodel.cpp @@ -632,3 +632,38 @@ int MessageEventModel::eventIDToIndex(const QString &eventID) const } return it - m_currentRoom->messageEvents().rbegin() + timelineBaseIndex(); } + +QVariant MessageEventModel::getLastLocalUserMessageEventId() +{ + QVariantMap targetMessage; + const auto &timelineBottom = m_currentRoom->messageEvents().rbegin(); + + // set a cap limit of 35 messages, to prevent loading a lot of messages + // in rooms where the user has not sent many messages + const auto limit = timelineBottom + std::min(35, m_currentRoom->timelineSize()); + + for (auto it = timelineBottom; it != limit; ++it) { + auto evt = it->event(); + auto e = eventCast(evt); + + // check if the current message's sender's id is same as the user's id + if ((*it)->senderId() == m_currentRoom->localUser()->id()) { + auto content = (*it)->contentJson(); + + if (content.contains("m.relates_to")) { + // the message has been edited once + // so we have to return the id of the related' message instead + targetMessage.insert("event_id",content["m.relates_to"].toObject()["event_id"].toString()); + targetMessage.insert("body", content["formatted_body"].toString()); + return targetMessage; + } + + if (e->msgtype() == MessageEventType::Text) { + targetMessage.insert("event_id", (*it)->id()); + targetMessage.insert("body", content["body"].toString()); + return targetMessage; + } + } + } + return targetMessage; +} diff --git a/src/messageeventmodel.h b/src/messageeventmodel.h index dc06c2b55..f71210b32 100644 --- a/src/messageeventmodel.h +++ b/src/messageeventmodel.h @@ -69,6 +69,7 @@ public: [[nodiscard]] QHash roleNames() const override; Q_INVOKABLE [[nodiscard]] int eventIDToIndex(const QString &eventID) const; + Q_INVOKABLE [[nodiscard]] QVariant getLastLocalUserMessageEventId(); private Q_SLOTS: int refreshEvent(const QString &eventId);