summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmtheme.cpp
blob: b9340f31275a12d66921f180b77bce1d0f71ea57 (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
// Copyright (C) 2018 The Qt Company Ltd.// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only#include"qwasmtheme.h"#include <QtCore/qvariant.h>#include <QFontDatabase>#include <QList>#include <qloggingcategory.h>#include <qpa/qwindowsysteminterface.h>#include <qpalette.h>#include <emscripten.h>#include <emscripten/bind.h>#include <emscripten/val.h> Q_GUI_EXPORT QPalette qt_fusionPalette(); QT_BEGIN_NAMESPACE Q_STATIC_LOGGING_CATEGORY(lcQpaThemeWasm,"qt.qpa.theme.wasm")namespace{boolmatchMedia(std::string mediaQueryString){returnemscripten::val::global("window").call<emscripten::val>("matchMedia", mediaQueryString)["matches"].as<bool>();}Qt::ColorScheme getColorSchemeFromMedia(){if(matchMedia(colorSchemePreferenceDark)) {returnQt::ColorScheme::Dark;}else{returnQt::ColorScheme::Light;}}Qt::ContrastPreference getContrastPreferenceFromMedia(){if(matchMedia(contrastPreferenceMore)) {returnQt::ContrastPreference::HighContrast;}else{returnQt::ContrastPreference::NoPreference;}}}// namespaceusing namespaceQt::StringLiterals;QWasmTheme::QWasmTheme(){ m_colorScheme =getColorSchemeFromMedia();qCDebug(lcQpaThemeWasm) <<"Initializing Wasm theme. Color scheme: "<< m_colorScheme; m_contrastPreference =getContrastPreferenceFromMedia();qCDebug(lcQpaThemeWasm) <<"Initializing Wasm theme. Contrast preference: "<< m_contrastPreference;for(auto family :QFontDatabase::families())if(QFontDatabase::isFixedPitch(family)) fixedFont =newQFont(family); m_palette =std::make_unique<QPalette>(); m_paletteIsDirty =true;// Force update laterregisterCallbacks({ colorSchemePreferenceDark },[this](emscripten::val) {QWasmTheme::onColorSchemeChange(); }, m_colorSchemeChangeCallback);registerCallbacks({ contrastPreferenceNoPreference, contrastPreferenceMore, contrastPreferenceLess, contrastPreferenceCustom },[this](emscripten::val) {QWasmTheme::onContrastPreferenceChange(); }, m_contrastPreferenceChangeCallbacks);}QWasmTheme::~QWasmTheme(){if(fixedFont)delete fixedFont;}const QPalette *QWasmTheme::palette(Palette type)const{if(type == SystemPalette) {if(m_paletteIsDirty) { m_paletteIsDirty =false;*m_palette =qt_fusionPalette();}return m_palette.get();}returnnullptr;}Qt::ColorScheme QWasmTheme::colorScheme()const{return m_colorScheme;}voidQWasmTheme::requestColorScheme(Qt::ColorScheme scheme){if(m_colorScheme != scheme) { m_paletteIsDirty =true; m_colorScheme = scheme;QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();}}Qt::ContrastPreference QWasmTheme::contrastPreference()const{return m_contrastPreference;} QVariant QWasmTheme::themeHint(ThemeHint hint)const{if(hint ==QPlatformTheme::StyleNames)returnQVariant(QStringList() <<"Fusion"_L1);if(hint ==QPlatformTheme::UiEffects)returnQVariant(int(HoverEffect));returnQPlatformTheme::themeHint(hint);}const QFont *QWasmTheme::font(Font type)const{if(type ==QPlatformTheme::FixedFont) {return fixedFont;}returnnullptr;}voidQWasmTheme::onColorSchemeChange(){auto colorScheme =getColorSchemeFromMedia();if(m_colorScheme != colorScheme) {qCDebug(lcQpaThemeWasm) <<"Color scheme changed to "<< colorScheme; m_colorScheme = colorScheme; m_paletteIsDirty =true;QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();}}voidQWasmTheme::onContrastPreferenceChange(){auto contrastPreference =getContrastPreferenceFromMedia();if(m_contrastPreference != contrastPreference) {qCDebug(lcQpaThemeWasm) <<"Contrast preference changed to "<< contrastPreference; m_contrastPreference = contrastPreference; m_paletteIsDirty =true;QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();}} QT_END_NAMESPACE 
close