From a8c93149aa220b1158c803dac2f9cc0d15a23df5 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 6 May 2024 12:25:44 +0200 Subject: Match QFont::ContextFontMerging with Qt Quick API While we don't support all style strategy flags in Qt Quick, we do support selected ones as bools. QFont::ContextFontMerging is useful to be able to set per Text element, so it should be exposed through the QML APIs. Task-number: QTBUG-121131 Change-Id: If28a065aefc4e2043e830e31356b8bd98f6d4cd8 Reviewed-by: Eirik Aavitsland --- src/quick/items/qquicktext.cpp | 21 +++++++++++++++++++++ src/quick/items/qquicktextedit.cpp | 7 +++++++ src/quick/items/qquicktextinput.cpp | 7 +++++++ src/quick/util/qquickpath.cpp | 7 +++++++ src/quick/util/qquickvaluetypes.cpp | 13 +++++++++++++ src/quick/util/qquickvaluetypes_p.h | 4 ++++ 6 files changed, 59 insertions(+) (limited to 'src/quick') diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index 5f85fa2080..ec042010d0 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -1853,6 +1853,27 @@ QQuickText::~QQuickText() \sa QFont::setFeature() //! [qml-font-features] */ + +/*! + \qmlproperty object QtQuick::Text::font.contextFontMerging + \since 6.8 + +//! [qml-font-context-font-merging] + If the selected font does not contain a certain character, Qt automatically chooses a + similar-looking fallback font that contains the character. By default this is done on a + character-by-character basis. + + This means that in certain uncommon cases, many different fonts may be used to represent one + string of text even if it's in the same script. Setting \c contextFontMerging to true will try + finding the fallback font that matches the largest subset of the input string instead. This + will be more expensive for strings where missing glyphs occur, but may give more consistent + results. By default, \c contextFontMerging is \c{false}. + + \sa QFont::StyleStrategy +//! [qml-font-context-font-merging] +*/ + + QFont QQuickText::font() const { Q_D(const QQuickText); diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 22bbd6e05b..02b34a6671 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -375,6 +375,13 @@ QString QQuickTextEdit::text() const \include qquicktext.cpp qml-font-features */ +/*! + \qmlproperty object QtQuick::TextEdit::font.contextFontMerging + \since 6.8 + + \include qquicktext.cpp qml-font-context-font-merging +*/ + /*! \qmlproperty string QtQuick::TextEdit::text diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index ef00451788..c013595f45 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -403,6 +403,13 @@ QString QQuickTextInputPrivate::realText() const \include qquicktext.cpp qml-font-features */ + +/*! + \qmlproperty object QtQuick::TextInput::font.contextFontMerging + \since 6.8 + + \include qquicktext.cpp qml-font-context-font-merging +*/ QFont QQuickTextInput::font() const { Q_D(const QQuickTextInput); diff --git a/src/quick/util/qquickpath.cpp b/src/quick/util/qquickpath.cpp index 29c09abee2..8995c64d0b 100644 --- a/src/quick/util/qquickpath.cpp +++ b/src/quick/util/qquickpath.cpp @@ -2809,6 +2809,13 @@ void QQuickPathMultiline::addToPath(QPainterPath &path, const QQuickPathData &) \include qquicktext.cpp qml-font-features */ + +/*! + \qmlproperty object QtQuick::PathText::font.contextFontMerging + \since 6.8 + + \include qquicktext.cpp qml-font-context-font-merging +*/ void QQuickPathText::updatePath() const { if (!_path.isEmpty()) diff --git a/src/quick/util/qquickvaluetypes.cpp b/src/quick/util/qquickvaluetypes.cpp index 4f4f893d83..350f55e143 100644 --- a/src/quick/util/qquickvaluetypes.cpp +++ b/src/quick/util/qquickvaluetypes.cpp @@ -1080,6 +1080,19 @@ QVariantMap QQuickFontValueType::features() const return ret; } +bool QQuickFontValueType::contextFontMerging() const +{ + return (v.styleStrategy() & QFont::ContextFontMerging) != 0; +} + +void QQuickFontValueType::setContextFontMerging(bool enable) +{ + if (enable) + v.setStyleStrategy(static_cast(v.styleStrategy() | QFont::ContextFontMerging)); + else + v.setStyleStrategy(static_cast(v.styleStrategy() & ~QFont::ContextFontMerging)); +} + QVariant QQuickColorSpaceValueType::create(const QJSValue ¶ms) { if (!params.isObject()) diff --git a/src/quick/util/qquickvaluetypes_p.h b/src/quick/util/qquickvaluetypes_p.h index 08491c633b..c203d12fab 100644 --- a/src/quick/util/qquickvaluetypes_p.h +++ b/src/quick/util/qquickvaluetypes_p.h @@ -409,6 +409,7 @@ class Q_QUICK_EXPORT QQuickFontValueType Q_PROPERTY(bool preferShaping READ preferShaping WRITE setPreferShaping FINAL) Q_PROPERTY(QVariantMap features READ features WRITE setFeatures FINAL) Q_PROPERTY(QVariantMap variableAxes READ variableAxes WRITE setVariableAxes FINAL) + Q_PROPERTY(bool contextFontMerging READ contextFontMerging WRITE setContextFontMerging FINAL) QML_VALUE_TYPE(font) QML_FOREIGN(QFont) @@ -475,6 +476,9 @@ public: QVariantMap variableAxes() const; void setVariableAxes(const QVariantMap &variableAxes); + bool contextFontMerging() const; + void setContextFontMerging(bool b); + operator QFont() const { return v; } }; -- cgit v1.2.3