From d64e6fc206bd72a03ba19119994f4fa9286534ec Mon Sep 17 00:00:00 2001 From: James Graham Date: Thu, 8 Jan 2026 19:23:50 +0000 Subject: [PATCH] Change editing so that going up or down from a code or quote a para will be added if one doesn't exist so that the block can te typed around --- src/libneochat/chatkeyhelper.cpp | 6 +--- src/libneochat/chatkeyhelper.h | 3 ++ .../models/chatbarmessagecontentmodel.cpp | 36 +++++++++++++++++-- .../models/chatbarmessagecontentmodel.h | 2 ++ 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/libneochat/chatkeyhelper.cpp b/src/libneochat/chatkeyhelper.cpp index 978eb43b0..c207251a0 100644 --- a/src/libneochat/chatkeyhelper.cpp +++ b/src/libneochat/chatkeyhelper.cpp @@ -3,6 +3,7 @@ #include "chatkeyhelper.h" +#include "chatbarcache.h" #include "chattextitemhelper.h" #include "clipboard.h" #include "neochatroom.h" @@ -58,11 +59,6 @@ bool ChatKeyHelper::up(Qt::KeyboardModifiers modifiers) return true; } - if (textItem->isEmpty()) { - room->editLastMessage(); - return true; - } - if (textItem->isCompleting) { Q_EMIT unhandledUp(true); return true; diff --git a/src/libneochat/chatkeyhelper.h b/src/libneochat/chatkeyhelper.h index d11d7e00d..86a64b477 100644 --- a/src/libneochat/chatkeyhelper.h +++ b/src/libneochat/chatkeyhelper.h @@ -40,6 +40,9 @@ public: */ QPointer textItem; + /** + * @brief handle the given key and modifiers. + */ Q_INVOKABLE bool handleKey(Qt::Key key, Qt::KeyboardModifiers modifiers); Q_SIGNALS: diff --git a/src/messagecontent/models/chatbarmessagecontentmodel.cpp b/src/messagecontent/models/chatbarmessagecontentmodel.cpp index 22b268c27..de3c559dd 100644 --- a/src/messagecontent/models/chatbarmessagecontentmodel.cpp +++ b/src/messagecontent/models/chatbarmessagecontentmodel.cpp @@ -4,6 +4,7 @@ #include "chatbarmessagecontentmodel.h" #include +#include #include "chatbarcache.h" #include "chatkeyhelper.h" @@ -133,13 +134,17 @@ void ChatBarMessageContentModel::connectKeyHelper() if (isCompleting) { return; } - setFocusRow(m_currentFocusComponent.row() - 1); + if (!m_room->editCache()->isEditing() && m_currentFocusComponent.row() <= 0 && focusedTextItem()->isEmpty()) { + m_room->editLastMessage(); + return; + } + handleBlockTransition(true); }); connect(m_keyHelper, &ChatKeyHelper::unhandledDown, this, [this](bool isCompleting) { if (isCompleting) { return; } - setFocusRow(m_currentFocusComponent.row() + 1); + handleBlockTransition(false); }); connect(m_keyHelper, &ChatKeyHelper::unhandledDelete, this, [this]() { const auto currentRow = m_currentFocusComponent.row(); @@ -460,6 +465,33 @@ void ChatBarMessageContentModel::removeComponent(ChatTextItemHelper *textItem) } } +void ChatBarMessageContentModel::handleBlockTransition(bool up) +{ + const auto currentRow = m_currentFocusComponent.row(); + const auto insertRow = currentRow + (up ? 0 : 1); + const auto atEdge = up ? currentRow <= 0 : currentRow >= rowCount() - 1; + const auto notText = focusType() != MessageComponentType::Text; + if (atEdge && notText) { + insertComponent(insertRow, MessageComponentType::Text); + setFocusRow(insertRow); + return; + } + + const auto nextRow = currentRow + (up ? -1 : 1); + const auto nextNotText = m_components[nextRow].type != MessageComponentType::Text; + if (notText && nextNotText) { + insertComponent(insertRow, MessageComponentType::Text); + setFocusRow(insertRow); + return; + } + + const auto currentItemEmptyText = focusedTextItem()->isEmpty() && focusType() == MessageComponentType::Text; + setFocusRow(nextRow); + if (currentItemEmptyText && !atEdge) { + removeComponent(currentRow); + } +} + void ChatBarMessageContentModel::updateCache() const { if (m_type == ChatBarType::None || !m_room) { diff --git a/src/messagecontent/models/chatbarmessagecontentmodel.h b/src/messagecontent/models/chatbarmessagecontentmodel.h index c7983a179..cde18d3c6 100644 --- a/src/messagecontent/models/chatbarmessagecontentmodel.h +++ b/src/messagecontent/models/chatbarmessagecontentmodel.h @@ -111,6 +111,8 @@ private: ComponentIt removeComponent(ComponentIt it); void removeComponent(ChatTextItemHelper *textItem); + void handleBlockTransition(bool up); + void updateCache() const; QString messageText() const;