diff options
author | Liang Qi <liang.qi@qt.io> | 2016-05-10 21:11:23 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-05-10 21:11:23 +0200 |
commit | c6713e212ef0b97c45d6466b73220567e94a05f1 (patch) | |
tree | 8774d26bf05f2087c510d16da42bfd0dc59a54b1 /examples/quickcontrols/controls/texteditor/src | |
parent | ce97d9c8ef4e6f8cb2166065b6732cad3cccf604 (diff) | |
parent | 0e00f9fa1cbdbdd2128f2ca31172d88f701ecb59 (diff) |
Merge remote-tracking branch 'origin/5.6' into 5.7
Conflicts:
examples/quickcontrols/extras/flat/main.cpp
src/controls/Private/qquickcontrolsettings.cpp
Change-Id: I9eb9342a2ee994611f3cb18daab6dd89eb924ccc
Diffstat (limited to 'examples/quickcontrols/controls/texteditor/src')
4 files changed, 598 insertions, 0 deletions
diff --git a/examples/quickcontrols/controls/texteditor/src/documenthandler.cpp b/examples/quickcontrols/controls/texteditor/src/documenthandler.cpp new file mode 100644 index 000000000..bdecf5ba1 --- /dev/null +++ b/examples/quickcontrols/controls/texteditor/src/documenthandler.cpp @@ -0,0 +1,345 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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 <QtGui/QTextDocument> +#include <QtGui/QTextCursor> +#include <QtGui/QFontDatabase> +#include <QtCore/QFileInfo> + +DocumentHandler::DocumentHandler() + : m_target(0) + , m_doc(0) + , m_cursorPosition(-1) + , m_selectionStart(0) + , m_selectionEnd(0) +{ +} + +void DocumentHandler::setTarget(QQuickItem *target) +{ + m_doc = 0; + m_target = target; + if (!m_target) + return; + + QVariant doc = m_target->property("textDocument"); + if (doc.canConvert<QQuickTextDocument*>()) { + QQuickTextDocument *qqdoc = doc.value<QQuickTextDocument*>(); + if (qqdoc) + m_doc = qqdoc->textDocument(); + } + emit targetChanged(); +} + +void DocumentHandler::setFileUrl(const QUrl &arg) +{ + if (m_fileUrl != arg) { + m_fileUrl = arg; + QString fileName = QQmlFile::urlToLocalFileOrQrc(arg); + if (QFile::exists(fileName)) { + QFile file(fileName); + if (file.open(QFile::ReadOnly)) { + QByteArray data = file.readAll(); + QTextCodec *codec = QTextCodec::codecForHtml(data); + setText(codec->toUnicode(data)); + if (m_doc) + m_doc->setModified(false); + if (fileName.isEmpty()) + m_documentTitle = QStringLiteral("untitled.txt"); + else + m_documentTitle = QFileInfo(fileName).fileName(); + + emit textChanged(); + emit documentTitleChanged(); + + reset(); + } + } + emit fileUrlChanged(); + } +} + +QString DocumentHandler::documentTitle() const +{ + return m_documentTitle; +} + +void DocumentHandler::setDocumentTitle(QString arg) +{ + if (m_documentTitle != arg) { + m_documentTitle = arg; + emit documentTitleChanged(); + } +} + +void DocumentHandler::setText(const QString &arg) +{ + if (m_text != arg) { + m_text = arg; + emit textChanged(); + } +} + +void DocumentHandler::saveAs(const QUrl &arg, const QString &fileType) +{ + bool isHtml = fileType.contains(QLatin1String("htm")); + QLatin1String ext(isHtml ? ".html" : ".txt"); + QString localPath = arg.toLocalFile(); + if (!localPath.endsWith(ext)) + localPath += ext; + QFile f(localPath); + if (!f.open(QFile::WriteOnly | QFile::Truncate | (isHtml ? QFile::NotOpen : QFile::Text))) { + emit error(tr("Cannot save: ") + f.errorString()); + return; + } + f.write((isHtml ? m_doc->toHtml() : m_doc->toPlainText()).toLocal8Bit()); + f.close(); + setFileUrl(QUrl::fromLocalFile(localPath)); +} + +QUrl DocumentHandler::fileUrl() const +{ + return m_fileUrl; +} + +QString DocumentHandler::text() const +{ + return m_text; +} + +void DocumentHandler::setCursorPosition(int position) +{ + if (position == m_cursorPosition) + return; + + m_cursorPosition = position; + + reset(); +} + +void DocumentHandler::reset() +{ + emit fontFamilyChanged(); + emit alignmentChanged(); + emit boldChanged(); + emit italicChanged(); + emit underlineChanged(); + emit fontSizeChanged(); + emit textColorChanged(); +} + +QTextCursor DocumentHandler::textCursor() const +{ + QTextCursor cursor = QTextCursor(m_doc); + if (m_selectionStart != m_selectionEnd) { + cursor.setPosition(m_selectionStart); + cursor.setPosition(m_selectionEnd, QTextCursor::KeepAnchor); + } else { + cursor.setPosition(m_cursorPosition); + } + return cursor; +} + +void DocumentHandler::mergeFormatOnWordOrSelection(const QTextCharFormat &format) +{ + QTextCursor cursor = textCursor(); + if (!cursor.hasSelection()) + cursor.select(QTextCursor::WordUnderCursor); + cursor.mergeCharFormat(format); +} + +void DocumentHandler::setSelectionStart(int position) +{ + m_selectionStart = position; +} + +void DocumentHandler::setSelectionEnd(int position) +{ + m_selectionEnd = position; +} + +void DocumentHandler::setAlignment(Qt::Alignment a) +{ + QTextBlockFormat fmt; + fmt.setAlignment((Qt::Alignment) a); + QTextCursor cursor = QTextCursor(m_doc); + cursor.setPosition(m_selectionStart, QTextCursor::MoveAnchor); + cursor.setPosition(m_selectionEnd, QTextCursor::KeepAnchor); + cursor.mergeBlockFormat(fmt); + emit alignmentChanged(); +} + +Qt::Alignment DocumentHandler::alignment() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return Qt::AlignLeft; + return textCursor().blockFormat().alignment(); +} + +bool DocumentHandler::bold() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return false; + return textCursor().charFormat().fontWeight() == QFont::Bold; +} + +bool DocumentHandler::italic() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return false; + return textCursor().charFormat().fontItalic(); +} + +bool DocumentHandler::underline() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return false; + return textCursor().charFormat().fontUnderline(); +} + +void DocumentHandler::setBold(bool arg) +{ + QTextCharFormat fmt; + fmt.setFontWeight(arg ? QFont::Bold : QFont::Normal); + mergeFormatOnWordOrSelection(fmt); + emit boldChanged(); +} + +void DocumentHandler::setItalic(bool arg) +{ + QTextCharFormat fmt; + fmt.setFontItalic(arg); + mergeFormatOnWordOrSelection(fmt); + emit italicChanged(); +} + +void DocumentHandler::setUnderline(bool arg) +{ + QTextCharFormat fmt; + fmt.setFontUnderline(arg); + mergeFormatOnWordOrSelection(fmt); + emit underlineChanged(); +} + +int DocumentHandler::fontSize() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return 0; + QTextCharFormat format = cursor.charFormat(); + return format.font().pointSize(); +} + +void DocumentHandler::setFontSize(int arg) +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return; + QTextCharFormat format; + format.setFontPointSize(arg); + mergeFormatOnWordOrSelection(format); + emit fontSizeChanged(); +} + +QColor DocumentHandler::textColor() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return QColor(Qt::black); + QTextCharFormat format = cursor.charFormat(); + return format.foreground().color(); +} + +void DocumentHandler::setTextColor(const QColor &c) +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return; + QTextCharFormat format; + format.setForeground(QBrush(c)); + mergeFormatOnWordOrSelection(format); + emit textColorChanged(); +} + +QString DocumentHandler::fontFamily() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return QString(); + QTextCharFormat format = cursor.charFormat(); + return format.font().family(); +} + +void DocumentHandler::setFontFamily(const QString &arg) +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return; + QTextCharFormat format; + format.setFontFamily(arg); + mergeFormatOnWordOrSelection(format); + emit fontFamilyChanged(); +} + +QStringList DocumentHandler::defaultFontSizes() const +{ + // uhm... this is quite ugly + QStringList sizes; + QFontDatabase db; + foreach (int size, db.standardSizes()) + sizes.append(QString::number(size)); + return sizes; +} diff --git a/examples/quickcontrols/controls/texteditor/src/documenthandler.h b/examples/quickcontrols/controls/texteditor/src/documenthandler.h new file mode 100644 index 000000000..682c8b5bd --- /dev/null +++ b/examples/quickcontrols/controls/texteditor/src/documenthandler.h @@ -0,0 +1,181 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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 <QQuickTextDocument> + +#include <QtGui/QTextCharFormat> +#include <QtCore/QTextCodec> + +#include <qqmlfile.h> + +QT_BEGIN_NAMESPACE +class QTextDocument; +QT_END_NAMESPACE + +class DocumentHandler : public QObject +{ + Q_OBJECT + + Q_ENUMS(HAlignment) + + Q_PROPERTY(QQuickItem *target READ target WRITE setTarget NOTIFY targetChanged) + 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 italic READ italic WRITE setItalic NOTIFY italicChanged) + Q_PROPERTY(bool underline READ underline WRITE setUnderline NOTIFY underlineChanged) + + Q_PROPERTY(int fontSize READ fontSize WRITE setFontSize NOTIFY fontSizeChanged) + + Q_PROPERTY(QStringList defaultFontSizes READ defaultFontSizes NOTIFY defaultFontSizesChanged) + + Q_PROPERTY(QUrl fileUrl READ fileUrl WRITE setFileUrl NOTIFY fileUrlChanged) + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) + Q_PROPERTY(QString documentTitle READ documentTitle WRITE setDocumentTitle NOTIFY documentTitleChanged) + +public: + DocumentHandler(); + + QQuickItem *target() { return m_target; } + + void setTarget(QQuickItem *target); + + void setCursorPosition(int position); + void setSelectionStart(int position); + void setSelectionEnd(int position); + + int cursorPosition() const { return m_cursorPosition; } + int selectionStart() const { return m_selectionStart; } + int selectionEnd() const { return m_selectionEnd; } + + QString fontFamily() const; + + QColor textColor() const; + + Qt::Alignment alignment() const; + void setAlignment(Qt::Alignment a); + + bool bold() const; + bool italic() const; + bool underline() const; + int fontSize() const; + + QStringList defaultFontSizes() const; + QUrl fileUrl() const; + QString text() const; + + QString documentTitle() const; + +public Q_SLOTS: + void setBold(bool arg); + void setItalic(bool arg); + void setUnderline(bool arg); + void setFontSize(int arg); + void setTextColor(const QColor &arg); + void setFontFamily(const QString &arg); + + void setFileUrl(const QUrl &arg); + void setText(const QString &arg); + void saveAs(const QUrl &arg, const QString &fileType); + + void setDocumentTitle(QString arg); + +Q_SIGNALS: + void targetChanged(); + void cursorPositionChanged(); + void selectionStartChanged(); + void selectionEndChanged(); + + void fontFamilyChanged(); + void textColorChanged(); + void alignmentChanged(); + + void boldChanged(); + void italicChanged(); + void underlineChanged(); + + void fontSizeChanged(); + void defaultFontSizesChanged(); + + void fileUrlChanged(); + + void textChanged(); + void documentTitleChanged(); + void error(QString message); + +private: + void reset(); + QTextCursor textCursor() const; + void mergeFormatOnWordOrSelection(const QTextCharFormat &format); + + QQuickItem *m_target; + QTextDocument *m_doc; + + int m_cursorPosition; + int m_selectionStart; + int m_selectionEnd; + + QFont m_font; + int m_fontSize; + QUrl m_fileUrl; + QString m_text; + QString m_documentTitle; +}; + +#endif diff --git a/examples/quickcontrols/controls/texteditor/src/main.cpp b/examples/quickcontrols/controls/texteditor/src/main.cpp new file mode 100644 index 000000000..30113bbfc --- /dev/null +++ b/examples/quickcontrols/controls/texteditor/src/main.cpp @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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 "qtquickcontrolsapplication.h" +#include "documenthandler.h" +#include <QtQml/QQmlApplicationEngine> + +int main(int argc, char *argv[]) +{ + QtQuickControlsApplication app(argc, argv); + qmlRegisterType<DocumentHandler>("org.qtproject.example", 1, 0, "DocumentHandler"); + QQmlApplicationEngine engine(QUrl("qrc:/qml/main.qml")); + if (engine.rootObjects().isEmpty()) + return -1; + return app.exec(); +} diff --git a/examples/quickcontrols/controls/texteditor/src/src.pri b/examples/quickcontrols/controls/texteditor/src/src.pri new file mode 100644 index 000000000..2b89cd629 --- /dev/null +++ b/examples/quickcontrols/controls/texteditor/src/src.pri @@ -0,0 +1,9 @@ +SOURCES += \ + $$PWD/documenthandler.cpp \ + $$PWD/main.cpp + + +HEADERS += \ + $$PWD/documenthandler.h + + |