From 38e00addd648b49106116992c9ba76ba8bdff6c8 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 30 Jan 2024 10:43:27 +0100 Subject: [PATCH] code moved from QskSetup to QskSkinManager --- examples/gallery/main.cpp | 5 +-- examples/iotdashboard/main.cpp | 14 +++--- examples/mycontrols/main.cpp | 6 +-- examples/qvgviewer/MainWindow.cpp | 6 +-- playground/gradients/main.cpp | 4 +- src/controls/QskGraphicLabel.cpp | 4 +- src/controls/QskPushButton.cpp | 4 +- src/controls/QskQuickItem.cpp | 5 ++- src/controls/QskSetup.cpp | 58 ++----------------------- src/controls/QskSetup.h | 7 --- src/controls/QskSkinManager.cpp | 72 +++++++++++++++++++++++++++---- src/controls/QskSkinManager.h | 10 ++++- src/controls/QskSkinnable.cpp | 4 +- src/controls/QskWindow.cpp | 4 +- support/SkinnyNamespace.cpp | 19 ++++---- 15 files changed, 112 insertions(+), 110 deletions(-) diff --git a/examples/gallery/main.cpp b/examples/gallery/main.cpp index 9edaf1b6..7ca7e09d 100644 --- a/examples/gallery/main.cpp +++ b/examples/gallery/main.cpp @@ -38,7 +38,6 @@ #include #include #include -#include #include @@ -159,7 +158,7 @@ namespace for ( const auto& name : names ) menu->addOption( QUrl(), name ); - if ( const auto index = names.indexOf( qskSetup->skinName() ) ) + if ( const auto index = names.indexOf( qskSkinManager->skinName() ) ) menu->setCurrentIndex( index ); connect( menu, &QskMenu::triggered, this, &SkinButton::changeSkin ); @@ -170,7 +169,7 @@ namespace const auto names = qskSkinManager->skinNames(); if ( ( index >= 0 ) && ( index < names.size() ) - && ( index != names.indexOf( qskSetup->skinName() ) ) ) + && ( index != names.indexOf( qskSkinManager->skinName() ) ) ) { Skinny::setSkin( index, 500 ); } diff --git a/examples/iotdashboard/main.cpp b/examples/iotdashboard/main.cpp index ab2cb0b5..46410360 100644 --- a/examples/iotdashboard/main.cpp +++ b/examples/iotdashboard/main.cpp @@ -79,7 +79,7 @@ int main( int argc, char* argv[] ) qskSkinManager->registerFactory( QStringLiteral( "SampleSkinFactory" ), new SkinFactory() ); - qskSetup->setSkin( "DaytimeSkin" ); + qskSkinManager->setSkin( "DaytimeSkin" ); #ifdef USE_SHORTCUTS // With CTRL-B you can rotate a couple of visual debug modes @@ -92,13 +92,13 @@ int main( int argc, char* argv[] ) for( int i = 1; i < argc; i++ ) { - if( argv[i] == QStringLiteral("--screenshot") && i + 1 < argc ) - { - QTimer::singleShot( 500, &window, [&app, &window, filename = QString(argv[i + 1])]() - { auto image = window.grabWindow(); image.save(filename); } ); + if( argv[i] == QStringLiteral( "--screenshot" ) && i + 1 < argc ) + { + QTimer::singleShot( 500, &window, [&app, &window, filename = QString(argv[i + 1])]() + { auto image = window.grabWindow(); image.save(filename); } ); - break; - } + break; + } } return app.exec(); diff --git a/examples/mycontrols/main.cpp b/examples/mycontrols/main.cpp index c57914f7..5c7dfab9 100644 --- a/examples/mycontrols/main.cpp +++ b/examples/mycontrols/main.cpp @@ -102,11 +102,11 @@ class Window : public QskWindow private: void setAlternativeSkin( bool on ) { - auto oldSkin = qskSetup->skin(); - if ( oldSkin->parent() == qskSetup ) + auto oldSkin = qskSkinManager->skin(); + if ( oldSkin->parent() == qskSkinManager ) oldSkin->setParent( nullptr ); // otherwise setSkin deletes it - auto newSkin = qskSetup->setSkin( alternativeSkin( on ) ); + auto newSkin = qskSkinManager->setSkin( alternativeSkin( on ) ); QskSkinTransition transition; diff --git a/examples/qvgviewer/MainWindow.cpp b/examples/qvgviewer/MainWindow.cpp index 33269930..001c6c87 100644 --- a/examples/qvgviewer/MainWindow.cpp +++ b/examples/qvgviewer/MainWindow.cpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include @@ -92,10 +92,10 @@ MainWindow::MainWindow() connect( invertButton, &QskPushButton::toggled, label, &GraphicLabel::setDarknessMode ); - connect( qskSetup, &QskSetup::skinChanged, + connect( qskSkinManager, &QskSkinManager::skinChanged, this, &MainWindow::setGraphicRoles ); - setGraphicRoles( qskSetup->skin() ); + setGraphicRoles( qskSkinManager->skin() ); } void MainWindow::setGraphicRoles( QskSkin* skin ) diff --git a/playground/gradients/main.cpp b/playground/gradients/main.cpp index 2a3b721e..e952c8f2 100644 --- a/playground/gradients/main.cpp +++ b/playground/gradients/main.cpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include @@ -208,7 +208,7 @@ int main( int argc, char** argv ) Skinny::init(); // we need a skin SkinnyShortcut::enable( SkinnyShortcut::Quit | SkinnyShortcut::DebugBackground ); - qskSetup->setSkin( "fusion" ); + qskSkinManager->setSkin( "fusion" ); QskWindow window; window.setColor( QskRgb::Wheat ); diff --git a/src/controls/QskGraphicLabel.cpp b/src/controls/QskGraphicLabel.cpp index 39a1802a..0f05e4dc 100644 --- a/src/controls/QskGraphicLabel.cpp +++ b/src/controls/QskGraphicLabel.cpp @@ -8,7 +8,7 @@ #include "QskColorFilter.h" #include "QskGraphic.h" #include "QskGraphicProvider.h" -#include "QskSetup.h" +#include "QskSkinManager.h" #include "QskSkin.h" QSK_SUBCONTROL( QskGraphicLabel, Panel ) @@ -309,7 +309,7 @@ void QskGraphicLabel::changeEvent( QEvent* event ) { if ( event->type() == QEvent::StyleChange ) { - if ( !m_data->source.isEmpty() && qskSetup->skin()->hasGraphicProvider() ) + if ( !m_data->source.isEmpty() && qskSkinManager->skin()->hasGraphicProvider() ) { // we might need to reload from a different skin m_data->isSourceDirty = true; diff --git a/src/controls/QskPushButton.cpp b/src/controls/QskPushButton.cpp index 3d866cc7..f6f8370c 100644 --- a/src/controls/QskPushButton.cpp +++ b/src/controls/QskPushButton.cpp @@ -9,7 +9,7 @@ #include "QskBoxShapeMetrics.h" #include "QskGraphic.h" #include "QskGraphicProvider.h" -#include "QskSetup.h" +#include "QskSkinManager.h" #include "QskSkin.h" #include "QskSkinlet.h" #include "QskTextOptions.h" @@ -275,7 +275,7 @@ void QskPushButton::changeEvent( QEvent* event ) case QEvent::StyleChange: { if ( !m_data->iconSource.isEmpty() && - qskSetup->skin()->hasGraphicProvider() ) + qskSkinManager->skin()->hasGraphicProvider() ) { // we might need to reload from a different skin m_data->isIconSourceDirty = true; diff --git a/src/controls/QskQuickItem.cpp b/src/controls/QskQuickItem.cpp index 492a3e94..204a2334 100644 --- a/src/controls/QskQuickItem.cpp +++ b/src/controls/QskQuickItem.cpp @@ -8,6 +8,7 @@ #include "QskQuick.h" #include "QskEvent.h" #include "QskSetup.h" +#include "QskSkinManager.h" #include "QskSkin.h" #include "QskDirtyItemFilter.h" @@ -76,8 +77,8 @@ namespace We would also need to send QEvent::StyleChange, when a window has a new skin. TODO ... */ - QObject::connect( qskSetup, &QskSetup::skinChanged, - qskSetup, [ this ] { updateSkin(); } ); + QObject::connect( qskSkinManager, &QskSkinManager::skinChanged, + qskSkinManager, [ this ] { updateSkin(); } ); } inline void insert( QskQuickItem* item ) diff --git a/src/controls/QskSetup.cpp b/src/controls/QskSetup.cpp index 25727ddb..9ba906d6 100644 --- a/src/controls/QskSetup.cpp +++ b/src/controls/QskSetup.cpp @@ -7,12 +7,11 @@ #include "QskControl.h" #include "QskControlPrivate.h" #include "QskGraphicProviderMap.h" -#include "QskSkin.h" #include "QskSkinManager.h" +#include "QskSkin.h" #include "QskWindow.h" #include -#include #include QskSetup* QskSetup::s_instance = nullptr; @@ -81,9 +80,6 @@ class QskSetup::PrivateData { } - QString skinName; - QPointer< QskSkin > skin; - QskGraphicProviderMap graphicProviders; QskQuickItem::UpdateFlags itemUpdateFlags; }; @@ -152,53 +148,6 @@ bool QskSetup::testItemUpdateFlag( QskQuickItem::UpdateFlag flag ) return m_data->itemUpdateFlags.testFlag( flag ); } -QskSkin* QskSetup::setSkin( const QString& skinName ) -{ - if ( m_data->skin && ( skinName == m_data->skinName ) ) - return m_data->skin; - - auto skin = QskSkinManager::instance()->createSkin( skinName ); - if ( skin == nullptr ) - return nullptr; - - if ( skin->parent() == nullptr ) - skin->setParent( this ); - - const auto oldSkin = m_data->skin; - - m_data->skin = skin; - m_data->skinName = skinName; - - if ( oldSkin ) - { - Q_EMIT skinChanged( skin ); - - if ( oldSkin->parent() == this ) - delete oldSkin; - } - - return m_data->skin; -} - -QString QskSetup::skinName() const -{ - return m_data->skinName; -} - -QskSkin* QskSetup::skin() -{ - if ( m_data->skin == nullptr ) - { - m_data->skin = QskSkinManager::instance()->createSkin( QString() ); - Q_ASSERT( m_data->skin ); - - m_data->skin->setParent( this ); - m_data->skinName = m_data->skin->objectName(); - } - - return m_data->skin; -} - void QskSetup::addGraphicProvider( const QString& providerId, QskGraphicProvider* provider ) { m_data->graphicProviders.insert( providerId, provider ); @@ -206,10 +155,9 @@ void QskSetup::addGraphicProvider( const QString& providerId, QskGraphicProvider QskGraphicProvider* QskSetup::graphicProvider( const QString& providerId ) const { - if ( m_data->skin ) + if ( auto skin = qskSkinManager->skin() ) { - QskGraphicProvider* provider = m_data->skin->graphicProvider( providerId ); - if ( provider ) + if ( auto provider = skin->graphicProvider( providerId ) ) return provider; } diff --git a/src/controls/QskSetup.h b/src/controls/QskSetup.h index d824b0c2..d541a614 100644 --- a/src/controls/QskSetup.h +++ b/src/controls/QskSetup.h @@ -12,7 +12,6 @@ #include #include -class QskSkin; class QQuickItem; class QskGraphicProvider; @@ -38,11 +37,6 @@ class QSK_EXPORT QskSetup : public QObject void resetItemUpdateFlag( QskQuickItem::UpdateFlag ); bool testItemUpdateFlag( QskQuickItem::UpdateFlag ); - QskSkin* setSkin( const QString& ); - QString skinName() const; - - QskSkin* skin(); - void addGraphicProvider( const QString& providerId, QskGraphicProvider* ); QskGraphicProvider* graphicProvider( const QString& providerId ) const; @@ -50,7 +44,6 @@ class QSK_EXPORT QskSetup : public QObject static void cleanup(); Q_SIGNALS: - void skinChanged( QskSkin* ); void itemUpdateFlagsChanged(); private: diff --git a/src/controls/QskSkinManager.cpp b/src/controls/QskSkinManager.cpp index ae4cc662..c3c4d92c 100644 --- a/src/controls/QskSkinManager.cpp +++ b/src/controls/QskSkinManager.cpp @@ -5,6 +5,7 @@ #include "QskSkinManager.h" #include "QskSkinFactory.h" +#include "QskSkin.h" #include #include @@ -20,13 +21,6 @@ #include #endif -static inline QStringList qskSplitPath( const QString& s ) -{ - const auto separator = QDir::listSeparator(); - - return s.split( separator, Qt::SkipEmptyParts ); -} - /* We could use QFactoryLoader, but as it is again a "private" class and does a couple of hardcoded things we don't need ( like always resolving @@ -48,7 +42,8 @@ static QStringList qskPathList( const char* envName ) if ( env.isEmpty() ) return QStringList(); - return qskSplitPath( QFile::decodeName( env ) ); + const auto name = QFile::decodeName( env ); + return name.split( QDir::listSeparator(), Qt::SkipEmptyParts ); } static inline QString qskResolvedPath( const QString& path ) @@ -406,6 +401,8 @@ class QskSkinManager::PrivateData QStringList pluginPaths; FactoryMap factoryMap; + QPointer< QskSkin > skin; + bool pluginsRegistered : 1; }; @@ -540,7 +537,64 @@ QskSkin* QskSkinManager::createSkin( const QString& skinName ) const } } - return factory ? factory->createSkin( name ) : nullptr; + QskSkin* skin = nullptr; + + if ( factory ) + { + skin = factory->createSkin( name ); + if ( skin ) + skin->setObjectName( name ); + } + + return skin; +} + +QskSkin* QskSkinManager::setSkin( const QString& name ) +{ + if ( m_data->skin && ( m_data->skin->objectName() == name ) ) + return m_data->skin; + + auto skin = createSkin( name ); + if ( skin == nullptr ) + return nullptr; + + if ( skin->parent() == nullptr ) + skin->setParent( this ); + + const auto oldSkin = m_data->skin; + + m_data->skin = skin; + + if ( oldSkin ) + { + Q_EMIT skinChanged( skin ); + + if ( oldSkin->parent() == this ) + delete oldSkin; + } + + return m_data->skin; +} + +QString QskSkinManager::skinName() const +{ + if ( m_data->skin ) + return m_data->skin->objectName(); + + return QString(); +} + +QskSkin* QskSkinManager::skin() +{ + if ( m_data->skin == nullptr ) + { + m_data->skin = createSkin( QString() ); + Q_ASSERT( m_data->skin ); + + m_data->skin->setParent( this ); + } + + return m_data->skin; } #include "moc_QskSkinManager.cpp" diff --git a/src/controls/QskSkinManager.h b/src/controls/QskSkinManager.h index 74563854..8a3d1b63 100644 --- a/src/controls/QskSkinManager.h +++ b/src/controls/QskSkinManager.h @@ -39,7 +39,15 @@ class QSK_EXPORT QskSkinManager : public QObject QStringList skinNames() const; - QskSkin* createSkin( const QString& skinName ) const; + QskSkin* createSkin( const QString& name ) const; + + QskSkin* skin(); + + QskSkin* setSkin( const QString& ); + QString skinName() const; + + Q_SIGNALS: + void skinChanged( QskSkin* ); protected: QskSkinManager(); diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 3931dd9d..cf73ea7c 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -12,7 +12,7 @@ #include "QskControl.h" #include "QskHintAnimator.h" #include "QskMargins.h" -#include "QskSetup.h" +#include "QskSkinManager.h" #include "QskSkin.h" #include "QskSkinHintTable.h" #include "QskSkinTransition.h" @@ -1520,7 +1520,7 @@ QskSkin* QskSkinnable::effectiveSkin() const skin = qskEffectiveSkin( item->window() ); } - return skin ? skin : qskSetup->skin(); + return skin ? skin : qskSkinManager->skin(); } QskAspect::Variation QskSkinnable::effectiveVariation() const diff --git a/src/controls/QskWindow.cpp b/src/controls/QskWindow.cpp index 431e9da9..d94067f2 100644 --- a/src/controls/QskWindow.cpp +++ b/src/controls/QskWindow.cpp @@ -662,7 +662,7 @@ void QskWindow::enforceSkin() // let's create a default skin on the GUI thread - whatever it is // good for. - ( void ) qskSetup->skin(); + ( void ) qskSkinManager->skin(); qskEnforcedSkin = true; } @@ -718,7 +718,7 @@ QskSkin* qskEffectiveSkin( const QQuickWindow* window ) return skin; } - return qskSetup->skin(); + return qskSkinManager->skin(); } #include "moc_QskWindow.cpp" diff --git a/support/SkinnyNamespace.cpp b/support/SkinnyNamespace.cpp index 433a054d..2e9908c2 100644 --- a/support/SkinnyNamespace.cpp +++ b/support/SkinnyNamespace.cpp @@ -5,7 +5,6 @@ #include "SkinnyNamespace.h" -#include #include #include #include @@ -13,13 +12,13 @@ #include #include +#include #define STRINGIFY(x) #x #define STRING(x) STRINGIFY(x) #if defined( PLUGIN_PATH ) -#include #include #define STRINGIFY(x) #x @@ -74,7 +73,7 @@ static bool pluginPath = initPluginPath(); } if ( !skinNames.isEmpty() ) - qskSetup->setSkin( skinNames[0] ); + qskSkinManager->setSkin( skinNames[0] ); } Q_COREAPP_STARTUP_FUNCTION( initSkins ) @@ -136,7 +135,7 @@ void Skinny::changeSkin( QskAnimationHint hint ) const auto names = qskSkinManager->skinNames(); if ( names.size() > 1 ) { - auto index = names.indexOf( qskSetup->skinName() ); + auto index = names.indexOf( qskSkinManager->skinName() ); index = ( index + 1 ) % names.size(); setSkin( index, hint ); @@ -149,14 +148,14 @@ void Skinny::setSkin( int index, QskAnimationHint hint ) if ( names.size() <= 1 ) return; - if ( index == names.indexOf( qskSetup->skinName() ) ) + if ( index == names.indexOf( qskSkinManager->skinName() ) ) return; - auto oldSkin = qskSetup->skin(); - if ( oldSkin->parent() == qskSetup ) + auto oldSkin = qskSkinManager->skin(); + if ( oldSkin->parent() == qskSkinManager ) oldSkin->setParent( nullptr ); // otherwise setSkin deletes it - if ( auto newSkin = qskSetup->setSkin( names[ index ] ) ) + if ( auto newSkin = qskSkinManager->setSkin( names[ index ] ) ) { QskSkinTransition transition; @@ -174,7 +173,7 @@ void Skinny::setSkin( int index, QskAnimationHint hint ) void Skinny::changeFonts( int increment ) { - auto skin = qskSetup->skin(); + auto skin = qskSkinManager->skin(); const auto fonts = skin->fonts(); @@ -199,7 +198,7 @@ void Skinny::changeFonts( int increment ) skin->setFont( role, font ); } - Q_EMIT qskSetup->skinChanged( skin ); + Q_EMIT qskSkinManager->skinChanged( skin ); } void Skinny::init()