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 );
}
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 )

View File

@ -15,7 +15,7 @@
#include <type_traits>
#include <unordered_map>
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