diff options
author | Sergio Ahumada <sergio.ahumada@digia.com> | 2013-03-25 08:04:58 +0100 |
---|---|---|
committer | Sergio Ahumada <sergio.ahumada@digia.com> | 2013-03-25 08:34:20 +0100 |
commit | 1d6b43c44b68d1983a77a7368c6cfff78f2d4cd0 (patch) | |
tree | b5d752c2ded6c4ee2c3e32cee7aabe88bb881a44 /examples/text/src/documenthandler.cpp | |
parent | 716ca066c7f07371aaae79029c60996bc6e57118 (diff) | |
parent | 2e52c497f205460ee61e6f6940849c057adc7adb (diff) | |
download | qtquickcontrols-1d6b43c44b68d1983a77a7368c6cfff78f2d4cd0.tar.gz |
Merge branch 'dev' into stable
This starts Qt 5.1 release cycle
Conflicts:
src/qtdesktop/CheckBox.qml
src/qtdesktop/doc/qtdesktopcomponents.qdocconf
Change-Id: Ic3799053a18b0a3f97e251354ad8433438b08a7a
Diffstat (limited to 'examples/text/src/documenthandler.cpp')
-rw-r--r-- | examples/text/src/documenthandler.cpp | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/examples/text/src/documenthandler.cpp b/examples/text/src/documenthandler.cpp new file mode 100644 index 00000000..48b6d033 --- /dev/null +++ b/examples/text/src/documenthandler.cpp @@ -0,0 +1,284 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 Digia Plc and its Subsidiary(-ies) 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) +{ + setFileUrl(QUrl("qrc:/example.html")); +} + +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(); + } + } + 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(); + } +} + +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; + + emit currentFontChanged(); + emit alignmentChanged(); + emit boldChanged(); + emit italicChanged(); + emit underlineChanged(); + emit fontSizeChanged(); +} + +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; +// emit selectionStartChanged(); +} + +void DocumentHandler::setSelectionEnd(int position) +{ + m_selectionEnd = position; +// emit selectionEndChanged(); +} + +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 +{ +// if (!m_doc || m_doc->isEmpty() || m_cursorPosition < 0) +// return Qt::AlignLeft; + QTextCursor cursor = textCursor(); + if (cursor.isNull() || cursor.blockNumber() == 0) + return Qt::AlignLeft; + return textCursor().blockFormat().alignment(); +} + +bool DocumentHandler::bold() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull() || cursor.blockNumber() == 0) + return false; + return textCursor().charFormat().fontWeight() == QFont::Bold; +} + +bool DocumentHandler::italic() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull() || cursor.blockNumber() == 0) + return false; + return textCursor().charFormat().fontItalic(); +} + +bool DocumentHandler::underline() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull() || cursor.blockNumber() == 0) + 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(); +} + +QFont DocumentHandler::currentFont() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return QFont(); + QTextCharFormat format = cursor.charFormat(); + return format.font(); +} + +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; +} |