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
qwasmtheme.cpp
Go to the documentation of this file.
1// Copyright (C) 2018 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#include "qwasmtheme.h"
7#include <QtCore/qvariant.h>
8#include <QFontDatabase>
9#include <QList>
10#include <qloggingcategory.h>
11#include <qpa/qwindowsysteminterface.h>
12#include <qpalette.h>
13
14#include <emscripten.h>
15#include <emscripten/bind.h>
16#include <emscripten/val.h>
17
18Q_GUI_EXPORT QPalette qt_fusionPalette();
19
20QT_BEGIN_NAMESPACE
21
22Q_STATIC_LOGGING_CATEGORY(lcQpaThemeWasm, "qt.qpa.theme.wasm")
23
24namespace {
25bool matchMedia(std::string mediaQueryString)
26{
27 return emscripten::val::global("window")
28 .call<emscripten::val>("matchMedia", mediaQueryString)["matches"]
29 .as<bool>();
30}
31
33{
34 if (matchMedia(colorSchemePreferenceDark)) {
35 return Qt::ColorScheme::Dark;
36 } else {
37 return Qt::ColorScheme::Light;
38 }
39}
40
42{
43 if (matchMedia(contrastPreferenceMore)) {
44 return Qt::ContrastPreference::HighContrast;
45 } else {
46 return Qt::ContrastPreference::NoPreference;
47 }
48}
49
51{
52 if (matchMedia(reducedMotionPreferenceReduce))
53 return Qt::MotionPreference::ReducedMotion;
54 return Qt::MotionPreference::NoPreference;
55}
56} // namespace
57
58using namespace Qt::StringLiterals;
59
61{
62 m_colorScheme = getColorSchemeFromMedia();
63 qCDebug(lcQpaThemeWasm) << "Initializing Wasm theme. Color scheme: " << m_colorScheme;
64 m_contrastPreference = getContrastPreferenceFromMedia();
65 qCDebug(lcQpaThemeWasm) << "Initializing Wasm theme. Contrast preference: " << m_contrastPreference;
66 m_motionPreference = getMotionPreferenceFromMedia();
67 qCDebug(lcQpaThemeWasm) << "Initializing Wasm theme. Motion preference: " << m_motionPreference;
68
69 for (auto family : QFontDatabase::families())
70 if (QFontDatabase::isFixedPitch(family))
71 fixedFont = new QFont(family);
72
73 m_palette = std::make_unique<QPalette>();
74 m_paletteIsDirty = true; // Force update later
75
76 registerCallbacks(
77 { colorSchemePreferenceDark },
78 [this](emscripten::val) { QWasmTheme::onColorSchemeChange(); },
79 m_colorSchemeChangeCallback);
80 registerCallbacks(
81 { contrastPreferenceNoPreference, contrastPreferenceMore, contrastPreferenceLess,
82 contrastPreferenceCustom },
83 [this](emscripten::val) { QWasmTheme::onContrastPreferenceChange(); },
84 m_contrastPreferenceChangeCallbacks);
85 registerCallbacks(
86 { reducedMotionPreferenceReduce },
87 [this](emscripten::val) { QWasmTheme::onMotionPreferenceChange(); },
88 m_motionPreferenceChangeCallback);
89}
90
92{
93 if (fixedFont)
94 delete fixedFont;
95}
96
97const QPalette *QWasmTheme::palette(Palette type) const
98{
99 if (type == SystemPalette) {
100 if (m_paletteIsDirty) {
101 m_paletteIsDirty = false;
102 *m_palette = qt_fusionPalette();
103 }
104 return m_palette.get();
105 }
106 return nullptr;
107}
108
110{
111 return m_colorScheme;
112}
113
114void QWasmTheme::requestColorScheme(Qt::ColorScheme scheme)
115{
116 if (m_colorScheme != scheme) {
117 m_paletteIsDirty = true;
118 m_colorScheme = scheme;
119 QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();
120 }
121}
122
124{
125 return m_contrastPreference;
126}
127
129{
130 return m_motionPreference;
131}
132
133QVariant QWasmTheme::themeHint(ThemeHint hint) const
134{
135 if (hint == QPlatformTheme::StyleNames)
136 return QVariant(QStringList() << "Fusion"_L1);
137 if (hint == QPlatformTheme::UiEffects)
138 return QVariant(int(HoverEffect));
139 return QPlatformTheme::themeHint(hint);
140}
141
142const QFont *QWasmTheme::font(Font type) const
143{
144 if (type == QPlatformTheme::FixedFont) {
145 return fixedFont;
146 }
147 return nullptr;
148}
149
150bool QWasmTheme::usePlatformNativeDialog(DialogType type) const
151{
152 return (type == DialogType::FileDialog);
153}
154
156{
157 if (type == DialogType::FileDialog)
158 return new QWasmFileDialogHelper();
159 return nullptr;
160}
161
163{
164 auto colorScheme = getColorSchemeFromMedia();
165 if (m_colorScheme != colorScheme) {
166 qCDebug(lcQpaThemeWasm) << "Color scheme changed to " << colorScheme;
167 m_colorScheme = colorScheme;
168 m_paletteIsDirty = true;
169 QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();
170 }
171}
172
174{
175 auto contrastPreference = getContrastPreferenceFromMedia();
176 if (m_contrastPreference != contrastPreference) {
177 qCDebug(lcQpaThemeWasm) << "Contrast preference changed to " << contrastPreference;
178 m_contrastPreference = contrastPreference;
179 m_paletteIsDirty = true;
180 QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();
181 }
182}
183
185{
186 auto motionPreference = getMotionPreferenceFromMedia();
187 if (m_motionPreference != motionPreference) {
188 qCDebug(lcQpaThemeWasm) << "Motion preference changed to " << motionPreference;
189 m_motionPreference = motionPreference;
190 QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();
191 }
192}
193
194QT_END_NAMESPACE
void onContrastPreferenceChange()
QPlatformDialogHelper * createPlatformDialogHelper(DialogType type) const override
Qt::ContrastPreference contrastPreference() const override
void onMotionPreferenceChange()
bool usePlatformNativeDialog(DialogType type) const override
const QPalette * palette(Palette type=SystemPalette) const override
Return a color palette for type type.
Qt::ColorScheme colorScheme() const override
void requestColorScheme(Qt::ColorScheme scheme) override
void onColorSchemeChange()
QVariant themeHint(ThemeHint hint) const override
Qt::MotionPreference motionPreference() const override
const QFont * font(Font type) const override
Qt::ContrastPreference getContrastPreferenceFromMedia()
Qt::ColorScheme getColorSchemeFromMedia()
Qt::MotionPreference getMotionPreferenceFromMedia()
bool matchMedia(std::string mediaQueryString)
#define qCDebug(category,...)
#define Q_STATIC_LOGGING_CATEGORY(name,...)
QDebug Q_GUI_EXPORT & operator<<(QDebug &s, const QVectorPath &path)
constexpr auto contrastPreferenceMore
Definition qwasmtheme.h:28
constexpr auto colorSchemePreferenceDark
Definition qwasmtheme.h:26