From 7a33425d1afc94606a58fddb32c75f93e491f6e0 Mon Sep 17 00:00:00 2001 From: Petr Mironychev <9195189+Palm1r@users.noreply.github.com> Date: Fri, 18 Apr 2025 19:06:17 +0200 Subject: [PATCH] feat: Add reset button to clean message list to specific message (#168) --- ChatView/ChatModel.cpp | 12 ++++++++++++ ChatView/ChatModel.hpp | 2 ++ ChatView/qml/ChatItem.qml | 23 +++++++++++++++++++++++ ChatView/qml/RootItem.qml | 8 ++++++++ 4 files changed, 45 insertions(+) diff --git a/ChatView/ChatModel.cpp b/ChatView/ChatModel.cpp index 85a2dd8..ce56563 100644 --- a/ChatView/ChatModel.cpp +++ b/ChatView/ChatModel.cpp @@ -197,4 +197,16 @@ QString ChatModel::lastMessageId() const return !m_messages.isEmpty() ? m_messages.last().id : ""; } +void ChatModel::resetModelTo(int index) +{ + if (index < 0 || index >= m_messages.size()) + return; + + if (index < m_messages.size() - 1) { + beginRemoveRows(QModelIndex(), index, m_messages.size() - 1); + m_messages.remove(index, m_messages.size() - index); + endRemoveRows(); + } +} + } // namespace QodeAssist::Chat diff --git a/ChatView/ChatModel.hpp b/ChatView/ChatModel.hpp index a49b5c5..a6580d1 100644 --- a/ChatView/ChatModel.hpp +++ b/ChatView/ChatModel.hpp @@ -73,6 +73,8 @@ public: QString currentModel() const; QString lastMessageId() const; + Q_INVOKABLE void resetModelTo(int index); + signals: void tokensThresholdChanged(); void modelReseted(); diff --git a/ChatView/qml/ChatItem.qml b/ChatView/qml/ChatItem.qml index e094361..c0c62cd 100644 --- a/ChatView/qml/ChatItem.qml +++ b/ChatView/qml/ChatItem.qml @@ -28,12 +28,19 @@ Rectangle { property alias msgModel: msgCreator.model property alias messageAttachments: attachmentsModel.model property bool isUserMessage: false + property int messageIndex: -1 + + signal resetChatToMessage(int index) height: msgColumn.implicitHeight + 10 radius: 8 color: isUserMessage ? palette.alternateBase : palette.base + HoverHandler { + id: mouse + } + ColumnLayout { id: msgColumn @@ -128,6 +135,22 @@ Rectangle { visible: root.isUserMessage } + QoAButton { + id: stopButtonId + + anchors { + right: parent.right + bottom: parent.bottom + bottomMargin: 2 + } + + text: qsTr("ResetTo") + visible: root.isUserMessage && mouse.hovered + onClicked: function() { + root.resetChatToMessage(root.messageIndex) + } + } + component TextComponent : TextBlock { required property var itemData height: implicitHeight + 10 diff --git a/ChatView/qml/RootItem.qml b/ChatView/qml/RootItem.qml index 502bf24..6b6f139 100644 --- a/ChatView/qml/RootItem.qml +++ b/ChatView/qml/RootItem.qml @@ -92,11 +92,19 @@ ChatRootView { delegate: ChatItem { required property var model + required property int index width: ListView.view.width - scroll.width msgModel: root.chatModel.processMessageContent(model.content) messageAttachments: model.attachments isUserMessage: model.roleType === ChatModel.User + messageIndex: index + + onResetChatToMessage: function(index) { + messageInput.text = model.content + messageInput.cursorPosition = model.content.length + root.chatModel.resetModelTo(index) + } } header: Item {