#include "Document.hpp" #include #include #include #include DocumentHandler::DocumentHandler(QObject* parent) : QObject{ parent } { } QQuickTextDocument* DocumentHandler::getDoc() const { return mDoc; } void DocumentHandler::setDoc(QQuickTextDocument* newDoc) { if (mDoc != newDoc) { auto oldDoc = mDoc; mDoc = newDoc; if (oldDoc) { disconnect(oldDoc->textDocument(), nullptr, this, nullptr); } if (newDoc) { connect(newDoc->textDocument(), &QTextDocument::modificationChanged, this, [&]() { // TODO add a timer to wait for 1 second before updating? mModifyTime = QDateTime::currentDateTime(); emit modificationChanged(); }); } emit docChanged(oldDoc); } } const QDateTime& DocumentHandler::getModifyTime() const { return mModifyTime; } int DocumentHandler::getCursorPos() const { return mCursorPos; } void DocumentHandler::setCursorPos(int newCursorPos) { if (mCursorPos == newCursorPos) { return; } mCursorPos = newCursorPos; emit cursorPosChanged(); } int DocumentHandler::getSelectionBegin() const { return mSelectionBegin; } void DocumentHandler::setSelectionBegin(int newSelectionBegin) { if (mSelectionBegin == newSelectionBegin) { return; } mSelectionBegin = newSelectionBegin; emit selectionBeginChanged(); } int DocumentHandler::getSelectionEnd() const { return mSelectionEnd; } void DocumentHandler::setSelectionEnd(int newSelectionEnd) { if (mSelectionEnd == newSelectionEnd) { return; } mSelectionEnd = newSelectionEnd; emit selectionEndChanged(); } QFont DocumentHandler::getActiveFont() const { auto cursor = makeTextCursor(); if (cursor.isNull()) { return mDoc->textDocument()->defaultFont(); } auto format = cursor.charFormat(); return format.font(); } void DocumentHandler::setActiveFont(const QFont& font) { auto cursor = makeTextCursor(); if (!cursor.isNull() && cursor.charFormat().font() == font) { return; } QTextCharFormat format; format.setFont(font); mergeFormatOnWordOrSelection(format); emit activeFontChanged(); } QColor DocumentHandler::getActiveTextColor() const { auto cursor = makeTextCursor(); if (cursor.isNull()) { return QColor(Qt::black); } QTextCharFormat format = cursor.charFormat(); return format.foreground().color(); } void DocumentHandler::setActiveTextColor(const QColor& color) { QTextCharFormat format; format.setForeground(QBrush(color)); mergeFormatOnWordOrSelection(format); emit activeTextColorChanged(); } QTextCursor DocumentHandler::makeTextCursor() const { auto doc = mDoc->textDocument(); if (!doc) { return QTextCursor(); } QTextCursor cursor(doc); if (mSelectionBegin != mSelectionEnd) { cursor.setPosition(mSelectionBegin); cursor.setPosition(mSelectionEnd, QTextCursor::KeepAnchor); } else { cursor.setPosition(mCursorPos); } return cursor; } void DocumentHandler::mergeFormatOnWordOrSelection(const QTextCharFormat& format) { auto cursor = makeTextCursor(); if (!cursor.hasSelection()) { cursor.select(QTextCursor::WordUnderCursor); } cursor.mergeCharFormat(format); }