diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 06814ed8..b57b3dff 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -16,6 +16,7 @@ #include "QskSkinHintTable.h" #include "QskSkinTransition.h" #include "QskSkinlet.h" +#include "QskWindow.h" #include "QskBoxShapeMetrics.h" #include "QskBoxBorderMetrics.h" @@ -276,7 +277,7 @@ const QskSkinlet* QskSkinnable::effectiveSkinlet() const { if ( m_data->skinlet == nullptr ) { - m_data->skinlet = qskSetup->skin()->skinlet( metaObject() ); + m_data->skinlet = effectiveSkin()->skinlet( metaObject() ); m_data->hasLocalSkinlet = false; } @@ -1198,6 +1199,17 @@ QskSkin* QskSkinnable::effectiveSkin() const if ( m_data->skinlet ) skin = m_data->skinlet->skin(); + if ( skin == nullptr ) + { + if ( const auto control = owningControl() ) + { + if ( auto window = qobject_cast< const QskWindow* >( control->window() ) ) + { + skin = window->skin(); + } + } + } + return skin ? skin : qskSetup->skin(); } diff --git a/src/controls/QskWindow.cpp b/src/controls/QskWindow.cpp index c9b60757..824b842c 100644 --- a/src/controls/QskWindow.cpp +++ b/src/controls/QskWindow.cpp @@ -8,6 +8,8 @@ #include "QskEvent.h" #include "QskQuick.h" #include "QskSetup.h" +#include "QskSkin.h" +#include "QskSkinManager.h" #include #include @@ -144,6 +146,8 @@ class QskWindowPrivate : public QQuickWindowPrivate QElapsedTimer renderInterval; #endif + QPointer< QskSkin > skin; + ChildListener contentItemListener; QLocale locale; @@ -643,4 +647,35 @@ QskWindow::EventAcceptance QskWindow::eventAcceptance() const return d_func()->eventAcceptance; } +void QskWindow::setSkin( const QString& skinName ) +{ + // we should compare the skinName with the previous one + auto skin = QskSkinManager::instance()->createSkin( skinName ); + setSkin( skin ); +} + +void QskWindow::setSkin( QskSkin* skin ) +{ + Q_D( QskWindow ); + + if ( d->skin == skin ) + return; + + if ( d->skin ) + { + if ( d->skin->parent() == this ) + delete d->skin; + } + + if ( skin && skin->parent() == nullptr ) + skin->setParent( this ); + + d->skin = skin; +} + +QskSkin* QskWindow::skin() const +{ + return d_func()->skin; +} + #include "moc_QskWindow.cpp" diff --git a/src/controls/QskWindow.h b/src/controls/QskWindow.h index dc8b5b8f..b5ede33d 100644 --- a/src/controls/QskWindow.h +++ b/src/controls/QskWindow.h @@ -11,6 +11,7 @@ class QskWindowPrivate; class QskObjectAttributes; +class QskSkin; class QSK_EXPORT QskWindow : public QQuickWindow { @@ -69,6 +70,11 @@ class QSK_EXPORT QskWindow : public QQuickWindow void setEventAcceptance( EventAcceptance ); EventAcceptance eventAcceptance() const; + // each window might have its own skin + void setSkin( QskSkin* ); + void setSkin( const QString& ); + QskSkin* skin() const; + Q_SIGNALS: void localeChanged( const QLocale& ); void autoLayoutChildrenChanged();