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;