diff options
author | rtk0c <[email protected]> | 2022-06-27 00:10:58 +0000 |
---|---|---|
committer | rtk0c <[email protected]> | 2022-06-27 00:10:58 +0000 |
commit | 9ad9af9f2596b91e1dd65e71543f75b0644e8283 (patch) | |
tree | f8190a9314a7602872de3b4910bac1a5201d0466 /ui.qt/source/document.cpp | |
parent | 753c26d320e894069157bd401f7779ad07073d7c (diff) |
(From git) Initial GUI setup for text document
git-svn-id: file:///home/arch/svn/epistmool/trunk@3 71f44415-077c-4ad7-a976-72ddbf76608f
Diffstat (limited to 'ui.qt/source/document.cpp')
-rw-r--r-- | ui.qt/source/document.cpp | 144 |
1 files changed, 109 insertions, 35 deletions
diff --git a/ui.qt/source/document.cpp b/ui.qt/source/document.cpp index b418b0d..377913b 100644 --- a/ui.qt/source/document.cpp +++ b/ui.qt/source/document.cpp @@ -1,35 +1,29 @@ #include "document.hpp" -#include <QMetaType> +#include <QBrush> +#include <QColor> +#include <QTextCursor> #include <QVariant> -DocumentBlock::DocumentBlock(QObject* parent) +DocumentHandler::DocumentHandler(QObject* parent) : QObject{ parent } { } -DocumentModel* DocumentBlock::getModel() const -{ - return mModel; -} - -void DocumentBlock::setModel(DocumentModel* newModel) -{ - mModel = newModel; -} - -QQuickTextDocument* DocumentBlock::getDoc() const +QQuickTextDocument* DocumentHandler::getDoc() const { return mDoc; } -void DocumentBlock::setDoc(QQuickTextDocument* newDoc) +void DocumentHandler::setDoc(QQuickTextDocument* newDoc) { if (mDoc != newDoc) { - if (mDoc) { - disconnect(mDoc->textDocument(), nullptr, this, nullptr); - } + 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? @@ -37,42 +31,122 @@ void DocumentBlock::setDoc(QQuickTextDocument* newDoc) emit modificationChanged(); }); } - emit docChanged(); + + emit docChanged(oldDoc); } } -const QDateTime& DocumentBlock::getModifyTime() const +const QDateTime& DocumentHandler::getModifyTime() const { return mModifyTime; } -void DocumentModel::appendBlock(DocumentBlock* block) +int DocumentHandler::getCursorPos() const +{ + return mCursorPos; +} + +void DocumentHandler::setCursorPos(int newCursorPos) { - mBlocks.push_back(block); + if (mCursorPos == newCursorPos) { + return; + } + mCursorPos = newCursorPos; + emit cursorPosChanged(); } -int DocumentModel::rowCount(const QModelIndex& parent) const +int DocumentHandler::getSelectionBegin() const { - return mBlocks.size(); + return mSelectionBegin; } -QVariant DocumentModel::data(const QModelIndex& index, int role) const +void DocumentHandler::setSelectionBegin(int newSelectionBegin) { - if (index.row() < 0 || index.row() >= mBlocks.size()) { - return QVariant(); + if (mSelectionBegin == newSelectionBegin) { + return; } + mSelectionBegin = newSelectionBegin; + emit selectionBeginChanged(); +} - switch (role) { - case Qt::DisplayRole: return QVariant::fromValue(mBlocks[index.row()]); - case ModifyTimeRole: return mBlocks[index.row()]->getModifyTime(); - default: return QVariant(); +int DocumentHandler::getSelectionEnd() const +{ + return mSelectionEnd; +} + +void DocumentHandler::setSelectionEnd(int newSelectionEnd) +{ + if (mSelectionEnd == newSelectionEnd) { + return; } + mSelectionEnd = newSelectionEnd; + emit selectionEndChanged(); } -QHash<int, QByteArray> DocumentModel::roleNames() const +QFont DocumentHandler::getActiveFont() const { - QHash<int, QByteArray> roles; - roles[Qt::DisplayRole] = "display", - roles[ModifyTimeRole] = "modifyTime"; - return roles; + 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); } |