2017-07-21 18:21:34 +02:00
|
|
|
#include "QskSkinFactory.h"
|
|
|
|
|
|
|
|
#include "squiek/QskSquiekSkin.h"
|
|
|
|
#include "material/QskMaterialSkin.h"
|
|
|
|
|
|
|
|
#include <QHash>
|
|
|
|
#include <QPointer>
|
2017-07-26 17:50:41 +02:00
|
|
|
#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;
|
|
|
|
}
|
|
|
|
};
|
2017-07-26 17:50:41 +02:00
|
|
|
|
|
|
|
typedef QHash< QString, QPointer< QskSkinFactory > > FactoryTable;
|
2017-07-21 18:21:34 +02:00
|
|
|
}
|
|
|
|
|
2017-07-26 17:50:41 +02:00
|
|
|
Q_GLOBAL_STATIC( FactoryTable, qskFactoryTable )
|
|
|
|
|
|
|
|
static FactoryTable& qskGetFactoryTable()
|
2017-07-21 18:21:34 +02:00
|
|
|
{
|
2017-07-26 17:50:41 +02:00
|
|
|
if ( qskFactoryTable->isEmpty() )
|
2017-07-21 18:21:34 +02:00
|
|
|
{
|
|
|
|
static SkinFactory dummySkinFactory ( nullptr );
|
2017-07-26 17:50:41 +02:00
|
|
|
qskFactoryTable->insert( factoryId.toLower(), &dummySkinFactory );
|
2017-07-21 18:21:34 +02:00
|
|
|
}
|
|
|
|
|
2017-07-26 17:50:41 +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 )
|
|
|
|
{
|
2017-07-26 17:50:41 +02:00
|
|
|
qskFactoryTable->insert( id.toLower(), factory );
|
2017-07-21 18:21:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
QskSkinFactory* Qsk::skinFactory( const QString& id )
|
|
|
|
{
|
2017-07-26 17:50:41 +02:00
|
|
|
return qskGetFactoryTable().value( id.toLower() ).data();
|
2017-07-21 18:21:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
QStringList Qsk::skinNames()
|
|
|
|
{
|
|
|
|
QStringList names;
|
|
|
|
|
2017-07-26 17:50:41 +02:00
|
|
|
for ( 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-07-26 17:50:41 +02:00
|
|
|
for ( 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"
|