code moved from QskSetup to QskSkinManager

This commit is contained in:
Uwe Rathmann 2024-01-30 10:43:27 +01:00
parent 0aff128eec
commit 38e00addd6
15 changed files with 112 additions and 110 deletions

View File

@ -38,7 +38,6 @@
#include <QskGraphicProvider.h>
#include <QskGraphicIO.h>
#include <QskGraphic.h>
#include <QskSetup.h>
#include <QGuiApplication>
@ -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 );
}

View File

@ -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();

View File

@ -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;

View File

@ -15,7 +15,7 @@
#include <QskLinearBox.h>
#include <QskPushButton.h>
#include <QskRgbValue.h>
#include <QskSetup.h>
#include <QskSkinManager.h>
#include <QskSkin.h>
#include <QskBoxShapeMetrics.h>
@ -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 )

View File

@ -15,7 +15,7 @@
#include <QskTextLabel.h>
#include <QskWindow.h>
#include <QskRgbValue.h>
#include <QskSetup.h>
#include <QskSkinManager.h>
#include <QDoubleValidator>
#include <QFontMetricsF>
@ -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 );

View File

@ -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;

View File

@ -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;

View File

@ -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 )

View File

@ -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 <qguiapplication.h>
#include <qpointer.h>
#include <qstylehints.h>
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;
}

View File

@ -12,7 +12,6 @@
#include <qobject.h>
#include <memory>
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:

View File

@ -5,6 +5,7 @@
#include "QskSkinManager.h"
#include "QskSkinFactory.h"
#include "QskSkin.h"
#include <qdir.h>
#include <qglobalstatic.h>
@ -20,13 +21,6 @@
#include <qstylehints.h>
#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"

View File

@ -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();

View File

@ -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

View File

@ -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"

View File

@ -5,7 +5,6 @@
#include "SkinnyNamespace.h"
#include <QskSetup.h>
#include <QskSkinManager.h>
#include <QskSkin.h>
#include <QskSkinTransition.h>
@ -13,13 +12,13 @@
#include <QGuiApplication>
#include <QByteArray>
#include <QFont>
#define STRINGIFY(x) #x
#define STRING(x) STRINGIFY(x)
#if defined( PLUGIN_PATH )
#include <QByteArray>
#include <QDir>
#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()