allow registration of skinlet for skinnables ( not only controls )

This commit is contained in:
Uwe Rathmann 2023-05-12 13:16:49 +02:00
parent b2738f4bb6
commit 33b3ddb5e3
2 changed files with 21 additions and 6 deletions

View File

@ -363,6 +363,20 @@ const int* QskSkin::dialogButtonLayout( Qt::Orientation orientation ) const
return QPlatformDialogHelper::buttonLayout( orientation, policy ); 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 ) QskSkinlet* QskSkin::skinlet( const QMetaObject* metaObject )
{ {
while ( metaObject ) while ( metaObject )

View File

@ -15,7 +15,7 @@
#include <type_traits> #include <type_traits>
#include <unordered_map> #include <unordered_map>
class QskControl; class QskSkinnable;
class QskSkinlet; class QskSkinlet;
class QskColorFilter; class QskColorFilter;
@ -76,6 +76,7 @@ class QSK_EXPORT QskSkin : public QObject
virtual QString dialogButtonText( int button ) const; virtual QString dialogButtonText( int button ) const;
QskSkinlet* skinlet( const QMetaObject* ); QskSkinlet* skinlet( const QMetaObject* );
const QMetaObject* skinletMetaObject( const QMetaObject* ) const;
const QskSkinHintTable& hintTable() const; const QskSkinHintTable& hintTable() const;
QskSkinHintTable& hintTable(); QskSkinHintTable& hintTable();
@ -84,19 +85,19 @@ class QSK_EXPORT QskSkin : public QObject
const std::unordered_map< int, QskColorFilter >& graphicFilters() const; const std::unordered_map< int, QskColorFilter >& graphicFilters() const;
private: private:
void declareSkinlet( const QMetaObject* controlMetaObject, void declareSkinlet( const QMetaObject* metaObject,
const QMetaObject* skinMetaObject ); const QMetaObject* skinletMetaObject );
class PrivateData; class PrivateData;
std::unique_ptr< PrivateData > m_data; std::unique_ptr< PrivateData > m_data;
}; };
template< typename Control, typename Skinlet > template< typename Skinnable, typename Skinlet >
inline void QskSkin::declareSkinlet() 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 ) ); Q_STATIC_ASSERT( ( std::is_base_of< QskSkinlet, Skinlet >::value ) );
declareSkinlet( &Control::staticMetaObject, &Skinlet::staticMetaObject ); declareSkinlet( &Skinnable::staticMetaObject, &Skinlet::staticMetaObject );
} }
#endif #endif