diff --git a/src/utils/editor/documenthandler.cpp b/src/utils/editor/documenthandler.cpp index d364f7d..a569734 100644 --- a/src/utils/editor/documenthandler.cpp +++ b/src/utils/editor/documenthandler.cpp @@ -1,464 +1,480 @@ /**************************************************************************** -** -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ + * * + ** Copyright (C) 2017 The Qt Company Ltd. + ** Contact: https://www.qt.io/licensing/ + ** + ** This file is part of the examples of the Qt Toolkit. + ** + ** $QT_BEGIN_LICENSE:BSD$ + ** Commercial License Usage + ** Licensees holding valid commercial Qt licenses may use this file in + ** accordance with the commercial license agreement provided with the + ** Software or, alternatively, in accordance with the terms contained in + ** a written agreement between you and The Qt Company. For licensing terms + ** and conditions see https://www.qt.io/terms-conditions. For further + ** information use the contact form at https://www.qt.io/contact-us. + ** + ** BSD License Usage + ** Alternatively, you may use this file under the terms of the BSD license + ** as follows: + ** + ** "Redistribution and use in source and binary forms, with or without + ** modification, are permitted provided that the following conditions are + ** met: + ** * Redistributions of source code must retain the above copyright + ** notice, this list of conditions and the following disclaimer. + ** * Redistributions in binary form must reproduce the above copyright + ** notice, this list of conditions and the following disclaimer in + ** the documentation and/or other materials provided with the + ** distribution. + ** * Neither the name of The Qt Company Ltd nor the names of its + ** contributors may be used to endorse or promote products derived + ** from this software without specific prior written permission. + ** + ** + ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." + ** + ** $QT_END_LICENSE$ + ** + ****************************************************************************/ #include "documenthandler.h" #include #include #include #include #include #include #include #include #include #include #include +#include #include "fmh.h" #include "syntaxhighlighterutil.h" /** * Global Variables */ SyntaxHighlighterUtil *DocumentHandler::syntaxHighlighterUtil = nullptr; void FileLoader::loadFile(const QUrl& url) { - if (FMH::fileExists(url)) + if (FMH::fileExists(url)) { - QFile file(url.toLocalFile()); - if (file.open(QFile::ReadOnly)) + QFile file(url.toLocalFile()); + if (file.open(QFile::ReadOnly)) { qDebug()<< "LOAD FILE OPENDED << "; const auto array = file.readAll(); const bool isHtml = QFileInfo(url.toLocalFile()).suffix().contains(QLatin1String("htm")); QTextCodec *codec = isHtml ? QTextCodec::codecForHtml(array) : QTextCodec::codecForUtfText(array, QTextCodec::codecForLocale()); emit this->fileReady(codec->toUnicode(array), url); - } - } + } + } } DocumentHandler::DocumentHandler(QObject *parent) - : QObject(parent) - , m_document(nullptr) - , m_cursorPosition(-1) - , m_selectionStart(0) - , m_selectionEnd(0) +: QObject(parent) +, m_document(nullptr) +, m_watcher(new QFileSystemWatcher(this)) +, m_cursorPosition(-1) +, m_selectionStart(0) +, m_selectionEnd(0) { + + //start file loader thread implementation FileLoader *m_loader = new FileLoader; - m_loader->moveToThread(&m_worker); - connect(&m_worker, &QThread::finished, m_loader, &QObject::deleteLater); - connect(this, &DocumentHandler::loadFile, m_loader, &FileLoader::loadFile); - connect(m_loader, &FileLoader::fileReady, [&](QString array, QUrl url) - { + m_loader->moveToThread(&m_worker); + connect(&m_worker, &QThread::finished, m_loader, &QObject::deleteLater); + connect(this, &DocumentHandler::loadFile, m_loader, &FileLoader::loadFile); + connect(m_loader, &FileLoader::fileReady, [&](QString array, QUrl url) + { if (QTextDocument *doc = textDocument()) doc->setModified(false); - this->isRich = QFileInfo(url.toLocalFile()).suffix().contains(QLatin1String("rtf"));// - emit this->isRichChanged(); + this->isRich = QFileInfo(url.toLocalFile()).suffix().contains(QLatin1String("rtf"));// + emit this->isRichChanged(); this->setText(array); emit this->loaded(url); - reset(); - }); - - m_worker.start(); + reset(); + }); + + m_worker.start(); + + //end file loader thread implementation + + connect(this->m_watcher, &QFileSystemWatcher::fileChanged, [&](QString url) + { + if(this->fileUrl() == QUrl::fromLocalFile(url)) + { + emit this->loadFile(this->fileUrl()); + } + }); } DocumentHandler::~DocumentHandler() { m_worker.quit(); m_worker.wait(); } void DocumentHandler::setText(const QString &text) { if (text != m_text) { m_text = text; emit textChanged(); } } QQuickTextDocument *DocumentHandler::document() const { - return m_document; + return m_document; } void DocumentHandler::setDocument(QQuickTextDocument *document) { - if (document == m_document) - return; - - m_document = document; - emit documentChanged(); + if (document == m_document) + return; + + m_document = document; + emit documentChanged(); } int DocumentHandler::cursorPosition() const { - return m_cursorPosition; + return m_cursorPosition; } void DocumentHandler::setCursorPosition(int position) { - if (position == m_cursorPosition) - return; - - m_cursorPosition = position; - reset(); - emit cursorPositionChanged(); + if (position == m_cursorPosition) + return; + + m_cursorPosition = position; + reset(); + emit cursorPositionChanged(); } int DocumentHandler::selectionStart() const { - return m_selectionStart; + return m_selectionStart; } void DocumentHandler::setSelectionStart(int position) { - if (position == m_selectionStart) - return; - - m_selectionStart = position; - emit selectionStartChanged(); + if (position == m_selectionStart) + return; + + m_selectionStart = position; + emit selectionStartChanged(); } int DocumentHandler::selectionEnd() const { - return m_selectionEnd; + return m_selectionEnd; } void DocumentHandler::setSelectionEnd(int position) { - if (position == m_selectionEnd) - return; - - m_selectionEnd = position; - emit selectionEndChanged(); + if (position == m_selectionEnd) + return; + + m_selectionEnd = position; + emit selectionEndChanged(); } QString DocumentHandler::fontFamily() const { - QTextCursor cursor = textCursor(); - if (cursor.isNull()) - return QString(); - QTextCharFormat format = cursor.charFormat(); - return format.font().family(); + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return QString(); + QTextCharFormat format = cursor.charFormat(); + return format.font().family(); } void DocumentHandler::setFontFamily(const QString &family) { - QTextCharFormat format; - format.setFontFamily(family); - mergeFormatOnWordOrSelection(format); - emit fontFamilyChanged(); + QTextCharFormat format; + format.setFontFamily(family); + mergeFormatOnWordOrSelection(format); + emit fontFamilyChanged(); } QColor DocumentHandler::textColor() const { - QTextCursor cursor = textCursor(); - if (cursor.isNull()) - return QColor(Qt::black); - QTextCharFormat format = cursor.charFormat(); - return format.foreground().color(); + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return QColor(Qt::black); + QTextCharFormat format = cursor.charFormat(); + return format.foreground().color(); } void DocumentHandler::setTextColor(const QColor &color) { - QTextCharFormat format; - format.setForeground(QBrush(color)); - mergeFormatOnWordOrSelection(format); - emit textColorChanged(); + QTextCharFormat format; + format.setForeground(QBrush(color)); + mergeFormatOnWordOrSelection(format); + emit textColorChanged(); } Qt::Alignment DocumentHandler::alignment() const { - QTextCursor cursor = textCursor(); - if (cursor.isNull()) - return Qt::AlignLeft; - return textCursor().blockFormat().alignment(); + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return Qt::AlignLeft; + return textCursor().blockFormat().alignment(); } void DocumentHandler::setAlignment(Qt::Alignment alignment) { - QTextBlockFormat format; - format.setAlignment(alignment); - QTextCursor cursor = textCursor(); - cursor.mergeBlockFormat(format); - emit alignmentChanged(); + QTextBlockFormat format; + format.setAlignment(alignment); + QTextCursor cursor = textCursor(); + cursor.mergeBlockFormat(format); + emit alignmentChanged(); } bool DocumentHandler::bold() const { - QTextCursor cursor = textCursor(); - if (cursor.isNull()) - return false; - return textCursor().charFormat().fontWeight() == QFont::Bold; + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return false; + return textCursor().charFormat().fontWeight() == QFont::Bold; } void DocumentHandler::setBold(bool bold) { - QTextCharFormat format; - format.setFontWeight(bold ? QFont::Bold : QFont::Normal); - mergeFormatOnWordOrSelection(format); - emit boldChanged(); + QTextCharFormat format; + format.setFontWeight(bold ? QFont::Bold : QFont::Normal); + mergeFormatOnWordOrSelection(format); + emit boldChanged(); } bool DocumentHandler::uppercase() const { - QTextCursor cursor = textCursor(); - if (cursor.isNull()) - return false; - return textCursor().charFormat().fontCapitalization() == QFont::AllUppercase; + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return false; + return textCursor().charFormat().fontCapitalization() == QFont::AllUppercase; } void DocumentHandler::setUppercase(bool uppercase) { - QTextCharFormat format; - format.setFontCapitalization(uppercase ? QFont::AllUppercase : QFont::AllLowercase); - mergeFormatOnWordOrSelection(format); - emit uppercaseChanged(); + QTextCharFormat format; + format.setFontCapitalization(uppercase ? QFont::AllUppercase : QFont::AllLowercase); + mergeFormatOnWordOrSelection(format); + emit uppercaseChanged(); } bool DocumentHandler::italic() const { - QTextCursor cursor = textCursor(); - if (cursor.isNull()) - return false; - return textCursor().charFormat().fontItalic(); + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return false; + return textCursor().charFormat().fontItalic(); } void DocumentHandler::setItalic(bool italic) { - QTextCharFormat format; - format.setFontItalic(italic); - mergeFormatOnWordOrSelection(format); - emit italicChanged(); + QTextCharFormat format; + format.setFontItalic(italic); + mergeFormatOnWordOrSelection(format); + emit italicChanged(); } bool DocumentHandler::underline() const { - QTextCursor cursor = textCursor(); - if (cursor.isNull()) - return false; - return textCursor().charFormat().fontUnderline(); + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return false; + return textCursor().charFormat().fontUnderline(); } void DocumentHandler::setUnderline(bool underline) { - QTextCharFormat format; - format.setFontUnderline(underline); - mergeFormatOnWordOrSelection(format); - emit underlineChanged(); + QTextCharFormat format; + format.setFontUnderline(underline); + mergeFormatOnWordOrSelection(format); + emit underlineChanged(); } bool DocumentHandler::getIsRich() const { - return this->isRich; + return this->isRich; } int DocumentHandler::fontSize() const { - QTextCursor cursor = textCursor(); - if (cursor.isNull()) - return 0; - QTextCharFormat format = cursor.charFormat(); - return format.font().pointSize(); + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return 0; + QTextCharFormat format = cursor.charFormat(); + return format.font().pointSize(); } void DocumentHandler::setFontSize(int size) { - if (size <= 0) - return; - - QTextCursor cursor = textCursor(); - if (cursor.isNull()) - return; - - if (!cursor.hasSelection()) - cursor.select(QTextCursor::WordUnderCursor); - - if (cursor.charFormat().property(QTextFormat::FontPointSize).toInt() == size) - return; - - QTextCharFormat format; - format.setFontPointSize(size); - mergeFormatOnWordOrSelection(format); - emit fontSizeChanged(); + if (size <= 0) + return; + + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return; + + if (!cursor.hasSelection()) + cursor.select(QTextCursor::WordUnderCursor); + + if (cursor.charFormat().property(QTextFormat::FontPointSize).toInt() == size) + return; + + QTextCharFormat format; + format.setFontPointSize(size); + mergeFormatOnWordOrSelection(format); + emit fontSizeChanged(); } QString DocumentHandler::fileName() const { - const QString filePath = QQmlFile::urlToLocalFileOrQrc(m_fileUrl); - const QString fileName = QFileInfo(filePath).fileName(); - if (fileName.isEmpty()) - return QStringLiteral("untitled.txt"); - return fileName; + const QString filePath = QQmlFile::urlToLocalFileOrQrc(m_fileUrl); + const QString fileName = QFileInfo(filePath).fileName(); + if (fileName.isEmpty()) + return QStringLiteral("untitled.txt"); + return fileName; } QString DocumentHandler::fileType() const { - return QFileInfo(fileName()).suffix(); + return QFileInfo(fileName()).suffix(); } QUrl DocumentHandler::fileUrl() const { - return m_fileUrl; + return m_fileUrl; } SyntaxHighlighterUtil * DocumentHandler::getSyntaxHighlighterUtil() { if (!DocumentHandler::syntaxHighlighterUtil) DocumentHandler::syntaxHighlighterUtil = new SyntaxHighlighterUtil(); return DocumentHandler::syntaxHighlighterUtil; } void DocumentHandler::load(const QUrl &fileUrl) { qDebug()<< "TRYING TO LOAD FILE << " << fileUrl; - if (fileUrl == m_fileUrl) - return; - - QQmlEngine *engine = qmlEngine(this); - if (!engine) - { - qWarning() << "load() called before DocumentHandler has QQmlEngine"; - return; - } - - const QUrl path = QQmlFileSelector::get(engine)->selector()->select(fileUrl); - const QString fileName = QQmlFile::urlToLocalFileOrQrc(path); - - m_fileUrl = fileUrl; - emit fileUrlChanged(); + if (fileUrl == m_fileUrl) + return; + + QQmlEngine *engine = qmlEngine(this); + if (!engine) + { + qWarning() << "load() called before DocumentHandler has QQmlEngine"; + return; + } + + const QUrl path = QQmlFileSelector::get(engine)->selector()->select(fileUrl); + const QString fileName = QQmlFile::urlToLocalFileOrQrc(path); - emit this->loadFile(m_fileUrl); + m_fileUrl = fileUrl; + emit fileUrlChanged(); + + this->m_watcher->addPath(m_fileUrl.toLocalFile()); + + emit this->loadFile(m_fileUrl); } void DocumentHandler::saveAs(const QUrl &fileUrl) { - QTextDocument *doc = textDocument(); - if (!doc) - return; - - const QString filePath = fileUrl.toLocalFile(); - const bool isHtml = QFileInfo(filePath).suffix().contains(QLatin1String("htm")); + QTextDocument *doc = textDocument(); + if (!doc) + return; + + const QString filePath = fileUrl.toLocalFile(); + const bool isHtml = QFileInfo(filePath).suffix().contains(QLatin1String("htm")); QFile file(filePath); if (!file.open(QFile::WriteOnly | QFile::Truncate | (isHtml ? QFile::NotOpen : QFile::Text))) { emit error(tr("Cannot save: ") + file.errorString()); } else { QTextStream out(&file); out.setCodec("UTF-8"); out << (isHtml ? doc->toHtml() : doc->toPlainText()).toUtf8(); file.close(); if (fileUrl == m_fileUrl) return; m_fileUrl = fileUrl; emit fileUrlChanged(); doc->setModified(false); } } void DocumentHandler::reset() { - emit fontFamilyChanged(); - emit alignmentChanged(); - emit boldChanged(); - emit italicChanged(); - emit underlineChanged(); - emit fontSizeChanged(); - emit textColorChanged(); + emit fontFamilyChanged(); + emit alignmentChanged(); + emit boldChanged(); + emit italicChanged(); + emit underlineChanged(); + emit fontSizeChanged(); + emit textColorChanged(); } QTextCursor DocumentHandler::textCursor() const { - QTextDocument *doc = textDocument(); - if (!doc) - return QTextCursor(); - - QTextCursor cursor = QTextCursor(doc); - if (m_selectionStart != m_selectionEnd) { - cursor.setPosition(m_selectionStart); - cursor.setPosition(m_selectionEnd, QTextCursor::KeepAnchor); - } else { - cursor.setPosition(m_cursorPosition); - } - return cursor; + QTextDocument *doc = textDocument(); + if (!doc) + return QTextCursor(); + + QTextCursor cursor = QTextCursor(doc); + if (m_selectionStart != m_selectionEnd) { + cursor.setPosition(m_selectionStart); + cursor.setPosition(m_selectionEnd, QTextCursor::KeepAnchor); + } else { + cursor.setPosition(m_cursorPosition); + } + return cursor; } QTextDocument *DocumentHandler::textDocument() const { - if (!m_document) - return nullptr; - - return m_document->textDocument(); + if (!m_document) + return nullptr; + + return m_document->textDocument(); } void DocumentHandler::mergeFormatOnWordOrSelection(const QTextCharFormat &format) { - QTextCursor cursor = textCursor(); - if (!cursor.hasSelection()) - cursor.select(QTextCursor::WordUnderCursor); - cursor.mergeCharFormat(format); + QTextCursor cursor = textCursor(); + if (!cursor.hasSelection()) + cursor.select(QTextCursor::WordUnderCursor); + cursor.mergeCharFormat(format); } diff --git a/src/utils/editor/documenthandler.h b/src/utils/editor/documenthandler.h index a168cae..04050c7 100644 --- a/src/utils/editor/documenthandler.h +++ b/src/utils/editor/documenthandler.h @@ -1,213 +1,216 @@ /**************************************************************************** * * ** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, you may use this file under the terms of the BSD license ** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of The Qt Company Ltd nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef DOCUMENTHANDLER_H #define DOCUMENTHANDLER_H #include #include #include #include #include QT_BEGIN_NAMESPACE +class QFileSystemWatcher; class QTextDocument; class QQuickTextDocument; QT_END_NAMESPACE class FileLoader : public QObject { Q_OBJECT public slots: void loadFile(const QUrl &url); signals: void fileReady(QString array, QUrl url); }; class SyntaxHighlighterUtil; class DocumentHandler : public QObject { Q_OBJECT Q_PROPERTY(QQuickTextDocument *document READ document WRITE setDocument NOTIFY documentChanged) Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged) Q_PROPERTY(int selectionStart READ selectionStart WRITE setSelectionStart NOTIFY selectionStartChanged) Q_PROPERTY(int selectionEnd READ selectionEnd WRITE setSelectionEnd NOTIFY selectionEndChanged) Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor NOTIFY textColorChanged) Q_PROPERTY(QString fontFamily READ fontFamily WRITE setFontFamily NOTIFY fontFamilyChanged) Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged) Q_PROPERTY(bool bold READ bold WRITE setBold NOTIFY boldChanged) Q_PROPERTY(bool uppercase READ uppercase WRITE setUppercase NOTIFY uppercaseChanged) Q_PROPERTY(bool italic READ italic WRITE setItalic NOTIFY italicChanged) Q_PROPERTY(bool underline READ underline WRITE setUnderline NOTIFY underlineChanged) Q_PROPERTY(bool isRich READ getIsRich NOTIFY isRichChanged) Q_PROPERTY(int fontSize READ fontSize WRITE setFontSize NOTIFY fontSizeChanged) Q_PROPERTY(QString fileName READ fileName NOTIFY fileUrlChanged) Q_PROPERTY(QString fileType READ fileType NOTIFY fileUrlChanged) Q_PROPERTY(QUrl fileUrl READ fileUrl NOTIFY fileUrlChanged) Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) Q_PROPERTY(SyntaxHighlighterUtil * syntaxHighlighterUtil READ getSyntaxHighlighterUtil CONSTANT FINAL) public: explicit DocumentHandler(QObject *parent = nullptr); ~DocumentHandler(); QQuickTextDocument *document() const; void setDocument(QQuickTextDocument *document); int cursorPosition() const; void setCursorPosition(int position); int selectionStart() const; void setSelectionStart(int position); int selectionEnd() const; void setSelectionEnd(int position); QString fontFamily() const; void setFontFamily(const QString &family); QColor textColor() const; void setTextColor(const QColor &color); Qt::Alignment alignment() const; void setAlignment(Qt::Alignment alignment); bool bold() const; void setBold(bool bold); bool uppercase() const; void setUppercase(bool uppercase); bool italic() const; void setItalic(bool italic); bool underline() const; void setUnderline(bool underline); bool getIsRich() const; int fontSize() const; void setFontSize(int size); QString fileName() const; QString fileType() const; QUrl fileUrl() const; inline QString text() { return m_text; } void setText(const QString &text); static SyntaxHighlighterUtil * getSyntaxHighlighterUtil(); public slots: void load(const QUrl &fileUrl); void saveAs(const QUrl &fileUrl); signals: void documentChanged(); void cursorPositionChanged(); void selectionStartChanged(); void selectionEndChanged(); void fontFamilyChanged(); void textColorChanged(); void alignmentChanged(); void boldChanged(); void uppercaseChanged(); void italicChanged(); void underlineChanged(); void isRichChanged(); void fontSizeChanged(); void textChanged(); void fileUrlChanged(); void loaded(const QUrl &url); void error(const QString &message); void loadFile(QUrl url); private: void reset(); QTextCursor textCursor() const; QTextDocument *textDocument() const; void mergeFormatOnWordOrSelection(const QTextCharFormat &format); QQuickTextDocument *m_document; + QFileSystemWatcher *m_watcher; int m_cursorPosition; int m_selectionStart; int m_selectionEnd; bool isRich = false; QFont m_font; int m_fontSize; QUrl m_fileUrl; - QThread m_worker; - + QThread m_worker; QString m_text; + + static SyntaxHighlighterUtil *syntaxHighlighterUtil; }; #endif // DOCUMENTHANDLER_H