aboutsummaryrefslogtreecommitdiff
path: root/ui.qt/src/Document.cpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2022-07-01 18:12:31 +0000
committerrtk0c <[email protected]>2022-07-01 18:12:31 +0000
commitb992ae0fa4d792002ffae10a9ef893ef4fa42ac4 (patch)
treeb3bfd176df672eefd9a6a627bfeddd03f22cf458 /ui.qt/src/Document.cpp
parentfa744c91b0b15d5978e915816e712e388ead7e64 (diff)
Convert hardcoding files in CMakeLists.txt to file(GLOB)
git-svn-id: file:///home/arch/svn/epistmool/trunk@8 71f44415-077c-4ad7-a976-72ddbf76608f
Diffstat (limited to 'ui.qt/src/Document.cpp')
-rw-r--r--ui.qt/src/Document.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/ui.qt/src/Document.cpp b/ui.qt/src/Document.cpp
new file mode 100644
index 0000000..272ac4c
--- /dev/null
+++ b/ui.qt/src/Document.cpp
@@ -0,0 +1,152 @@
+#include "Document.hpp"
+
+#include <QBrush>
+#include <QColor>
+#include <QTextCursor>
+#include <QVariant>
+
+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);
+}