From b84593a6f4cfb058867cc1fed943d04720bb5290 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Tue, 27 Jun 2023 15:13:48 +0200 Subject: [PATCH] Skins: Order skins depending on system color scheme Resolves #320 --- skins/fluent2/metadata.json | 3 ++- skins/material3/metadata.json | 3 ++- skins/squiek/metadata.json | 2 +- src/controls/QskSkinManager.cpp | 45 ++++++++++++++++++++++++++++++--- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/skins/fluent2/metadata.json b/skins/fluent2/metadata.json index 9111091b..6eb6982c 100644 --- a/skins/fluent2/metadata.json +++ b/skins/fluent2/metadata.json @@ -1,4 +1,5 @@ { "FactoryId": "Fluent2Factory", - "Skins": [ "Fluent2 Light", "Fluent2 Dark" ] + "Skins": [ { "Name": "Fluent2 Light", "Scheme": "Light" }, + { "Name": "Fluent2 Dark", "Scheme": "Dark" } ] } diff --git a/skins/material3/metadata.json b/skins/material3/metadata.json index f4483d53..ef789842 100644 --- a/skins/material3/metadata.json +++ b/skins/material3/metadata.json @@ -1,4 +1,5 @@ { "FactoryId": "Material3Factory", - "Skins": [ "Material3 Light", "Material3 Dark" ] + "Skins": [ { "Name": "Material3 Light", "Scheme": "Light" }, + { "Name": "Material3 Dark", "Scheme": "Dark" } ] } diff --git a/skins/squiek/metadata.json b/skins/squiek/metadata.json index 1616d679..94786db2 100644 --- a/skins/squiek/metadata.json +++ b/skins/squiek/metadata.json @@ -1,4 +1,4 @@ { "FactoryId": "SquiekFactory", - "Skins": [ "Squiek" ] + "Skins": [ { "Name": "Squiek", "Scheme": "Unknown" } ] } diff --git a/src/controls/QskSkinManager.cpp b/src/controls/QskSkinManager.cpp index 5100c05c..45725cd3 100644 --- a/src/controls/QskSkinManager.cpp +++ b/src/controls/QskSkinManager.cpp @@ -8,12 +8,14 @@ #include #include +#include #include #include #include #include #include #include +#include static inline QStringList qskSplitPath( const QString& s ) { @@ -74,6 +76,8 @@ namespace const QLatin1String TokenData( "MetaData" ); const QLatin1String TokenFactoryId( "FactoryId" ); const QLatin1String TokenSkins( "Skins" ); + const QLatin1String TokenName( "Name" ); + const QLatin1String TokenScheme( "Scheme" ); const QLatin1String InterfaceId( QskSkinFactoryIID ); @@ -94,10 +98,45 @@ namespace m_factoryId = QStringLiteral( "skin_factory_" ) + QString::number( i++ ); } - const auto skinNames = factoryData.value( TokenSkins ).toArray(); + const auto skins = factoryData.value( TokenSkins ).toArray(); - for ( const auto& name : skinNames ) - m_skinNames += name.toString(); + for ( const auto& skin : skins ) + { + const auto& skinObject = skin.toObject(); + const auto& name = skinObject.value( TokenName ).toString(); + +#if QT_VERSION >= QT_VERSION_CHECK( 6, 5, 0 ) + const auto& schemeString = skinObject.value( TokenScheme ).toString(); + Qt::ColorScheme scheme; + + if( schemeString == QStringLiteral( "Light" ) ) + { + scheme = Qt::ColorScheme::Light; + } + else if( schemeString == QStringLiteral( "Dark" ) ) + { + scheme = Qt::ColorScheme::Dark; + } + else + { + scheme = Qt::ColorScheme::Unknown; + } + + const auto systemScheme = qGuiApp->styleHints()->colorScheme(); + + if( scheme == systemScheme ) + { + m_skinNames.prepend( name ); + } + else + { + m_skinNames.append( name ); + } +#else + Q_UNUSED( TokenScheme ) + m_skinNames += name; +#endif + } } return !m_skinNames.isEmpty();