Separate ChatButtonHelper from ChatDocumentHandler

This commit is contained in:
James Graham
2025-12-29 16:24:24 +00:00
parent 45163944d0
commit 22d7d90cf4
19 changed files with 606 additions and 434 deletions

View File

@@ -9,12 +9,17 @@
#include "chatdocumenthandler.h"
#include "enums/chatbartype.h"
#include "enums/messagecomponenttype.h"
#include "enums/richformat.h"
#include "messagecontentmodel.h"
#include "qmltextitemwrapper.h"
ChatBarMessageContentModel::ChatBarMessageContentModel(QObject *parent)
: MessageContentModel(parent)
, m_currentTextItem(new QmlTextItemWrapper(this))
, m_markdownHelper(new ChatMarkdownHelper(this))
{
m_editableActive = true;
connectCurentTextItem();
initializeModel();
connect(this, &ChatBarMessageContentModel::roomChanged, this, [this]() {
@@ -66,6 +71,19 @@ void ChatBarMessageContentModel::initializeModel()
Q_EMIT focusRowChanged();
}
void ChatBarMessageContentModel::connectCurentTextItem()
{
if (const auto docHandler = focusedDocumentHandler()) {
m_currentTextItem->setTextItem(docHandler->textItem());
}
connect(this, &ChatBarMessageContentModel::focusRowChanged, this, [this]() {
if (const auto docHandler = focusedDocumentHandler()) {
m_currentTextItem->setTextItem(docHandler->textItem());
m_markdownHelper->setTextItem(m_currentTextItem);
}
});
}
void ChatBarMessageContentModel::connectHandler(ChatDocumentHandler *handler)
{
connect(handler, &ChatDocumentHandler::contentsChanged, this, &ChatBarMessageContentModel::updateCache);
@@ -176,7 +194,6 @@ void ChatBarMessageContentModel::setFocusIndex(const QModelIndex &index, bool mo
}
}
Q_EMIT focusRowChanged();
emitFocusChangeSignals();
}
@@ -200,6 +217,11 @@ void ChatBarMessageContentModel::refocusCurrentComponent() const
chatDocumentHandler->textItem()->forceActiveFocus();
}
QmlTextItemWrapper *ChatBarMessageContentModel::currentTextItem() const
{
return m_currentTextItem;
}
ChatDocumentHandler *ChatBarMessageContentModel::focusedDocumentHandler() const
{
if (!m_currentFocusComponent.isValid()) {
@@ -214,6 +236,7 @@ ChatDocumentHandler *ChatBarMessageContentModel::focusedDocumentHandler() const
void ChatBarMessageContentModel::emitFocusChangeSignals()
{
Q_EMIT focusRowChanged();
Q_EMIT dataChanged(index(0), index(rowCount() - 1), {CurrentFocusRole});
}
@@ -298,7 +321,7 @@ void ChatBarMessageContentModel::insertComponentAtCursor(MessageComponentType::T
{
if (m_components[m_currentFocusComponent.row()].type == type) {
if (type == MessageComponentType::Text && focusedDocumentHandler()) {
focusedDocumentHandler()->setFormat(RichFormat::Paragraph);
currentTextItem()->mergeFormatOnCursor(RichFormat::Paragraph);
}
return;
}
@@ -324,7 +347,6 @@ void ChatBarMessageContentModel::insertComponentAtCursor(MessageComponentType::T
insertChatDocumentHandler->insertFragment(midFragment);
}
m_currentFocusComponent = QPersistentModelIndex(index(insertIt - m_components.begin()));
Q_EMIT focusRowChanged();
emitFocusChangeSignals();
}

View File

@@ -12,6 +12,7 @@
#include "enums/richformat.h"
#include "messagecomponent.h"
#include "models/messagecontentmodel.h"
#include "qmltextitemwrapper.h"
/**
* @class ChatBarMessageContentModel
@@ -38,6 +39,16 @@ class ChatBarMessageContentModel : public MessageContentModel
*/
Q_PROPERTY(MessageComponentType::Type focusType READ focusType NOTIFY focusRowChanged)
/**
* @brief The text item that the helper is interfacing with.
*
* This is a QQuickItem that is a TextEdit (or inherited from) wrapped in a QmlTextItemWrapper
* to provide easy access to properties and basic QTextDocument manipulation.
*
* @sa TextEdit, QTextDocument, QmlTextItemWrapper
*/
Q_PROPERTY(QmlTextItemWrapper *currentTextItem READ currentTextItem NOTIFY focusRowChanged)
/**
* @brief The ChatDocumentHandler of the model component that currently has focus.
*/
@@ -54,6 +65,7 @@ public:
Q_INVOKABLE void setFocusRow(int focusRow, bool mouse = false);
void setFocusIndex(const QModelIndex &index, bool mouse = false);
Q_INVOKABLE void refocusCurrentComponent() const;
QmlTextItemWrapper *currentTextItem() const;
ChatDocumentHandler *focusedDocumentHandler() const;
Q_INVOKABLE void insertStyleAtCursor(RichFormat::Format style);
@@ -79,6 +91,10 @@ private:
std::optional<QString> getReplyEventId() override;
QPointer<QmlTextItemWrapper> m_currentTextItem;
void connectCurentTextItem();
QPointer<ChatMarkdownHelper> m_markdownHelper;
void connectHandler(ChatDocumentHandler *handler);
ChatDocumentHandler *documentHandlerForComponent(const MessageComponent &component) const;
ChatDocumentHandler *documentHandlerForIndex(const QModelIndex &index) const;