Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquickmaterialtheme.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
7
8#include <QtGui/qpa/qplatformdialoghelper.h>
9#include <QtGui/qfont.h>
10#include <QtGui/qfontdatabase.h>
11#include <QtQuickTemplates2/private/qquicktheme_p.h>
12#include <QtCore/qmutex.h>
14
16{
17 static inline void addSystemStyle(QPointer<QQuickMaterialStyle> style);
18 static inline void removeSystemStyle(QPointer<QQuickMaterialStyle> style);
19 static inline void updateSystemStyles();
20
22 static inline QMutex mutex;
23};
24
25void QQuickMaterialThemePrivate::addSystemStyle(QPointer<QQuickMaterialStyle> style)
26{
27 QMutexLocker locker{&mutex};
28 auto it = std::find(systemStyles.begin(), systemStyles.end(), style);
29 if (it == systemStyles.end())
30 systemStyles.push_back(style);
31}
32
33void QQuickMaterialThemePrivate::removeSystemStyle(QPointer<QQuickMaterialStyle> style)
34{
35 QMutexLocker locker{&mutex};
36 auto it = std::find(systemStyles.begin(), systemStyles.end(), style);
37 if (it != systemStyles.end())
38 systemStyles.erase(it);
39}
40
42{
43 QMutexLocker locker{&mutex};
44 for (auto it = systemStyles.begin(); it != systemStyles.end(); ) {
45 if (it->isNull()) {
46 it = systemStyles.erase(it);
47 } else {
48 (*it)->setTheme(QQuickMaterialStyle::System);
49 ++it;
50 }
51 }
52}
53
54void QQuickMaterialTheme::initialize(QQuickTheme *theme)
55{
56 QFont systemFont;
57 QFont buttonFont;
58 QFont toolTipFont;
59 QFont itemViewFont;
60 QFont listViewFont;
61 QFont menuItemFont;
62 QFont editorFont;
63
64 auto defaultFontFamily = QLatin1String("Roboto");
65 if (!QFontDatabase::hasFamily(defaultFontFamily)) {
66 defaultFontFamily = QLatin1String("Noto"); // fallback
67 if (!QFontDatabase::hasFamily(defaultFontFamily))
68 defaultFontFamily = {};
69 }
70
71 if (!defaultFontFamily.isEmpty()) {
72 const QStringList families{defaultFontFamily};
73 systemFont.setFamilies(families);
74 buttonFont.setFamilies(families);
75 toolTipFont.setFamilies(families);
76 itemViewFont.setFamilies(families);
77 listViewFont.setFamilies(families);
78 menuItemFont.setFamilies(families);
79 editorFont.setFamilies(families);
80 }
81
82 const bool dense = QQuickMaterialStyle::variant() == QQuickMaterialStyle::Dense;
83 systemFont.setPixelSize(dense ? 13 : 14);
84 theme->setFont(QQuickTheme::System, systemFont);
85
86 // https://material.io/guidelines/components/buttons.html#buttons-style
87 buttonFont.setPixelSize(dense ? 13 : 14);
88 buttonFont.setWeight(QFont::Medium);
89 theme->setFont(QQuickTheme::Button, buttonFont);
90 theme->setFont(QQuickTheme::TabBar, buttonFont);
91 theme->setFont(QQuickTheme::ToolBar, buttonFont);
92
93 // https://material.io/guidelines/components/tooltips.html
94 toolTipFont.setPixelSize(dense ? 10 : 14);
95 toolTipFont.setWeight(QFont::Medium);
96 theme->setFont(QQuickTheme::ToolTip, toolTipFont);
97
98 itemViewFont.setPixelSize(dense ? 13 : 14);
99 itemViewFont.setWeight(QFont::Medium);
100 theme->setFont(QQuickTheme::ItemView, itemViewFont);
101
102 // https://material.io/guidelines/components/lists.html#lists-specs
103 listViewFont.setPixelSize(dense ? 13 : 16);
104 theme->setFont(QQuickTheme::ListView, listViewFont);
105
106 menuItemFont.setPixelSize(dense ? 13 : 16);
107 theme->setFont(QQuickTheme::Menu, menuItemFont);
108 theme->setFont(QQuickTheme::MenuBar, menuItemFont);
109 theme->setFont(QQuickTheme::ComboBox, menuItemFont);
110
111 editorFont.setPixelSize(dense ? 13 : 16);
112 theme->setFont(QQuickTheme::TextArea, editorFont);
113 theme->setFont(QQuickTheme::TextField, editorFont);
114 theme->setFont(QQuickTheme::SpinBox, editorFont);
115}
116
117void QQuickMaterialTheme::registerSystemStyle(QQuickMaterialStyle *style)
118{
119 QQuickMaterialThemePrivate::addSystemStyle(QPointer{style});
120}
121
122void QQuickMaterialTheme::unregisterSystemStyle(QQuickMaterialStyle *style)
123{
124 QQuickMaterialThemePrivate::removeSystemStyle(QPointer{style});
125}
126
127void QQuickMaterialTheme::updateTheme()
128{
129 QQuickMaterialThemePrivate::updateSystemStyles();
130}
131
132QT_END_NAMESPACE
static std::vector< QPointer< QQuickMaterialStyle > > systemStyles
static void addSystemStyle(QPointer< QQuickMaterialStyle > style)
static void removeSystemStyle(QPointer< QQuickMaterialStyle > style)