aboutsummaryrefslogtreecommitdiff
path: root/ui.qt/source/document.cpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2022-06-27 00:10:58 +0000
committerrtk0c <[email protected]>2022-06-27 00:10:58 +0000
commit9ad9af9f2596b91e1dd65e71543f75b0644e8283 (patch)
treef8190a9314a7602872de3b4910bac1a5201d0466 /ui.qt/source/document.cpp
parent753c26d320e894069157bd401f7779ad07073d7c (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.cpp144
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);
}