qskinny/src/controls/QskSkinFactory.cpp

111 lines
2.4 KiB
C++
Raw Normal View History

2017-07-21 18:21:34 +02:00
#include "QskSkinFactory.h"
#include "squiek/QskSquiekSkin.h"
#include "material/QskMaterialSkin.h"
#include <QHash>
#include <QPointer>
#include <QGlobalStatic>
2017-07-21 18:21:34 +02:00
namespace
{
static const QString factoryId = "QSkinny";
static const QString squiekSkinName = "Squiek";
static const QString materialSkinName = "Material";
class SkinFactory final : public QskSkinFactory
{
public:
SkinFactory( QObject* parent ):
QskSkinFactory( parent )
{
}
virtual QStringList skinNames() const override final
{
return { squiekSkinName, materialSkinName };
}
virtual QskSkin* createSkin( const QString& name ) override final
{
QskSkin* skin = nullptr;
if ( name == squiekSkinName )
skin = new QskSquiekSkin();
if ( name == materialSkinName )
skin = new QskMaterialSkin();
if ( skin )
skin->setObjectName( name );
return skin;
}
};
typedef QHash< QString, QPointer< QskSkinFactory > > FactoryTable;
2017-07-21 18:21:34 +02:00
}
Q_GLOBAL_STATIC( FactoryTable, qskFactoryTable )
static FactoryTable& qskGetFactoryTable()
2017-07-21 18:21:34 +02:00
{
if ( qskFactoryTable->isEmpty() )
2017-07-21 18:21:34 +02:00
{
static SkinFactory dummySkinFactory ( nullptr );
qskFactoryTable->insert( factoryId.toLower(), &dummySkinFactory );
2017-07-21 18:21:34 +02:00
}
return *qskFactoryTable;
2017-07-21 18:21:34 +02:00
}
QskSkinFactory::QskSkinFactory( QObject* parent ):
QObject( parent )
{
}
QskSkinFactory::~QskSkinFactory() = default;
void Qsk::registerSkinFactory( const QString& id, QskSkinFactory* factory )
{
qskFactoryTable->insert( id.toLower(), factory );
2017-07-21 18:21:34 +02:00
}
QskSkinFactory* Qsk::skinFactory( const QString& id )
{
return qskGetFactoryTable().value( id.toLower() ).data();
2017-07-21 18:21:34 +02:00
}
QStringList Qsk::skinNames()
{
QStringList names;
2017-10-30 08:33:43 +01:00
for ( const auto& factory : qskGetFactoryTable() )
2017-07-21 18:21:34 +02:00
{
if ( factory )
names += factory->skinNames();
}
return names;
}
QskSkin* Qsk::createSkin( const QString& skinName )
{
if ( !skinName.isEmpty() )
{
2017-10-30 08:33:43 +01:00
for ( const auto& factory : qskGetFactoryTable() )
2017-07-21 18:21:34 +02:00
{
QskSkin* skin = factory->createSkin( skinName );
if ( skin )
return skin;
}
}
QskSkinFactory* factory = skinFactory( factoryId );
return factory->createSkin( squiekSkinName );
}
#include "moc_QskSkinFactory.cpp"