diff options
Diffstat (limited to 'src/labs/stylekit')
19 files changed, 312 insertions, 254 deletions
diff --git a/src/labs/stylekit/Button.qml b/src/labs/stylekit/Button.qml index 734ff24d27..c4d705e09d 100644 --- a/src/labs/stylekit/Button.qml +++ b/src/labs/stylekit/Button.qml @@ -45,7 +45,7 @@ T.Button { icon: control.icon text: control.text - font: control.font + font: styleReader.font // FIXME: should be inherited from control color: styleReader.text.color alignment: styleReader.text.alignment } diff --git a/src/labs/stylekit/CMakeLists.txt b/src/labs/stylekit/CMakeLists.txt index b981bcac62..ed23c75934 100644 --- a/src/labs/stylekit/CMakeLists.txt +++ b/src/labs/stylekit/CMakeLists.txt @@ -26,7 +26,7 @@ qt_internal_add_qml_module(QtQuickStyleKit qqstylekitstorage_p.h qqstylekitstorage.cpp qqstylekitstyle_p.h qqstylekitstyle.cpp qqstylekittheme_p.h qqstylekittheme.cpp - qqstylekitthemeproperties_p.h qqstylekitthemeproperties.cpp + qqstylekitstyleandthemebase_p.h qqstylekitstyleandthemebase.cpp qqstylekitcustomtheme_p.h qqstylekitcustomtheme.cpp qqstylekitvariation_p.h qqstylekitvariation.cpp DEFINES diff --git a/src/labs/stylekit/CheckBox.qml b/src/labs/stylekit/CheckBox.qml index fa5a43f990..af55697bd1 100644 --- a/src/labs/stylekit/CheckBox.qml +++ b/src/labs/stylekit/CheckBox.qml @@ -75,7 +75,7 @@ T.CheckBox { contentItem: CheckLabel { text: control.text - font: control.font + font: styleReader.font color: styleReader.text.color horizontalAlignment: styleReader.text.alignment & Qt.AlignHorizontal_Mask verticalAlignment: styleReader.text.alignment & Qt.AlignVertical_Mask diff --git a/src/labs/stylekit/ComboBox.qml b/src/labs/stylekit/ComboBox.qml index 2592355a5d..bcb6b89f56 100644 --- a/src/labs/stylekit/ComboBox.qml +++ b/src/labs/stylekit/ComboBox.qml @@ -88,7 +88,8 @@ T.ComboBox { height: indicatorItem.height } - contentItem: T.TextField { + contentItem: TextInput { + font: styleReader.font text: control.editable ? control.editText : control.displayText enabled: control.editable autoScroll: control.editable diff --git a/src/labs/stylekit/ItemDelegate.qml b/src/labs/stylekit/ItemDelegate.qml index feca0eafe3..207d22c3b4 100644 --- a/src/labs/stylekit/ItemDelegate.qml +++ b/src/labs/stylekit/ItemDelegate.qml @@ -46,7 +46,7 @@ T.ItemDelegate { display: control.display icon: control.icon text: control.text - font: control.font + font: styleReader.font color: styleReader.text.color alignment: styleReader.text.alignment } diff --git a/src/labs/stylekit/RadioButton.qml b/src/labs/stylekit/RadioButton.qml index 2ef5b62385..ad5a6d0bed 100644 --- a/src/labs/stylekit/RadioButton.qml +++ b/src/labs/stylekit/RadioButton.qml @@ -75,7 +75,7 @@ T.RadioButton { contentItem: CheckLabel { text: control.text - font: control.font + font: styleReader.font color: styleReader.text.color horizontalAlignment: styleReader.text.alignment & Qt.AlignHorizontal_Mask verticalAlignment: styleReader.text.alignment & Qt.AlignVertical_Mask diff --git a/src/labs/stylekit/SpinBox.qml b/src/labs/stylekit/SpinBox.qml index b5476df13a..88eed43261 100644 --- a/src/labs/stylekit/SpinBox.qml +++ b/src/labs/stylekit/SpinBox.qml @@ -103,7 +103,7 @@ T.SpinBox { z: 2 text: control.displayText - font: control.font + font: styleReader.font selectionColor: control.palette.highlight selectedTextColor: control.palette.highlightedText color: styleReader.text.color diff --git a/src/labs/stylekit/Switch.qml b/src/labs/stylekit/Switch.qml index 7202f3b923..8ce306bbe4 100644 --- a/src/labs/stylekit/Switch.qml +++ b/src/labs/stylekit/Switch.qml @@ -85,7 +85,7 @@ T.Switch { contentItem: CheckLabel { text: control.text - font: control.font + font: styleReader.font color: styleReader.text.color horizontalAlignment: styleReader.text.alignment & Qt.AlignHorizontal_Mask verticalAlignment: styleReader.text.alignment & Qt.AlignVertical_Mask diff --git a/src/labs/stylekit/TextField.qml b/src/labs/stylekit/TextField.qml index 0cdf31852b..f148b52784 100644 --- a/src/labs/stylekit/TextField.qml +++ b/src/labs/stylekit/TextField.qml @@ -22,6 +22,14 @@ T.TextField { rightPadding: styleReader.rightPadding bottomPadding: styleReader.bottomPadding + // FIXME: Should work when assigned to control.font directly + font.family: styleReader.font.family + font.pointSize: styleReader.font.pointSize + font.weight: styleReader.font.weight + font.italic: styleReader.font.italic + font.underline: styleReader.font.underline + font.bold: styleReader.font.bold + color: styleReader.text.color verticalAlignment: styleReader.text.alignment & Qt.AlignVertical_Mask horizontalAlignment: styleReader.text.alignment & Qt.AlignHorizontal_Mask diff --git a/src/labs/stylekit/qqstylekitfont.cpp b/src/labs/stylekit/qqstylekitfont.cpp index 2db4eae309..ff1b3cec8d 100644 --- a/src/labs/stylekit/qqstylekitfont.cpp +++ b/src/labs/stylekit/qqstylekitfont.cpp @@ -10,222 +10,185 @@ QQStyleKitFont::QQStyleKitFont(QObject *parent) { } -#define STYLEKIT_FONT_GETTER(propertyName) \ - QFont QQStyleKitFont::propertyName() const \ - { \ - if (!m_##propertyName) { \ - m_##propertyName.reset(new QFont()); \ - } \ - return *m_##propertyName; \ - } - -STYLEKIT_FONT_GETTER(systemFont) -STYLEKIT_FONT_GETTER(buttonFont) -STYLEKIT_FONT_GETTER(checkboxFont) -STYLEKIT_FONT_GETTER(comboBoxFont) -STYLEKIT_FONT_GETTER(groupBoxFont) -STYLEKIT_FONT_GETTER(itemViewFont) -STYLEKIT_FONT_GETTER(labelFont) -STYLEKIT_FONT_GETTER(listViewFont) -STYLEKIT_FONT_GETTER(menuFont) -STYLEKIT_FONT_GETTER(menuBarFont) -STYLEKIT_FONT_GETTER(radioButtonFont) -STYLEKIT_FONT_GETTER(spinBoxFont) -STYLEKIT_FONT_GETTER(switchControlFont) -STYLEKIT_FONT_GETTER(tabBarFont) -STYLEKIT_FONT_GETTER(textAreaFont) -STYLEKIT_FONT_GETTER(textFieldFont) -STYLEKIT_FONT_GETTER(toolBarFont) -STYLEKIT_FONT_GETTER(toolTipFont) -STYLEKIT_FONT_GETTER(tumblerFont) - -void QQStyleKitFont::setSystemFont(const QFont &font) -{ - if (!m_systemFont) - m_systemFont.reset(new QFont(font)); - else - *m_systemFont = font; - emit systemFontChanged(); -} - -void QQStyleKitFont::setButtonFont(const QFont &font) -{ - if (!m_buttonFont) { - m_buttonFont.reset(new QFont(font)); - } else { - *m_buttonFont = font; - } - emit buttonFontChanged(); -} - -void QQStyleKitFont::setCheckboxFont(const QFont &font) -{ - if (!m_checkboxFont) { - m_checkboxFont.reset(new QFont(font)); - } else { - *m_checkboxFont = font; - } - emit checkboxFontChanged(); -} - -void QQStyleKitFont::setComboBoxFont(const QFont &font) -{ - if (!m_comboBoxFont) { - m_comboBoxFont.reset(new QFont(font)); - } else { - *m_comboBoxFont = font; - } - emit comboBoxFontChanged(); -} - -void QQStyleKitFont::setGroupBoxFont(const QFont &font) -{ - if (!m_groupBoxFont) { - m_groupBoxFont.reset(new QFont(font)); - } else { - *m_groupBoxFont = font; - } - emit groupBoxFontChanged(); -} +#define DEFINE_FONT_GETTER(scopeName, scopeEnum) \ + QFont QQStyleKitFont::scopeName##Font() const \ + { \ + return fontForScope(QQuickTheme::scopeEnum); \ + } + +DEFINE_FONT_GETTER(system, System) +DEFINE_FONT_GETTER(button, Button) +DEFINE_FONT_GETTER(checkBox, CheckBox) +DEFINE_FONT_GETTER(comboBox, ComboBox) +DEFINE_FONT_GETTER(groupBox, GroupBox) +DEFINE_FONT_GETTER(itemView, ItemView) +DEFINE_FONT_GETTER(label, Label) +DEFINE_FONT_GETTER(listView, ListView) +DEFINE_FONT_GETTER(menu, Menu) +DEFINE_FONT_GETTER(menuBar, MenuBar) +DEFINE_FONT_GETTER(radioButton, RadioButton) +DEFINE_FONT_GETTER(spinBox, SpinBox) +DEFINE_FONT_GETTER(switchControl, Switch) +DEFINE_FONT_GETTER(tabBar, TabBar) +DEFINE_FONT_GETTER(textArea, TextArea) +DEFINE_FONT_GETTER(textField, TextField) +DEFINE_FONT_GETTER(toolBar, ToolBar) +DEFINE_FONT_GETTER(toolTip, ToolTip) +DEFINE_FONT_GETTER(tumbler, Tumbler) + +#define DEFINE_FONT_SETTER(scopeName, scopeEnum, signal) \ + void QQStyleKitFont::set##scopeName##Font(const QFont &font) \ + { \ + setFontForScope(QQuickTheme::scopeEnum, font, &QQStyleKitFont::signal); \ + } + +DEFINE_FONT_SETTER(System, System, systemFontChanged) +DEFINE_FONT_SETTER(Button, Button, buttonFontChanged) +DEFINE_FONT_SETTER(CheckBox, CheckBox, checkBoxFontChanged) +DEFINE_FONT_SETTER(ComboBox, ComboBox, comboBoxFontChanged) +DEFINE_FONT_SETTER(GroupBox, GroupBox, groupBoxFontChanged) +DEFINE_FONT_SETTER(ItemView, ItemView, itemViewFontChanged) +DEFINE_FONT_SETTER(Label, Label, labelFontChanged) +DEFINE_FONT_SETTER(ListView, ListView, listViewFontChanged) +DEFINE_FONT_SETTER(Menu, Menu, menuFontChanged) +DEFINE_FONT_SETTER(MenuBar, MenuBar, menuBarFontChanged) +DEFINE_FONT_SETTER(RadioButton, RadioButton, radioButtonFontChanged) +DEFINE_FONT_SETTER(SpinBox, SpinBox, spinBoxFontChanged) +DEFINE_FONT_SETTER(SwitchControl, Switch, switchControlFontChanged) +DEFINE_FONT_SETTER(TabBar, TabBar, tabBarFontChanged) +DEFINE_FONT_SETTER(TextArea, TextArea, textAreaFontChanged) +DEFINE_FONT_SETTER(TextField, TextField, textFieldFontChanged) +DEFINE_FONT_SETTER(ToolBar, ToolBar, toolBarFontChanged) +DEFINE_FONT_SETTER(ToolTip, ToolTip, toolTipFontChanged) +DEFINE_FONT_SETTER(Tumbler, Tumbler, tumblerFontChanged) + +void QQStyleKitFont::setFontForScope(QQuickTheme::Scope scope, const QFont &font, void (QQStyleKitFont::*signal)()) +{ + const int index = int(scope); + if (isSet(scope) && m_local[index] == font) + return; + + QFont local = font; + // TODO: Figure out resolve mask to set here + + m_local[index] = font; + markSet(scope); + + m_effectiveDirty = true; + + emit (this->*signal)(); +} + +// The fallback font is used to resolve unset fonts +// The theme fonts fallback to the style fonts and +// style fonts fallback to the fallback style fonts +QQStyleKitFont *QQStyleKitFont::fallbackFont() const +{ + return m_fallback; +} + +void QQStyleKitFont::setFallbackFont(QQStyleKitFont *fallback) +{ + if (m_fallback == fallback) + return; + + if (m_fallback) + disconnect(m_fallback, nullptr, this, nullptr); + + m_fallback = fallback; + + markEffectiveDirty(); + ensureEffectiveUpToDate(); + + if (m_fallback) { + auto makeHandler = [this](void (QQStyleKitFont::*signal)()) { + return [this, signal] { + markEffectiveDirty(); + emit (this->*signal)(); + }; + }; + connect(m_fallback, &QQStyleKitFont::systemFontChanged, this, + makeHandler(&QQStyleKitFont::systemFontChanged)); + connect(m_fallback, &QQStyleKitFont::buttonFontChanged, this, + makeHandler(&QQStyleKitFont::buttonFontChanged)); + connect(m_fallback, &QQStyleKitFont::checkBoxFontChanged, this, + makeHandler(&QQStyleKitFont::checkBoxFontChanged)); + connect(m_fallback, &QQStyleKitFont::comboBoxFontChanged, this, + makeHandler(&QQStyleKitFont::comboBoxFontChanged)); + connect(m_fallback, &QQStyleKitFont::groupBoxFontChanged, this, + makeHandler(&QQStyleKitFont::groupBoxFontChanged)); + connect(m_fallback, &QQStyleKitFont::itemViewFontChanged, this, + makeHandler(&QQStyleKitFont::itemViewFontChanged)); + connect(m_fallback, &QQStyleKitFont::labelFontChanged, this, + makeHandler(&QQStyleKitFont::labelFontChanged)); + connect(m_fallback, &QQStyleKitFont::listViewFontChanged, this, + makeHandler(&QQStyleKitFont::listViewFontChanged)); + connect(m_fallback, &QQStyleKitFont::menuFontChanged, this, + makeHandler(&QQStyleKitFont::menuFontChanged)); + connect(m_fallback, &QQStyleKitFont::menuBarFontChanged, this, + makeHandler(&QQStyleKitFont::menuBarFontChanged)); + connect(m_fallback, &QQStyleKitFont::radioButtonFontChanged, this, + makeHandler(&QQStyleKitFont::radioButtonFontChanged)); + connect(m_fallback, &QQStyleKitFont::spinBoxFontChanged, this, + makeHandler(&QQStyleKitFont::spinBoxFontChanged)); + connect(m_fallback, &QQStyleKitFont::switchControlFontChanged, this, + makeHandler(&QQStyleKitFont::switchControlFontChanged)); + connect(m_fallback, &QQStyleKitFont::tabBarFontChanged, this, + makeHandler(&QQStyleKitFont::tabBarFontChanged)); + connect(m_fallback, &QQStyleKitFont::textAreaFontChanged, this, + makeHandler(&QQStyleKitFont::textAreaFontChanged)); + connect(m_fallback, &QQStyleKitFont::textFieldFontChanged, this, + makeHandler(&QQStyleKitFont::textFieldFontChanged)); + connect(m_fallback, &QQStyleKitFont::toolBarFontChanged, this, + makeHandler(&QQStyleKitFont::toolBarFontChanged)); + connect(m_fallback, &QQStyleKitFont::toolTipFontChanged, this, + makeHandler(&QQStyleKitFont::toolTipFontChanged)); + connect(m_fallback, &QQStyleKitFont::tumblerFontChanged, this, + makeHandler(&QQStyleKitFont::tumblerFontChanged)); + } + emit fallbackFontChanged(); +} + +QFont QQStyleKitFont::fontForScope(QQuickTheme::Scope scope) const +{ + ensureEffectiveUpToDate(); + return m_effective[int(scope)]; +} -void QQStyleKitFont::setItemViewFont(const QFont &font) +void QQStyleKitFont::ensureEffectiveUpToDate() const { - if (!m_itemViewFont) { - m_itemViewFont.reset(new QFont(font)); - } else { - *m_itemViewFont = font; - } - emit itemViewFontChanged(); -} + if (!m_effectiveDirty) + return; -void QQStyleKitFont::setLabelFont(const QFont &font) -{ - if (!m_labelFont) { - m_labelFont.reset(new QFont(font)); - } else { - *m_labelFont = font; - } - emit labelFontChanged(); -} + const int sysIdx = int(QQuickTheme::System); -void QQStyleKitFont::setListViewFont(const QFont &font) -{ - if (!m_listViewFont) { - m_listViewFont.reset(new QFont(font)); - } else { - *m_listViewFont = font; - } - emit listViewFontChanged(); -} + { + const QFont localSys = isSet(QQuickTheme::System) ? m_local[sysIdx] : QFont(); + const QFont fbSys = m_fallback ? m_fallback->fontForScope(QQuickTheme::System) : QFont(); + // TODO: Resolve mask? + m_effective[sysIdx] = localSys.resolve(fbSys); -void QQStyleKitFont::setMenuFont(const QFont &font) -{ - if (!m_menuFont) { - m_menuFont.reset(new QFont(font)); - } else { - *m_menuFont = font; } - emit menuFontChanged(); -} -void QQStyleKitFont::setMenuBarFont(const QFont &font) -{ - if (!m_menuBarFont) { - m_menuBarFont.reset(new QFont(font)); - } else { - *m_menuBarFont = font; - } - emit menuBarFontChanged(); -} + const QFont systemEff = m_effective[sysIdx]; + const QFont fallbackSystem = m_fallback ? m_fallback->fontForScope(QQuickTheme::System) : QFont(); -void QQStyleKitFont::setRadioButtonFont(const QFont &font) -{ - if (!m_radioButtonFont) { - m_radioButtonFont.reset(new QFont(font)); - } else { - *m_radioButtonFont = font; - } - emit radioButtonFontChanged(); -} - -void QQStyleKitFont::setSpinBoxFont(const QFont &font) -{ - if (!m_spinBoxFont) { - m_spinBoxFont.reset(new QFont(font)); - } else { - *m_spinBoxFont = font; - } - emit spinBoxFontChanged(); -} - -void QQStyleKitFont::setSwitchControlFont(const QFont &font) -{ - if (!m_switchControlFont) { - m_switchControlFont.reset(new QFont(font)); - } else { - *m_switchControlFont = font; - } - emit switchControlFontChanged(); -} - -void QQStyleKitFont::setTabBarFont(const QFont &font) -{ - if (!m_tabBarFont) { - m_tabBarFont.reset(new QFont(font)); - } else { - *m_tabBarFont = font; - } - emit tabBarFontChanged(); -} - -void QQStyleKitFont::setTextAreaFont(const QFont &font) -{ - if (!m_textAreaFont) { - m_textAreaFont.reset(new QFont(font)); - } else { - *m_textAreaFont = font; - } - emit textAreaFontChanged(); -} - -void QQStyleKitFont::setTextFieldFont(const QFont &font) -{ - if (!m_textFieldFont) { - m_textFieldFont.reset(new QFont(font)); - } else { - *m_textFieldFont = font; - } - emit textFieldFontChanged(); -} - -void QQStyleKitFont::setToolBarFont(const QFont &font) -{ - if (!m_toolBarFont) { - m_toolBarFont.reset(new QFont(font)); - } else { - *m_toolBarFont = font; - } - emit toolBarFontChanged(); -} - -void QQStyleKitFont::setToolTipFont(const QFont &font) -{ - if (!m_toolTipFont) { - m_toolTipFont.reset(new QFont(font)); - } else { - *m_toolTipFont = font; - } - emit toolTipFontChanged(); -} - -void QQStyleKitFont::setTumblerFont(const QFont &font) -{ - if (!m_tumblerFont) { - m_tumblerFont.reset(new QFont(font)); - } else { - *m_tumblerFont = font; - } - emit tumblerFontChanged(); + // Scopes: localScope > localSystem > fallbackScope > fallbackSystem + for (int i = 0; i < NScopes; ++i) { + if (i == sysIdx) + continue; + + const QQuickTheme::Scope scope = static_cast<QQuickTheme::Scope>(i); + const QFont localRole = isSet(scope) ? m_local[i] : QFont(); + const QFont fallbackRole = m_fallback ? m_fallback->fontForScope(scope) : QFont(); + + QFont fallbackLayer = fallbackRole.resolve(fallbackSystem); + QFont base = systemEff.resolve(fallbackLayer); + // TODO: Resolve mask? + m_effective[i] = localRole.resolve(base); + } + + m_effectiveDirty = false; } QT_END_NAMESPACE diff --git a/src/labs/stylekit/qqstylekitfont_p.h b/src/labs/stylekit/qqstylekitfont_p.h index eeadcdc0f4..41854222d8 100644 --- a/src/labs/stylekit/qqstylekitfont_p.h +++ b/src/labs/stylekit/qqstylekitfont_p.h @@ -17,6 +17,7 @@ // #include <QtQml/QtQml> +#include <QtQuickTemplates2/private/qquicktheme_p.h> #include <QtGui/qfont.h> QT_BEGIN_NAMESPACE @@ -26,7 +27,7 @@ class QQStyleKitFont : public QObject Q_OBJECT Q_PROPERTY(QFont systemFont READ systemFont WRITE setSystemFont NOTIFY systemFontChanged FINAL) Q_PROPERTY(QFont buttonFont READ buttonFont WRITE setButtonFont NOTIFY buttonFontChanged FINAL) - Q_PROPERTY(QFont checkboxFont READ checkboxFont WRITE setCheckboxFont NOTIFY checkboxFontChanged FINAL) + Q_PROPERTY(QFont checkBoxFont READ checkBoxFont WRITE setCheckBoxFont NOTIFY checkBoxFontChanged FINAL) Q_PROPERTY(QFont comboBoxFont READ comboBoxFont WRITE setComboBoxFont NOTIFY comboBoxFontChanged FINAL) Q_PROPERTY(QFont groupBoxFont READ groupBoxFont WRITE setGroupBoxFont NOTIFY groupBoxFontChanged FINAL) Q_PROPERTY(QFont itemViewFont READ itemViewFont WRITE setItemViewFont NOTIFY itemViewFontChanged FINAL) @@ -54,8 +55,8 @@ public: QFont buttonFont() const; void setButtonFont(const QFont &font); - QFont checkboxFont() const; - void setCheckboxFont(const QFont &font); + QFont checkBoxFont() const; + void setCheckBoxFont(const QFont &font); QFont comboBoxFont() const; void setComboBoxFont(const QFont &font); @@ -105,10 +106,15 @@ public: QFont tumblerFont() const; void setTumblerFont(const QFont &font); + QQStyleKitFont *fallbackFont() const; + void setFallbackFont(QQStyleKitFont *fallback); + + QFont fontForScope(QQuickTheme::Scope scope) const; + signals: void systemFontChanged(); void buttonFontChanged(); - void checkboxFontChanged(); + void checkBoxFontChanged(); void comboBoxFontChanged(); void groupBoxFontChanged(); void itemViewFontChanged(); @@ -125,29 +131,26 @@ signals: void toolBarFontChanged(); void toolTipFontChanged(); void tumblerFontChanged(); + void fallbackFontChanged(); private: Q_DISABLE_COPY(QQStyleKitFont) - mutable std::unique_ptr<QFont> m_systemFont; - mutable std::unique_ptr<QFont> m_buttonFont; - mutable std::unique_ptr<QFont> m_checkboxFont; - mutable std::unique_ptr<QFont> m_comboBoxFont; - mutable std::unique_ptr<QFont> m_groupBoxFont; - mutable std::unique_ptr<QFont> m_itemViewFont; - mutable std::unique_ptr<QFont> m_labelFont; - mutable std::unique_ptr<QFont> m_listViewFont; - mutable std::unique_ptr<QFont> m_menuFont; - mutable std::unique_ptr<QFont> m_menuBarFont; - mutable std::unique_ptr<QFont> m_radioButtonFont; - mutable std::unique_ptr<QFont> m_spinBoxFont; - mutable std::unique_ptr<QFont> m_switchControlFont; - mutable std::unique_ptr<QFont> m_tabBarFont; - mutable std::unique_ptr<QFont> m_textAreaFont; - mutable std::unique_ptr<QFont> m_textFieldFont; - mutable std::unique_ptr<QFont> m_toolBarFont; - mutable std::unique_ptr<QFont> m_toolTipFont; - mutable std::unique_ptr<QFont> m_tumblerFont; + void ensureEffectiveUpToDate() const; + void markEffectiveDirty() { m_effectiveDirty = true; } + + void setFontForScope(QQuickTheme::Scope scope, const QFont &font, void (QQStyleKitFont::*signal)()); + + bool isSet(QQuickTheme::Scope scope) const { return (m_setMask & (1u << int(scope))) != 0; } + void markSet(QQuickTheme::Scope scope) { m_setMask |= (1u << int(scope)); } + + static const int NScopes = QQuickTheme::Tumbler + 1; + QFont m_local[NScopes]; + mutable QFont m_effective[NScopes]; + quint32 m_setMask = 0; + mutable bool m_effectiveDirty = true; + + QQStyleKitFont *m_fallback = nullptr; }; QT_END_NAMESPACE diff --git a/src/labs/stylekit/qqstylekitreader.cpp b/src/labs/stylekit/qqstylekitreader.cpp index f6a2b974fd..71ea689377 100644 --- a/src/labs/stylekit/qqstylekitreader.cpp +++ b/src/labs/stylekit/qqstylekitreader.cpp @@ -243,6 +243,8 @@ void QQStyleKitReader::updateControl() default: Q_UNREACHABLE(); } + + setFont(style->fontForReader(this)); } void QQStyleKitReader::resetAll() @@ -251,9 +253,19 @@ void QQStyleKitReader::resetAll() reader->m_effectiveVariationsDirty = true; reader->clearLocalStorage(); reader->emitChangedForAllStyleProperties(); + reader->updateFontFromTheme(); } } +void QQStyleKitReader::updateFontFromTheme() +{ + const QQStyleKitStyle *style = QQStyleKitStyle::current(); + if (!style || !style->loaded()) + return; + + setFont(style->fontForReader(this)); +} + void QQStyleKitReader::populateLocalStorage() { if (!m_storage.isEmpty()) @@ -485,6 +497,20 @@ void QQStyleKitReader::setPalette(QQuickPalette *palette) emitChangedForAllStyleProperties(); } +QFont QQStyleKitReader::font() const +{ + return m_font; +} + +void QQStyleKitReader::setFont(const QFont &font) +{ + if (m_font == font) + return; + + m_font = font; + emit fontChanged(); +} + QQStyleKitControlProperties *QQStyleKitReader::global() const { return &const_cast<QQStyleKitReader *>(this)->m_global; diff --git a/src/labs/stylekit/qqstylekitreader_p.h b/src/labs/stylekit/qqstylekitreader_p.h index 860c12855f..33257141a9 100644 --- a/src/labs/stylekit/qqstylekitreader_p.h +++ b/src/labs/stylekit/qqstylekitreader_p.h @@ -21,6 +21,7 @@ #include "qqstylekitglobal_p.h" #include "qqstylekitcontrolproperties_p.h" +#include "qqstylekitfont_p.h" #include "qqstylekitstorage_p.h" QT_BEGIN_NAMESPACE @@ -40,6 +41,7 @@ class QQStyleKitReader : public QQStyleKitControlProperties Q_PROPERTY(bool pressed READ pressed WRITE setPressed NOTIFY pressedChanged FINAL) Q_PROPERTY(bool vertical READ vertical WRITE setVertical NOTIFY verticalChanged FINAL) Q_PROPERTY(bool highlighted READ highlighted WRITE setHighlighted NOTIFY highlightedChanged FINAL) + Q_PROPERTY(QFont font READ font NOTIFY fontChanged FINAL) Q_PROPERTY(QQuickPalette *palette READ palette WRITE setPalette NOTIFY paletteChanged FINAL) Q_PROPERTY(QQStyleKitControlProperties *global READ global CONSTANT FINAL) @@ -111,6 +113,9 @@ public: bool highlighted() const; void setHighlighted(bool highlighted); + QFont font() const; + void setFont(const QFont &font); + QQStyleKitControlProperties *global() const; QVariant readStyleProperty(PropertyStorageId key) const; @@ -123,6 +128,8 @@ public: static bool transitionEnabled(); static void resetAll(); + void updateFontFromTheme(); + static QList<QQStyleKitReader *> s_allReaders; signals: @@ -137,6 +144,7 @@ signals: void paletteChanged(); void verticalChanged(); void highlightedChanged(); + void fontChanged(); private: void updateControl(); @@ -163,6 +171,7 @@ private: bool m_effectiveVariationsDirty: 1; QQuickPalette m_palette; + QFont m_font; mutable QQStyleKitPropertyStorage m_storage; AlternateState m_alternateState = AlternateState::Alternate1; QQSK::State m_state = QQSK::StateFlag::NoState; diff --git a/src/labs/stylekit/qqstylekitstyle.cpp b/src/labs/stylekit/qqstylekitstyle.cpp index 624294fc03..e15fa8674d 100644 --- a/src/labs/stylekit/qqstylekitstyle.cpp +++ b/src/labs/stylekit/qqstylekitstyle.cpp @@ -21,7 +21,7 @@ static const QString kLight = "Light"_L1; static const QString kDark = "Dark"_L1; QQStyleKitStyle::QQStyleKitStyle(QObject *parent) - : QQStyleKitControls(parent) + : QQStyleKitStyleAndThemeBase(parent) , m_themeName(kSystem) { } @@ -62,6 +62,12 @@ void QQStyleKitStyle::setFallbackStyle(QQStyleKitStyle *fallbackStyle) m_fallbackStyle = fallbackStyle; emit fallbackStyleChanged(); + + if (fonts()) + fonts()->setFallbackFont(m_fallbackStyle ? m_fallbackStyle->fonts() : nullptr); + + if (m_theme && m_theme->fonts()) + m_theme->fonts()->setFallbackFont(fonts()); } void QQStyleKitStyle::setLight(QQmlComponent *lightTheme) @@ -234,8 +240,14 @@ void QQStyleKitStyle::recreateTheme() m_theme->setParent(this); } + if (m_theme && m_theme->fonts()) + m_theme->fonts()->setFallbackFont(fonts()); if (this == current()) { m_theme->updateQuickTheme(); + if (m_theme->fonts()) + m_theme->fonts()->setFallbackFont(fonts()); + if (fonts()) + fonts()->setFallbackFont(m_fallbackStyle ? m_fallbackStyle->fonts() : nullptr); QQStyleKitReader::resetAll(); } @@ -247,6 +259,38 @@ QQStyleKitStyle* QQStyleKitStyle::current() return QQStyleKit::qmlAttachedProperties()->style(); } +QFont QQStyleKitStyle::fontForReader(QQStyleKitReader *reader) const +{ + switch (reader->type()) { + case QQStyleKitReader::ControlType::Control: + return m_theme->fonts()->systemFont(); + case QQStyleKitReader::ControlType::AbstractButton: + case QQStyleKitReader::ControlType::Button: + case QQStyleKitReader::ControlType::FlatButton: { + return m_theme->fonts()->buttonFont(); + } + case QQStyleKitReader::ControlType::CheckBox: + return m_theme->fonts()->checkBoxFont(); + case QQStyleKitReader::ControlType::ComboBox: + return m_theme->fonts()->comboBoxFont(); + case QQStyleKitReader::ControlType::RadioButton: + return m_theme->fonts()->radioButtonFont(); + case QQStyleKitReader::ControlType::SpinBox: + return m_theme->fonts()->spinBoxFont(); + case QQStyleKitReader::ControlType::SwitchControl: + return m_theme->fonts()->switchControlFont(); + case QQStyleKitReader::ControlType::TextInput: + case QQStyleKitReader::ControlType::TextField: + return m_theme->fonts()->textFieldFont(); + case QQStyleKitReader::ControlType::TextArea: + return m_theme->fonts()->textAreaFont(); + case QQStyleKitReader::ControlType::ItemDelegate: + return m_theme->fonts()->itemViewFont(); + default: + return m_theme->fonts()->systemFont(); + } +} + bool QQStyleKitStyle::loaded() const { /* Before both the style and theme has completed loading diff --git a/src/labs/stylekit/qqstylekitstyle_p.h b/src/labs/stylekit/qqstylekitstyle_p.h index ac560f7b88..2aba7ddbf5 100644 --- a/src/labs/stylekit/qqstylekitstyle_p.h +++ b/src/labs/stylekit/qqstylekitstyle_p.h @@ -20,6 +20,7 @@ #include "qqstylekitcontrols_p.h" #include "qqstylekitcustomtheme_p.h" #include "qqstylekitdebug_p.h" +#include "qqstylekitstyleandthemebase_p.h" #include <QtQml/QtQml> #include <QtQuickTemplates2/private/qquickdeferredpointer_p_p.h> @@ -29,7 +30,7 @@ QT_BEGIN_NAMESPACE class QQStyleKitTheme; class QQStyleKitPropertyResolver; -class QQStyleKitStyle : public QQStyleKitControls +class QQStyleKitStyle : public QQStyleKitStyleAndThemeBase { Q_OBJECT Q_PROPERTY(QQuickPalette *palette READ palette NOTIFY paletteChanged FINAL) @@ -76,6 +77,8 @@ public: static QQStyleKitStyle *current(); + QFont fontForReader(QQStyleKitReader *reader) const; + // For now, used by qqcontrolstowidgetstyle Q_INVOKABLE QList<QObject *> customThemesAsList(); diff --git a/src/labs/stylekit/qqstylekitthemeproperties.cpp b/src/labs/stylekit/qqstylekitstyleandthemebase.cpp index 7d342c563b..6ff18b26cc 100644 --- a/src/labs/stylekit/qqstylekitthemeproperties.cpp +++ b/src/labs/stylekit/qqstylekitstyleandthemebase.cpp @@ -1,22 +1,22 @@ // Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only -#include "qqstylekitthemeproperties_p.h" +#include "qqstylekitstyleandthemebase_p.h" QT_BEGIN_NAMESPACE -QQStyleKitThemeProperties::QQStyleKitThemeProperties(QObject *parent) +QQStyleKitStyleAndThemeBase::QQStyleKitStyleAndThemeBase(QObject *parent) : QQStyleKitControls(parent) { } -QQStyleKitFont *QQStyleKitThemeProperties::fonts() +QQStyleKitFont *QQStyleKitStyleAndThemeBase::fonts() { return &m_fonts; } QT_END_NAMESPACE -#include "moc_qqstylekitthemeproperties_p.cpp" +#include "moc_qqstylekitstyleandthemebase_p.cpp" diff --git a/src/labs/stylekit/qqstylekitthemeproperties_p.h b/src/labs/stylekit/qqstylekitstyleandthemebase_p.h index 5d8985441b..c59fde77c8 100644 --- a/src/labs/stylekit/qqstylekitthemeproperties_p.h +++ b/src/labs/stylekit/qqstylekitstyleandthemebase_p.h @@ -2,8 +2,8 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only // Qt-Security score:significant reason:default -#ifndef QQSTYLEKITTHEMEPROPERTIES_P_H -#define QQSTYLEKITTHEMEPROPERTIES_P_H +#ifndef QQSTYLEKITTSTYLEANDTHEMEBASE_P_H +#define QQSTYLEKITTSTYLEANDTHEMEBASE_P_H // // W A R N I N G @@ -22,7 +22,7 @@ QT_BEGIN_NAMESPACE -class QQStyleKitThemeProperties : public QQStyleKitControls +class QQStyleKitStyleAndThemeBase : public QQStyleKitControls { Q_OBJECT Q_PROPERTY(QQStyleKitFont *fonts READ fonts NOTIFY fontsChanged FINAL) @@ -31,7 +31,7 @@ class QQStyleKitThemeProperties : public QQStyleKitControls QML_NAMED_ELEMENT(ThemeProperties) public: - QQStyleKitThemeProperties(QObject *parent = nullptr); + QQStyleKitStyleAndThemeBase(QObject *parent = nullptr); QQStyleKitFont *fonts(); @@ -39,11 +39,11 @@ signals: void fontsChanged(); private: - Q_DISABLE_COPY(QQStyleKitThemeProperties) + Q_DISABLE_COPY(QQStyleKitStyleAndThemeBase) QQStyleKitFont m_fonts; }; QT_END_NAMESPACE -#endif // QQSTYLEKITTHEMEPROPERTIES_P_H +#endif // QQSTYLEKITTSTYLEANDTHEMEBASE_P_H diff --git a/src/labs/stylekit/qqstylekittheme.cpp b/src/labs/stylekit/qqstylekittheme.cpp index 08cec449c9..6996f299cf 100644 --- a/src/labs/stylekit/qqstylekittheme.cpp +++ b/src/labs/stylekit/qqstylekittheme.cpp @@ -12,7 +12,7 @@ QT_BEGIN_NAMESPACE QQStyleKitTheme::QQStyleKitTheme(QObject *parent) - : QQStyleKitControls(parent) + : QQStyleKitStyleAndThemeBase(parent) { } diff --git a/src/labs/stylekit/qqstylekittheme_p.h b/src/labs/stylekit/qqstylekittheme_p.h index 8096e9935b..6b09eea3f3 100644 --- a/src/labs/stylekit/qqstylekittheme_p.h +++ b/src/labs/stylekit/qqstylekittheme_p.h @@ -18,7 +18,7 @@ #include <QtQml/QtQml> -#include "qqstylekitcontrols_p.h" +#include "qqstylekitstyleandthemebase_p.h" #include "qqstylekitpalette_p.h" QT_BEGIN_NAMESPACE @@ -26,10 +26,11 @@ QT_BEGIN_NAMESPACE class QQStyleKitControls; class QQStyleKitPropertyResolver; -class QQStyleKitTheme : public QQStyleKitControls +class QQStyleKitTheme : public QQStyleKitStyleAndThemeBase { Q_OBJECT + // TODO: Move to QQStyleKitStyleAndThemeBase Q_PROPERTY(QQStyleKitPalette *palettes READ palettes NOTIFY palettesChanged FINAL) QML_NAMED_ELEMENT(Theme) |
