diff --git a/skins/material/QskMaterialSkin.cpp b/skins/material/QskMaterialSkin.cpp index 28e5adf8..1873e030 100644 --- a/skins/material/QskMaterialSkin.cpp +++ b/skins/material/QskMaterialSkin.cpp @@ -55,7 +55,7 @@ namespace class Editor : private QskSkinHintTableEditor { public: - Editor( QskSkinHintTable* table, const QskMaterialPalette& palette ) + Editor( QskSkinHintTable* table, const QskMaterialTheme& palette ) : QskSkinHintTableEditor( table ) , m_pal( palette ) { @@ -91,7 +91,7 @@ namespace void setupTextInput(); void setupTextLabel(); - const QskMaterialPalette& m_pal; + const QskMaterialTheme& m_pal; const uint rippleSize = 30; }; } @@ -830,7 +830,94 @@ void Editor::setupSubWindow() } -QskMaterialSkin::QskMaterialSkin( const QskMaterialPalette& palette, QObject* parent ) +QskMaterialTheme::QskMaterialTheme( Lightness lightness ) + : QskMaterialTheme( lightness, + { + QskRgbPalette::palette( QskRgbPalette::DefaultMaterialPrimary ), + QskRgbPalette::palette( QskRgbPalette::DefaultMaterialSecondary ), + QskRgbPalette::palette( QskRgbPalette::DefaultMaterialTertiary ), + QskRgbPalette::palette( QskRgbPalette::DefaultMaterialError ), + QskRgbPalette::palette( QskRgbPalette::DefaultMaterialNeutral ), + QskRgbPalette::palette( QskRgbPalette::DefaultMaterialNeutralVariant ), + } ) +{ +} + +QskMaterialTheme::QskMaterialTheme( Lightness lightness, + std::array< QskRgbPalette, NumPaletteTypes > palettes ) + : m_palettes( palettes ) +{ + using Q = QskRgbPalette; + + if ( lightness == Light ) + { + using Q = QskRgbPalette; + + primary = m_palettes[ Primary ].rgb( Q::W40 ); + onPrimary = m_palettes[ Primary ].rgb( Q::W100 ); + primaryContainer = m_palettes[ Primary ].rgb( Q::W90 ); + onPrimaryContainer = m_palettes[ Primary ].rgb( Q::W10 ); + + primary = m_palettes[ Secondary ].rgb( Q::W40 ); + onSecondary = m_palettes[ Secondary ].rgb( Q::W100 ); + secondaryContainer = m_palettes[ Secondary ].rgb( Q::W90 ); + onSecondaryContainer = m_palettes[ Secondary ].rgb( Q::W10 ); + + tertiary = m_palettes[ Tertiary ].rgb( Q::W40 ); + onTertiary = m_palettes[ Tertiary ].rgb( Q::W100 ); + tertiaryContainer = m_palettes[ Tertiary ].rgb( Q::W90 ); + onTertiaryContainer = m_palettes[ Tertiary ].rgb( Q::W10 ); + + error = m_palettes[ Error ].rgb( Q::W40 ); + onError = m_palettes[ Error ].rgb( Q::W100 ); + errorContainer = m_palettes[ Error ].rgb( Q::W90 ); + onErrorContainer = m_palettes[ Error ].rgb( Q::W10 ); + + background = m_palettes[ Neutral ].rgb( Q::W99 ); + onBackground = m_palettes[ Neutral ].rgb( Q::W10 ); + surface = m_palettes[ Neutral ].rgb( Q::W99 ); + onSurface = m_palettes[ Neutral ].rgb( Q::W10 ); + + surfaceVariant = m_palettes[ NeutralVariant ].rgb( Q::W90 ); + onSurfaceVariant = m_palettes[ NeutralVariant ].rgb( Q::W30 ); + outline = m_palettes[ NeutralVariant ].rgb( Q::W50 ); + } + else if ( lightness == Dark ) + { + using Q = QskRgbPalette; + + primary = m_palettes[ Primary ].rgb( Q::W80 ); + onPrimary = m_palettes[ Primary ].rgb( Q::W20 ); + primaryContainer = m_palettes[ Primary ].rgb( Q::W30 ); + onPrimaryContainer = m_palettes[ Primary ].rgb( Q::W90 ); + + primary = m_palettes[ Secondary ].rgb( Q::W80 ); + onSecondary = m_palettes[ Secondary ].rgb( Q::W20 ); + secondaryContainer = m_palettes[ Secondary ].rgb( Q::W30 ); + onSecondaryContainer = m_palettes[ Secondary ].rgb( Q::W90 ); + + tertiary = m_palettes[ Tertiary ].rgb( Q::W80 ); + onTertiary = m_palettes[ Tertiary ].rgb( Q::W20 ); + tertiaryContainer = m_palettes[ Tertiary ].rgb( Q::W30 ); + onTertiaryContainer = m_palettes[ Tertiary ].rgb( Q::W90 ); + + error = m_palettes[ Error ].rgb( Q::W80 ); + onError = m_palettes[ Error ].rgb( Q::W20 ); + errorContainer = m_palettes[ Error ].rgb( Q::W30 ); + onErrorContainer = m_palettes[ Error ].rgb( Q::W90 ); + + background = m_palettes[ Neutral ].rgb( Q::W10 ); + onBackground = m_palettes[ Neutral ].rgb( Q::W90 ); + surface = m_palettes[ Neutral ].rgb( Q::W10 ); + onSurface = m_palettes[ Neutral ].rgb( Q::W80 ); + + surfaceVariant = m_palettes[ NeutralVariant ].rgb( Q::W30 ); + onSurfaceVariant = m_palettes[ NeutralVariant ].rgb( Q::W80 ); + outline = m_palettes[ NeutralVariant ].rgb( Q::W60 ); + } +} + +QskMaterialSkin::QskMaterialSkin( const QskMaterialTheme& palette, QObject* parent ) : Inherited( parent ) { // Default theme colors diff --git a/skins/material/QskMaterialSkin.h b/skins/material/QskMaterialSkin.h index c387f70a..b070862c 100644 --- a/skins/material/QskMaterialSkin.h +++ b/skins/material/QskMaterialSkin.h @@ -8,12 +8,31 @@ #include "QskMaterialGlobal.h" #include -#include +#include -class QSK_MATERIAL_EXPORT QskMaterialPalette +class QSK_MATERIAL_EXPORT QskMaterialTheme { public: - // ### here add palettes? Or just pass them in the constructor? + enum Lightness + { + Light, + Dark + }; + + enum PaletteType + { + Primary, + Secondary, + Tertiary, + Error, + Neutral, + NeutralVariant, + + NumPaletteTypes + }; + + QskMaterialTheme( Lightness ); + QskMaterialTheme( Lightness, std::array< QskRgbPalette, NumPaletteTypes > ); QRgb primary; QRgb onPrimary; @@ -43,6 +62,9 @@ class QSK_MATERIAL_EXPORT QskMaterialPalette QRgb surfaceVariant; QRgb onSurfaceVariant; QRgb outline; + + private: + std::array< QskRgbPalette, NumPaletteTypes > m_palettes; }; class QSK_MATERIAL_EXPORT QskMaterialSkin : public QskSkin @@ -52,8 +74,10 @@ class QSK_MATERIAL_EXPORT QskMaterialSkin : public QskSkin using Inherited = QskSkin; public: - QskMaterialSkin( const QskMaterialPalette&, QObject* parent = nullptr ); + QskMaterialSkin( const QskMaterialTheme&, QObject* parent = nullptr ); ~QskMaterialSkin() override; + + // ### add setTheme() re-implement resetColors() }; #endif diff --git a/skins/material/QskMaterialSkinFactory.cpp b/skins/material/QskMaterialSkinFactory.cpp index d82a4e1a..e73cd20f 100644 --- a/skins/material/QskMaterialSkinFactory.cpp +++ b/skins/material/QskMaterialSkinFactory.cpp @@ -12,14 +12,6 @@ static const QString materialDarkSkinName = QStringLiteral( "materialDark" ); QskMaterialSkinFactory::QskMaterialSkinFactory( QObject* parent ) : QskSkinFactory( parent ) { - using Q = QskRgbPalette; - - m_palettes[ Primary ] = Q::palette( Q::DefaultMaterialPrimary ); - m_palettes[ Secondary ] = Q::palette( Q::DefaultMaterialSecondary ); - m_palettes[ Tertiary ] = Q::palette( Q::DefaultMaterialTertiary ); - m_palettes[ Error ] = Q::palette( Q::DefaultMaterialError ); - m_palettes[ Neutral ] = Q::palette( Q::DefaultMaterialNeutral ); - m_palettes[ NeutralVariant ] = Q::palette( Q::DefaultMaterialNeutralVariant ); } QskMaterialSkinFactory::~QskMaterialSkinFactory() @@ -35,79 +27,13 @@ QskSkin* QskMaterialSkinFactory::createSkin( const QString& skinName ) { if ( QString::compare( skinName, materialLightSkinName, Qt::CaseInsensitive ) == 0 ) { - // ### Move this to QskMaterialSkin? - QskMaterialPalette pal; - - using Q = QskRgbPalette; - - pal.primary = m_palettes[ Primary ].rgb( Q::W40 ); - pal.onPrimary = m_palettes[ Primary ].rgb( Q::W100 ); - pal.primaryContainer = m_palettes[ Primary ].rgb( Q::W90 ); - pal.onPrimaryContainer = m_palettes[ Primary ].rgb( Q::W10 ); - - pal.primary = m_palettes[ Secondary ].rgb( Q::W40 ); - pal.onSecondary = m_palettes[ Secondary ].rgb( Q::W100 ); - pal.secondaryContainer = m_palettes[ Secondary ].rgb( Q::W90 ); - pal.onSecondaryContainer = m_palettes[ Secondary ].rgb( Q::W10 ); - - pal.tertiary = m_palettes[ Tertiary ].rgb( Q::W40 ); - pal.onTertiary = m_palettes[ Tertiary ].rgb( Q::W100 ); - pal.tertiaryContainer = m_palettes[ Tertiary ].rgb( Q::W90 ); - pal.onTertiaryContainer = m_palettes[ Tertiary ].rgb( Q::W10 ); - - pal.error = m_palettes[ Error ].rgb( Q::W40 ); - pal.onError = m_palettes[ Error ].rgb( Q::W100 ); - pal.errorContainer = m_palettes[ Error ].rgb( Q::W90 ); - pal.onErrorContainer = m_palettes[ Error ].rgb( Q::W10 ); - - pal.background = m_palettes[ Neutral ].rgb( Q::W99 ); - pal.onBackground = m_palettes[ Neutral ].rgb( Q::W10 ); - pal.surface = m_palettes[ Neutral ].rgb( Q::W99 ); - pal.onSurface = m_palettes[ Neutral ].rgb( Q::W10 ); - - pal.surfaceVariant = m_palettes[ NeutralVariant ].rgb( Q::W90 ); - pal.onSurfaceVariant = m_palettes[ NeutralVariant ].rgb( Q::W30 ); - pal.outline = m_palettes[ NeutralVariant ].rgb( Q::W50 ); - - return new QskMaterialSkin( pal ); + QskMaterialTheme theme( QskMaterialTheme::Light ); + return new QskMaterialSkin( theme ); } - - if ( QString::compare( skinName, materialDarkSkinName, Qt::CaseInsensitive ) == 0 ) + else if ( QString::compare( skinName, materialDarkSkinName, Qt::CaseInsensitive ) == 0 ) { - QskMaterialPalette pal; - - using Q = QskRgbPalette; - - pal.primary = m_palettes[ Primary ].rgb( Q::W80 ); - pal.onPrimary = m_palettes[ Primary ].rgb( Q::W20 ); - pal.primaryContainer = m_palettes[ Primary ].rgb( Q::W30 ); - pal.onPrimaryContainer = m_palettes[ Primary ].rgb( Q::W90 ); - - pal.primary = m_palettes[ Secondary ].rgb( Q::W80 ); - pal.onSecondary = m_palettes[ Secondary ].rgb( Q::W20 ); - pal.secondaryContainer = m_palettes[ Secondary ].rgb( Q::W30 ); - pal.onSecondaryContainer = m_palettes[ Secondary ].rgb( Q::W90 ); - - pal.tertiary = m_palettes[ Tertiary ].rgb( Q::W80 ); - pal.onTertiary = m_palettes[ Tertiary ].rgb( Q::W20 ); - pal.tertiaryContainer = m_palettes[ Tertiary ].rgb( Q::W30 ); - pal.onTertiaryContainer = m_palettes[ Tertiary ].rgb( Q::W90 ); - - pal.error = m_palettes[ Error ].rgb( Q::W80 ); - pal.onError = m_palettes[ Error ].rgb( Q::W20 ); - pal.errorContainer = m_palettes[ Error ].rgb( Q::W30 ); - pal.onErrorContainer = m_palettes[ Error ].rgb( Q::W90 ); - - pal.background = m_palettes[ Neutral ].rgb( Q::W10 ); - pal.onBackground = m_palettes[ Neutral ].rgb( Q::W90 ); - pal.surface = m_palettes[ Neutral ].rgb( Q::W10 ); - pal.onSurface = m_palettes[ Neutral ].rgb( Q::W80 ); - - pal.surfaceVariant = m_palettes[ NeutralVariant ].rgb( Q::W30 ); - pal.onSurfaceVariant = m_palettes[ NeutralVariant ].rgb( Q::W80 ); - pal.outline = m_palettes[ NeutralVariant ].rgb( Q::W60 ); - - return new QskMaterialSkin( pal ); + QskMaterialTheme theme( QskMaterialTheme::Dark ); + return new QskMaterialSkin( theme ); } return nullptr; diff --git a/skins/material/QskMaterialSkinFactory.h b/skins/material/QskMaterialSkinFactory.h index f1a06c8a..0936d76b 100644 --- a/skins/material/QskMaterialSkinFactory.h +++ b/skins/material/QskMaterialSkinFactory.h @@ -21,23 +21,8 @@ class QSK_MATERIAL_EXPORT QskMaterialSkinFactory : public QskSkinFactory QskMaterialSkinFactory( QObject* parent = nullptr ); ~QskMaterialSkinFactory() override; - enum PaletteType - { - Primary, - Secondary, - Tertiary, - Error, - Neutral, - NeutralVariant, - - NumPaletteTypes - }; - QStringList skinNames() const override; QskSkin* createSkin( const QString& skinName ) override; - - private: - QskRgbPalette m_palettes[ NumPaletteTypes ]; }; #endif