diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index a7d646de..c3f66a71 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -363,6 +363,20 @@ const int* QskSkin::dialogButtonLayout( Qt::Orientation orientation ) const return QPlatformDialogHelper::buttonLayout( orientation, policy ); } +const QMetaObject* QskSkin::skinletMetaObject( const QMetaObject* metaObject ) const +{ + while ( metaObject ) + { + auto it = m_data->skinletMap.find( metaObject ); + if ( it != m_data->skinletMap.cend() ) + return it->second.metaObject; + + metaObject = metaObject->superClass(); + } + + return nullptr; +} + QskSkinlet* QskSkin::skinlet( const QMetaObject* metaObject ) { while ( metaObject ) diff --git a/src/controls/QskSkin.h b/src/controls/QskSkin.h index cf3630a8..982ed2a3 100644 --- a/src/controls/QskSkin.h +++ b/src/controls/QskSkin.h @@ -15,7 +15,7 @@ #include #include -class QskControl; +class QskSkinnable; class QskSkinlet; class QskColorFilter; @@ -76,6 +76,7 @@ class QSK_EXPORT QskSkin : public QObject virtual QString dialogButtonText( int button ) const; QskSkinlet* skinlet( const QMetaObject* ); + const QMetaObject* skinletMetaObject( const QMetaObject* ) const; const QskSkinHintTable& hintTable() const; QskSkinHintTable& hintTable(); @@ -84,19 +85,19 @@ class QSK_EXPORT QskSkin : public QObject const std::unordered_map< int, QskColorFilter >& graphicFilters() const; private: - void declareSkinlet( const QMetaObject* controlMetaObject, - const QMetaObject* skinMetaObject ); + void declareSkinlet( const QMetaObject* metaObject, + const QMetaObject* skinletMetaObject ); class PrivateData; std::unique_ptr< PrivateData > m_data; }; -template< typename Control, typename Skinlet > +template< typename Skinnable, typename Skinlet > inline void QskSkin::declareSkinlet() { - Q_STATIC_ASSERT( ( std::is_base_of< QskControl, Control >::value ) ); + Q_STATIC_ASSERT( ( std::is_base_of< QskSkinnable, Skinnable >::value ) ); Q_STATIC_ASSERT( ( std::is_base_of< QskSkinlet, Skinlet >::value ) ); - declareSkinlet( &Control::staticMetaObject, &Skinlet::staticMetaObject ); + declareSkinlet( &Skinnable::staticMetaObject, &Skinlet::staticMetaObject ); } #endif