each window might have its own skin

This commit is contained in:
Uwe Rathmann 2021-09-09 07:53:35 +02:00
parent 2fceca2385
commit e1a4e1fec3
3 changed files with 54 additions and 1 deletions

View File

@ -16,6 +16,7 @@
#include "QskSkinHintTable.h" #include "QskSkinHintTable.h"
#include "QskSkinTransition.h" #include "QskSkinTransition.h"
#include "QskSkinlet.h" #include "QskSkinlet.h"
#include "QskWindow.h"
#include "QskBoxShapeMetrics.h" #include "QskBoxShapeMetrics.h"
#include "QskBoxBorderMetrics.h" #include "QskBoxBorderMetrics.h"
@ -276,7 +277,7 @@ const QskSkinlet* QskSkinnable::effectiveSkinlet() const
{ {
if ( m_data->skinlet == nullptr ) if ( m_data->skinlet == nullptr )
{ {
m_data->skinlet = qskSetup->skin()->skinlet( metaObject() ); m_data->skinlet = effectiveSkin()->skinlet( metaObject() );
m_data->hasLocalSkinlet = false; m_data->hasLocalSkinlet = false;
} }
@ -1198,6 +1199,17 @@ QskSkin* QskSkinnable::effectiveSkin() const
if ( m_data->skinlet ) if ( m_data->skinlet )
skin = m_data->skinlet->skin(); 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(); return skin ? skin : qskSetup->skin();
} }

View File

@ -8,6 +8,8 @@
#include "QskEvent.h" #include "QskEvent.h"
#include "QskQuick.h" #include "QskQuick.h"
#include "QskSetup.h" #include "QskSetup.h"
#include "QskSkin.h"
#include "QskSkinManager.h"
#include <qmath.h> #include <qmath.h>
#include <qpointer.h> #include <qpointer.h>
@ -144,6 +146,8 @@ class QskWindowPrivate : public QQuickWindowPrivate
QElapsedTimer renderInterval; QElapsedTimer renderInterval;
#endif #endif
QPointer< QskSkin > skin;
ChildListener contentItemListener; ChildListener contentItemListener;
QLocale locale; QLocale locale;
@ -643,4 +647,35 @@ QskWindow::EventAcceptance QskWindow::eventAcceptance() const
return d_func()->eventAcceptance; 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" #include "moc_QskWindow.cpp"

View File

@ -11,6 +11,7 @@
class QskWindowPrivate; class QskWindowPrivate;
class QskObjectAttributes; class QskObjectAttributes;
class QskSkin;
class QSK_EXPORT QskWindow : public QQuickWindow class QSK_EXPORT QskWindow : public QQuickWindow
{ {
@ -69,6 +70,11 @@ class QSK_EXPORT QskWindow : public QQuickWindow
void setEventAcceptance( EventAcceptance ); void setEventAcceptance( EventAcceptance );
EventAcceptance eventAcceptance() const; EventAcceptance eventAcceptance() const;
// each window might have its own skin
void setSkin( QskSkin* );
void setSkin( const QString& );
QskSkin* skin() const;
Q_SIGNALS: Q_SIGNALS:
void localeChanged( const QLocale& ); void localeChanged( const QLocale& );
void autoLayoutChildrenChanged(); void autoLayoutChildrenChanged();