aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2020-01-21 01:00:14 +0100
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2020-01-21 01:00:14 +0100
commit9aceff567c859bb91fe7221d2265953437402b43 (patch)
tree9db253bae3d91b77c9b6727afed121b7d7cac065 /src/quick
parent4ecc36c34154e731cb2e94fa1a35929d6785f33d (diff)
parentcc9e1326792835c846cd129b683db5af6ac931bb (diff)
Merge remote-tracking branch 'origin/5.15' into dev
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/doc/images/declarative-textformat.pngbin11498 -> 8301 bytes
-rw-r--r--src/quick/doc/snippets/qml/text/textEditFormats.qml76
-rw-r--r--src/quick/doc/snippets/qml/text/textFormats.qml75
-rw-r--r--src/quick/items/qquickitemview.cpp8
-rw-r--r--src/quick/items/qquickitemview_p_p.h1
-rw-r--r--src/quick/items/qquicktableview.cpp25
-rw-r--r--src/quick/items/qquicktableview_p.h4
-rw-r--r--src/quick/items/qquicktableview_p_p.h10
-rw-r--r--src/quick/items/qquicktext.cpp61
-rw-r--r--src/quick/items/qquicktextedit.cpp59
10 files changed, 241 insertions, 78 deletions
diff --git a/src/quick/doc/images/declarative-textformat.png b/src/quick/doc/images/declarative-textformat.png
index ade1b45429..a671fbf3d6 100644
--- a/src/quick/doc/images/declarative-textformat.png
+++ b/src/quick/doc/images/declarative-textformat.png
Binary files differ
diff --git a/src/quick/doc/snippets/qml/text/textEditFormats.qml b/src/quick/doc/snippets/qml/text/textEditFormats.qml
new file mode 100644
index 0000000000..9065cc6a1c
--- /dev/null
+++ b/src/quick/doc/snippets/qml/text/textEditFormats.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module 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$
+**
+****************************************************************************/
+import QtQuick 2.14
+
+//![0]
+Column {
+ TextEdit {
+ font.pointSize: 24
+ textFormat: TextEdit.AutoText
+ text: "<b>Hello</b> <i>World!</i>"
+ }
+ TextEdit {
+ font.pointSize: 24
+ textFormat: TextEdit.RichText
+ text: "<b>Hello</b> <i>World!</i>"
+ }
+ TextEdit {
+ font.pointSize: 24
+ textFormat: TextEdit.PlainText
+ text: "<b>Hello</b> <i>World!</i>"
+ }
+ TextEdit {
+ font.pointSize: 24
+ textFormat: TextEdit.MarkdownText
+ text: "**Hello** *World!*"
+ }
+}
+//![0]
+
diff --git a/src/quick/doc/snippets/qml/text/textFormats.qml b/src/quick/doc/snippets/qml/text/textFormats.qml
new file mode 100644
index 0000000000..b292a3ee13
--- /dev/null
+++ b/src/quick/doc/snippets/qml/text/textFormats.qml
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module 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$
+**
+****************************************************************************/
+import QtQuick 2.14
+
+//![0]
+Column {
+ Text {
+ font.pointSize: 24
+ text: "<b>Hello</b> <i>World!</i>"
+ }
+ Text {
+ font.pointSize: 24
+ textFormat: Text.RichText
+ text: "<b>Hello</b> <i>World!</i>"
+ }
+ Text {
+ font.pointSize: 24
+ textFormat: Text.PlainText
+ text: "<b>Hello</b> <i>World!</i>"
+ }
+ Text {
+ font.pointSize: 24
+ textFormat: Text.MarkdownText
+ text: "**Hello** *World!*"
+ }
+}
+//![0]
+
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp
index 031ac6337a..0d30606ef7 100644
--- a/src/quick/items/qquickitemview.cpp
+++ b/src/quick/items/qquickitemview.cpp
@@ -1531,7 +1531,7 @@ QQuickItemViewPrivate::QQuickItemViewPrivate()
, inLayout(false), inViewportMoved(false), forceLayout(false), currentIndexCleared(false)
, haveHighlightRange(false), autoHighlight(true), highlightRangeStartValid(false), highlightRangeEndValid(false)
, fillCacheBuffer(false), inRequest(false)
- , runDelayedRemoveTransition(false), delegateValidated(false)
+ , runDelayedRemoveTransition(false), delegateValidated(false), isClearing(false)
{
bufferPause.addAnimationChangeListener(this, QAbstractAnimationJob::Completion);
bufferPause.setLoopCount(1);
@@ -1707,6 +1707,10 @@ void QQuickItemViewPrivate::updateCurrent(int modelIndex)
void QQuickItemViewPrivate::clear(bool onDestruction)
{
Q_Q(QQuickItemView);
+
+ isClearing = true;
+ auto cleanup = qScopeGuard([this] { isClearing = false; });
+
currentChanges.reset();
bufferedChanges.reset();
timeline.clear();
@@ -2444,7 +2448,7 @@ bool QQuickItemViewPrivate::releaseItem(FxViewItem *item, QQmlInstanceModel::Reu
QQmlInstanceModel::ReleaseFlags flags = {};
if (model && item->item) {
flags = model->release(item->item, reusableFlag);
- if (!flags) {
+ if (!flags && !isClearing) {
// item was not destroyed, and we no longer reference it.
if (item->item->parentItem() == contentItem) {
// Only cull the item if its parent item is still our contentItem.
diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h
index 48f47a356b..0bc2a6b768 100644
--- a/src/quick/items/qquickitemview_p_p.h
+++ b/src/quick/items/qquickitemview_p_p.h
@@ -323,6 +323,7 @@ public:
bool inRequest : 1;
bool runDelayedRemoveTransition : 1;
bool delegateValidated : 1;
+ bool isClearing : 1;
protected:
virtual Qt::Orientation layoutOrientation() const = 0;
diff --git a/src/quick/items/qquicktableview.cpp b/src/quick/items/qquicktableview.cpp
index fd511bc2ee..66e89f0a09 100644
--- a/src/quick/items/qquicktableview.cpp
+++ b/src/quick/items/qquicktableview.cpp
@@ -2242,6 +2242,21 @@ void QQuickTableViewPrivate::syncDelegate()
tableModel->setDelegate(assignedDelegate);
}
+QVariant QQuickTableViewPrivate::modelImpl() const
+{
+ return assignedModel;
+}
+
+void QQuickTableViewPrivate::setModelImpl(const QVariant &newModel)
+{
+ if (newModel == assignedModel)
+ return;
+
+ assignedModel = newModel;
+ scheduleRebuildTable(QQuickTableViewPrivate::RebuildOption::All);
+ emit q_func()->modelChanged();
+}
+
void QQuickTableViewPrivate::syncModel()
{
if (modelVariant == assignedModel)
@@ -2663,18 +2678,12 @@ void QQuickTableView::setColumnWidthProvider(const QJSValue &provider)
QVariant QQuickTableView::model() const
{
- return d_func()->assignedModel;
+ return d_func()->modelImpl();
}
void QQuickTableView::setModel(const QVariant &newModel)
{
- Q_D(QQuickTableView);
- if (newModel == d->assignedModel)
- return;
-
- d->assignedModel = newModel;
- d->scheduleRebuildTable(QQuickTableViewPrivate::RebuildOption::All);
- emit modelChanged();
+ return d_func()->setModelImpl(newModel);
}
QQmlComponent *QQuickTableView::delegate() const
diff --git a/src/quick/items/qquicktableview_p.h b/src/quick/items/qquicktableview_p.h
index 5ef73a816f..d549aaddf7 100644
--- a/src/quick/items/qquicktableview_p.h
+++ b/src/quick/items/qquicktableview_p.h
@@ -104,8 +104,8 @@ public:
QJSValue columnWidthProvider() const;
void setColumnWidthProvider(const QJSValue &provider);
- virtual QVariant model() const;
- virtual void setModel(const QVariant &newModel);
+ QVariant model() const;
+ void setModel(const QVariant &newModel);
QQmlComponent *delegate() const;
void setDelegate(QQmlComponent *);
diff --git a/src/quick/items/qquicktableview_p_p.h b/src/quick/items/qquicktableview_p_p.h
index 7c81882d44..c629ae0a5d 100644
--- a/src/quick/items/qquicktableview_p_p.h
+++ b/src/quick/items/qquicktableview_p_p.h
@@ -404,11 +404,13 @@ public:
void itemReusedCallback(int modelIndex, QObject *object);
void modelUpdated(const QQmlChangeSet &changeSet, bool reset);
- inline void syncWithPendingChanges();
- inline void syncDelegate();
- inline void syncModel();
+ virtual void syncWithPendingChanges();
+ virtual void syncDelegate();
+ virtual QVariant modelImpl() const;
+ virtual void setModelImpl(const QVariant &newModel);
+ virtual void syncModel();
inline void syncRebuildOptions();
- inline void syncSyncView();
+ virtual void syncSyncView();
void connectToModel();
void disconnectFromModel();
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp
index 31df4fdff3..9493303314 100644
--- a/src/quick/items/qquicktext.cpp
+++ b/src/quick/items/qquicktext.cpp
@@ -1697,6 +1697,9 @@ void QQuickText::itemChange(ItemChange change, const ItemChangeData &value)
The item will try to automatically determine whether the text should
be treated as styled text. This determination is made using Qt::mightBeRichText().
+ However, detection of Markdown is not automatic.
+
+ \sa textFormat
*/
QString QQuickText::text() const
{
@@ -2124,26 +2127,25 @@ void QQuickText::resetMaximumLineCount()
/*!
\qmlproperty enumeration QtQuick::Text::textFormat
- The way the text property should be displayed.
+ The way the \l text property should be displayed.
Supported text formats are:
- \list
- \li Text.AutoText (default)
- \li Text.PlainText
- \li Text.StyledText
- \li Text.RichText
- \endlist
+ \value Text.AutoText (default) detected via the Qt::mightBeRichText() heuristic
+ \value Text.PlainText all styling tags are treated as plain text
+ \value Text.StyledText optimized basic rich text as in HTML 3.2
+ \value Text.RichText \l {Supported HTML Subset} {a subset of HTML 4}
+ \value Text.MarkdownText \l {https://commonmark.org/help/}{CommonMark} plus the
+ \l {https://guides.github.com/features/mastering-markdown/}{GitHub}
+ extensions for tables and task lists (since 5.14)
If the text format is \c Text.AutoText the Text item
will automatically determine whether the text should be treated as
- styled text. This determination is made using Qt::mightBeRichText()
- which uses a fast and therefore simple heuristic. It mainly checks
- whether there is something that looks like a tag before the first
- line break. Although the result may be correct for common cases,
- there is no guarantee.
+ styled text. This determination is made using Qt::mightBeRichText(),
+ which can detect the presence of an HTML tag on the first line of text,
+ but cannot distinguish Markdown from plain text.
- Text.StyledText is an optimized format supporting some basic text
+ \c Text.StyledText is an optimized format supporting some basic text
styling markup, in the style of HTML 3.2:
\code
@@ -2169,30 +2171,21 @@ void QQuickText::resetMaximumLineCount()
\table
\row
\li
- \qml
-Column {
- Text {
- font.pointSize: 24
- text: "<b>Hello</b> <i>World!</i>"
- }
- Text {
- font.pointSize: 24
- textFormat: Text.RichText
- text: "<b>Hello</b> <i>World!</i>"
- }
- Text {
- font.pointSize: 24
- textFormat: Text.PlainText
- text: "<b>Hello</b> <i>World!</i>"
- }
-}
- \endqml
+ \snippet qml/text/textFormats.qml 0
\li \image declarative-textformat.png
\endtable
- Text.RichText supports a larger subset of HTML 4, as described on the
- \l {Supported HTML Subset} page. You should prefer using Text.PlainText
- or Text.StyledText instead, as they offer better performance.
+ \c Text.RichText supports a larger subset of HTML 4, as described on the
+ \l {Supported HTML Subset} page. You should prefer using \c Text.PlainText,
+ \c Text.StyledText or \c Text.MarkdownText instead, as they offer better performance.
+
+ \note With \c Text.MarkdownText, and with the supported subset of HTML,
+ some decorative elements are not rendered as they would be in a web browser:
+ \list
+ \li code blocks use the \l {QFontDatabase::FixedFont}{default monospace font} but without a surrounding highlight box
+ \li block quotes are indented, but there is no vertical line alongside the quote
+ \li horizontal rules are not rendered
+ \endlist
*/
QQuickText::TextFormat QQuickText::textFormat() const
{
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp
index 7d34cc3f56..650b1961a4 100644
--- a/src/quick/items/qquicktextedit.cpp
+++ b/src/quick/items/qquicktextedit.cpp
@@ -395,6 +395,7 @@ QString QQuickTextEdit::text() const
The text to display. If the text format is AutoText the text edit will
automatically determine whether the text should be treated as
rich text. This determination is made using Qt::mightBeRichText().
+ However, detection of Markdown is not automatic.
The text-property is mostly suitable for setting the initial content and
handling modifications to relatively small text content. The append(),
@@ -402,7 +403,7 @@ QString QQuickTextEdit::text() const
remarkably better performance for modifying especially large rich text
content.
- \sa clear()
+ \sa clear(), textFormat
*/
void QQuickTextEdit::setText(const QString &text)
{
@@ -444,41 +445,43 @@ QString QQuickTextEdit::preeditText() const
/*!
\qmlproperty enumeration QtQuick::TextEdit::textFormat
- The way the text property should be displayed.
+ The way the \l text property should be displayed.
- \list
- \li TextEdit.AutoText
- \li TextEdit.PlainText
- \li TextEdit.RichText
- \endlist
+ Supported text formats are:
- The default is TextEdit.PlainText. If the text format is TextEdit.AutoText the text edit
- will automatically determine whether the text should be treated as
- rich text. This determination is made using Qt::mightBeRichText().
+ \value TextEdit.PlainText (default) all styling tags are treated as plain text
+ \value TextEdit.AutoText detected via the Qt::mightBeRichText() heuristic
+ \value TextEdit.RichText \l {Supported HTML Subset} {a subset of HTML 4}
+ \value TextEdit.MarkdownText \l {https://commonmark.org/help/}{CommonMark} plus the
+ \l {https://guides.github.com/features/mastering-markdown/}{GitHub}
+ extensions for tables and task lists (since 5.14)
+
+ The default is \c TextEdit.PlainText. If the text format is set to
+ \c TextEdit.AutoText, the text edit will automatically determine whether
+ the text should be treated as rich text. This determination is made using
+ Qt::mightBeRichText(), which can detect the presence of an HTML tag on the
+ first line of text, but cannot distinguish Markdown from plain text.
\table
\row
\li
- \qml
-Column {
- TextEdit {
- font.pointSize: 24
- text: "<b>Hello</b> <i>World!</i>"
- }
- TextEdit {
- font.pointSize: 24
- textFormat: TextEdit.RichText
- text: "<b>Hello</b> <i>World!</i>"
- }
- TextEdit {
- font.pointSize: 24
- textFormat: TextEdit.PlainText
- text: "<b>Hello</b> <i>World!</i>"
- }
-}
- \endqml
+ \snippet qml/text/textEditFormats.qml 0
\li \image declarative-textformat.png
\endtable
+
+ With \c TextEdit.MarkdownText, checkboxes that result from using the
+ \l {https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown}{GitHub checkbox extension}
+ are interactively checkable.
+
+ \note Interactively typing markup or markdown formatting is not supported.
+
+ \note With \c Text.MarkdownText, and with the supported subset of HTML,
+ some decorative elements are not rendered as they would be in a web browser:
+ \list
+ \li code blocks use the \l {QFontDatabase::FixedFont}{default monospace font} but without a surrounding highlight box
+ \li block quotes are indented, but there is no vertical line alongside the quote
+ \li horizontal rules are not rendered
+ \endlist
*/
QQuickTextEdit::TextFormat QQuickTextEdit::textFormat() const
{