diff --git a/examples/iotdashboard/main.cpp b/examples/iotdashboard/main.cpp index 46fa8cc4..587f7ae5 100644 --- a/examples/iotdashboard/main.cpp +++ b/examples/iotdashboard/main.cpp @@ -28,7 +28,7 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - qskSetup->setItemUpdateFlag( QskItem::PreferRasterForTextures, true ); + QskSetup::setUpdateFlag( QskItem::PreferRasterForTextures, true ); qskSkinManager->setSkin( new Skin() ); Qsk::addGraphicProvider( QString(), new GraphicProvider() ); diff --git a/examples/mycontrols/main.cpp b/examples/mycontrols/main.cpp index 028fb6a0..5d961a88 100644 --- a/examples/mycontrols/main.cpp +++ b/examples/mycontrols/main.cpp @@ -139,7 +139,7 @@ int main( int argc, char* argv[] ) qskSkinManager->registerFactory( QStringLiteral( "MySkinFactory" ), new MySkinFactory() ); - qskSetup->setItemUpdateFlag( QskItem::PreferRasterForTextures, true ); + QskSetup::setUpdateFlag( QskItem::PreferRasterForTextures, true ); Window window; window.resize( 480, 360 ); diff --git a/qmlexport/QskQml.cpp b/qmlexport/QskQml.cpp index 0b86c448..6795587f 100644 --- a/qmlexport/QskQml.cpp +++ b/qmlexport/QskQml.cpp @@ -41,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -191,7 +190,6 @@ namespace void QskQml::registerTypes() { - qmlRegisterUncreatableType< QskSetup >( QSK_MODULE_NAME, 1, 0, "Setup", QString() ); qmlRegisterUncreatableType< QskSkin >( QSK_MODULE_NAME, 1, 0, "Skin", QString() ); qRegisterMetaType< QskSkin* >(); diff --git a/src/controls/QskItem.cpp b/src/controls/QskItem.cpp index 5f0b08bc..db27ec5f 100644 --- a/src/controls/QskItem.cpp +++ b/src/controls/QskItem.cpp @@ -69,11 +69,7 @@ namespace /* Its faster and saves some memory to have this registry instead of setting up direct connections between qskSetup and each control - */ - QObject::connect( qskSetup, &QskSetup::itemUpdateFlagsChanged, - qskSetup, [ this ] { updateControlFlags(); } ); - /* We would also need to send QEvent::StyleChange, when a window has a new skin. TODO ... */ @@ -94,9 +90,9 @@ namespace m_items.erase( item ); } - void updateControlFlags() + void updateItemFlags() { - const auto flags = qskSetup->itemUpdateFlags(); + const auto flags = QskSetup::updateFlags(); for ( auto item : m_items ) qskApplyUpdateFlags( flags, item ); @@ -525,7 +521,7 @@ void QskItem::resetUpdateFlags() // clear all bits in the mask d->updateFlagsMask = 0; - d->applyUpdateFlags( qskSetup->itemUpdateFlags() ); + d->applyUpdateFlags( QskSetup::updateFlags() ); } void QskItem::setUpdateFlag( UpdateFlag flag, bool on ) @@ -547,7 +543,7 @@ void QskItem::resetUpdateFlag( UpdateFlag flag ) d->updateFlagsMask &= ~flag; - const bool on = qskSetup->testItemUpdateFlag( flag ); + const bool on = QskSetup::testUpdateFlag( flag ); if ( testUpdateFlag( flag ) != on ) { @@ -1045,4 +1041,10 @@ QSGNode* QskItem::updateItemPaintNode( QSGNode* node ) return node; } +void qskUpdateItemFlags() +{ + if ( qskRegistry ) + qskRegistry->updateItemFlags(); +} + #include "moc_QskItem.cpp" diff --git a/src/controls/QskItemPrivate.cpp b/src/controls/QskItemPrivate.cpp index 6887a47c..74d1f642 100644 --- a/src/controls/QskItemPrivate.cpp +++ b/src/controls/QskItemPrivate.cpp @@ -14,7 +14,7 @@ static inline void qskSendEventTo( QObject* object, QEvent::Type type ) } QskItemPrivate::QskItemPrivate() - : updateFlags( qskSetup->itemUpdateFlags() ) + : updateFlags( QskSetup::updateFlags() ) , updateFlagsMask( 0 ) , polishOnResize( false ) , blockedPolish( false ) diff --git a/src/controls/QskSetup.cpp b/src/controls/QskSetup.cpp index a1d3213b..fae8d9e1 100644 --- a/src/controls/QskSetup.cpp +++ b/src/controls/QskSetup.cpp @@ -5,131 +5,98 @@ #include "QskSetup.h" -QskSetup* QskSetup::s_instance = nullptr; +extern void qskUpdateItemFlags(); -static inline bool qskHasEnvironment( const char* env ) +namespace { - bool ok; - - const int value = qEnvironmentVariableIntValue( env, &ok ); - if ( ok ) - return value != 0; - - // All other strings are true, apart from "false" - auto result = qgetenv( env ); - return !result.isEmpty() && result != "false"; -} - -static inline const QskItem::UpdateFlags qskEnvironmentUpdateFlags() -{ - QskItem::UpdateFlags flags; - - if ( qskHasEnvironment( "QSK_PREFER_RASTER" ) ) - flags |= QskItem::PreferRasterForTextures; - - if ( qskHasEnvironment( "QSK_FORCE_BACKGROUND" ) ) - flags |= QskItem::DebugForceBackground; - - return flags; -} - -static inline QskItem::UpdateFlags qskDefaultUpdateFlags() -{ - static QskItem::UpdateFlags flags; - - if ( flags == 0 ) + inline bool hasEnvironment( const char* env ) { - flags |= QskItem::DeferredUpdate; - flags |= QskItem::DeferredPolish; - flags |= QskItem::DeferredLayout; - flags |= QskItem::CleanupOnVisibility; - flags |= qskEnvironmentUpdateFlags(); + bool ok; + + const int value = qEnvironmentVariableIntValue( env, &ok ); + if ( ok ) + return value != 0; + + // All other strings are true, apart from "false" + auto result = qgetenv( env ); + return !result.isEmpty() && result != "false"; } - return flags; -} - -static void qskApplicationHook() -{ - QskSetup::setup(); - qAddPostRoutine( QskSetup::cleanup ); -} - -Q_CONSTRUCTOR_FUNCTION( qskApplicationHook ) - -class QskSetup::PrivateData -{ - public: - PrivateData() - : itemUpdateFlags( qskDefaultUpdateFlags() ) + inline const QskItem::UpdateFlags environmentUpdateFlags() { + QskItem::UpdateFlags flags; + + if ( hasEnvironment( "QSK_PREFER_RASTER" ) ) + flags |= QskItem::PreferRasterForTextures; + + if ( hasEnvironment( "QSK_FORCE_BACKGROUND" ) ) + flags |= QskItem::DebugForceBackground; + + return flags; } - QskItem::UpdateFlags itemUpdateFlags; -}; - -QskSetup::QskSetup() - : m_data( new PrivateData() ) -{ -} - -QskSetup::~QskSetup() -{ - s_instance = nullptr; // we might be destroyed from Qml ! -} - -void QskSetup::setup() -{ - if ( s_instance == nullptr ) - s_instance = new QskSetup(); -} - -void QskSetup::cleanup() -{ - delete s_instance; - s_instance = nullptr; -} - -void QskSetup::setItemUpdateFlags( QskItem::UpdateFlags flags ) -{ - if ( m_data->itemUpdateFlags != flags ) + inline QskItem::UpdateFlags defaultUpdateFlags() { - m_data->itemUpdateFlags = flags; - Q_EMIT itemUpdateFlagsChanged(); + static QskItem::UpdateFlags flags; + + if ( flags == 0 ) + { + flags |= QskItem::DeferredUpdate; + flags |= QskItem::DeferredPolish; + flags |= QskItem::DeferredLayout; + flags |= QskItem::CleanupOnVisibility; + flags |= environmentUpdateFlags(); + } + + return flags; + } + + inline void propagateFlags() + { + qskUpdateItemFlags(); } } -QskItem::UpdateFlags QskSetup::itemUpdateFlags() const +static QskItem::UpdateFlags qskUpdateFlags = defaultUpdateFlags(); + +void QskSetup::setUpdateFlags( QskItem::UpdateFlags flags ) { - return m_data->itemUpdateFlags; + if ( qskUpdateFlags != flags ) + { + qskUpdateFlags = flags; + propagateFlags(); + } } -void QskSetup::resetItemUpdateFlags() +QskItem::UpdateFlags QskSetup::updateFlags() { - setItemUpdateFlags( qskDefaultUpdateFlags() ); + return qskUpdateFlags; } -void QskSetup::setItemUpdateFlag( QskItem::UpdateFlag flag, bool on ) +void QskSetup::resetUpdateFlags() { - if ( m_data->itemUpdateFlags.testFlag( flag ) != on ) + setUpdateFlags( defaultUpdateFlags() ); +} + +void QskSetup::setUpdateFlag( QskItem::UpdateFlag flag, bool on ) +{ + if ( qskUpdateFlags.testFlag( flag ) != on ) { if ( on ) - m_data->itemUpdateFlags |= flag; + qskUpdateFlags |= flag; else - m_data->itemUpdateFlags &= ~flag; + qskUpdateFlags &= ~flag; - Q_EMIT itemUpdateFlagsChanged(); + propagateFlags(); } } -void QskSetup::resetItemUpdateFlag( QskItem::UpdateFlag flag ) +void QskSetup::resetUpdateFlag( QskItem::UpdateFlag flag ) { - setItemUpdateFlag( flag, flag & qskDefaultUpdateFlags() ); + setUpdateFlag( flag, flag & defaultUpdateFlags() ); } -bool QskSetup::testItemUpdateFlag( QskItem::UpdateFlag flag ) +bool QskSetup::testUpdateFlag( QskItem::UpdateFlag flag ) { - return m_data->itemUpdateFlags.testFlag( flag ); + return qskUpdateFlags.testFlag( flag ); } - -#include "moc_QskSetup.cpp" diff --git a/src/controls/QskSetup.h b/src/controls/QskSetup.h index dd700f4f..2efa41d4 100644 --- a/src/controls/QskSetup.h +++ b/src/controls/QskSetup.h @@ -9,53 +9,15 @@ #include "QskGlobal.h" #include "QskItem.h" -#include -#include - -class QQuickItem; - -#if defined( qskSetup ) -#undef qskSetup -#endif - -#define qskSetup QskSetup::instance() - -class QSK_EXPORT QskSetup : public QObject +namespace QskSetup { - Q_OBJECT + QSK_EXPORT void setUpdateFlags( QskItem::UpdateFlags ); + QSK_EXPORT void resetUpdateFlags(); + QSK_EXPORT QskItem::UpdateFlags updateFlags(); - public: - - static QskSetup* instance(); - - void setItemUpdateFlags( QskItem::UpdateFlags ); - void resetItemUpdateFlags(); - QskItem::UpdateFlags itemUpdateFlags() const; - - void setItemUpdateFlag( QskItem::UpdateFlag, bool on = true ); - void resetItemUpdateFlag( QskItem::UpdateFlag ); - bool testItemUpdateFlag( QskItem::UpdateFlag ); - - static void setup(); - static void cleanup(); - - Q_SIGNALS: - void itemUpdateFlagsChanged(); - - private: - QskSetup(); - ~QskSetup() override; - - static QskSetup* s_instance; - - class PrivateData; - std::unique_ptr< PrivateData > m_data; + QSK_EXPORT void setUpdateFlag( QskItem::UpdateFlag, bool on = true ); + QSK_EXPORT void resetUpdateFlag( QskItem::UpdateFlag ); + QSK_EXPORT bool testUpdateFlag( QskItem::UpdateFlag ); }; -inline QskSetup* QskSetup::instance() -{ - Q_ASSERT( s_instance ); - return s_instance; -} - #endif diff --git a/src/controls/QskSkinlet.cpp b/src/controls/QskSkinlet.cpp index 5a5ca395..48c456a9 100644 --- a/src/controls/QskSkinlet.cpp +++ b/src/controls/QskSkinlet.cpp @@ -128,7 +128,7 @@ static inline QSGNode* qskUpdateGraphicNode( const auto flag = QskItem::PreferRasterForTextures; - bool useRaster = qskSetup->testItemUpdateFlag( flag ); + bool useRaster = QskSetup::testUpdateFlag( flag ); if ( auto qItem = qobject_cast< const QskItem* >( item ) ) useRaster = qItem->testUpdateFlag( flag ); diff --git a/support/SkinnyShortcut.cpp b/support/SkinnyShortcut.cpp index 989f93b6..37d23dcf 100644 --- a/support/SkinnyShortcut.cpp +++ b/support/SkinnyShortcut.cpp @@ -111,7 +111,7 @@ void SkinnyShortcut::showBackground() scengraphDebugMode = sgDebugModes[ id - 2 ]; } - qskSetup->setItemUpdateFlag( QskItem::DebugForceBackground, forceBackground ); + QskSetup::setUpdateFlag( QskItem::DebugForceBackground, forceBackground ); const auto windows = QGuiApplication::topLevelWindows(); for ( auto window : windows )