QskSetup is a namespace now

This commit is contained in:
Uwe Rathmann 2024-02-02 15:01:43 +01:00
parent 995736ef83
commit 2585385e28
9 changed files with 86 additions and 157 deletions

View File

@ -28,7 +28,7 @@ int main( int argc, char* argv[] )
QGuiApplication app( argc, argv ); QGuiApplication app( argc, argv );
qskSetup->setItemUpdateFlag( QskItem::PreferRasterForTextures, true ); QskSetup::setUpdateFlag( QskItem::PreferRasterForTextures, true );
qskSkinManager->setSkin( new Skin() ); qskSkinManager->setSkin( new Skin() );
Qsk::addGraphicProvider( QString(), new GraphicProvider() ); Qsk::addGraphicProvider( QString(), new GraphicProvider() );

View File

@ -139,7 +139,7 @@ int main( int argc, char* argv[] )
qskSkinManager->registerFactory( qskSkinManager->registerFactory(
QStringLiteral( "MySkinFactory" ), new MySkinFactory() ); QStringLiteral( "MySkinFactory" ), new MySkinFactory() );
qskSetup->setItemUpdateFlag( QskItem::PreferRasterForTextures, true ); QskSetup::setUpdateFlag( QskItem::PreferRasterForTextures, true );
Window window; Window window;
window.resize( 480, 360 ); window.resize( 480, 360 );

View File

@ -41,7 +41,6 @@
#include <QskScrollView.h> #include <QskScrollView.h>
#include <QskSelectionWindow.h> #include <QskSelectionWindow.h>
#include <QskSeparator.h> #include <QskSeparator.h>
#include <QskSetup.h>
#include <QskShadowMetrics.h> #include <QskShadowMetrics.h>
#include <QskSimpleListBox.h> #include <QskSimpleListBox.h>
#include <QskSkin.h> #include <QskSkin.h>
@ -191,7 +190,6 @@ namespace
void QskQml::registerTypes() void QskQml::registerTypes()
{ {
qmlRegisterUncreatableType< QskSetup >( QSK_MODULE_NAME, 1, 0, "Setup", QString() );
qmlRegisterUncreatableType< QskSkin >( QSK_MODULE_NAME, 1, 0, "Skin", QString() ); qmlRegisterUncreatableType< QskSkin >( QSK_MODULE_NAME, 1, 0, "Skin", QString() );
qRegisterMetaType< QskSkin* >(); qRegisterMetaType< QskSkin* >();

View File

@ -69,11 +69,7 @@ namespace
/* /*
Its faster and saves some memory to have this registry instead Its faster and saves some memory to have this registry instead
of setting up direct connections between qskSetup and each control 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 We would also need to send QEvent::StyleChange, when
a window has a new skin. TODO ... a window has a new skin. TODO ...
*/ */
@ -94,9 +90,9 @@ namespace
m_items.erase( item ); m_items.erase( item );
} }
void updateControlFlags() void updateItemFlags()
{ {
const auto flags = qskSetup->itemUpdateFlags(); const auto flags = QskSetup::updateFlags();
for ( auto item : m_items ) for ( auto item : m_items )
qskApplyUpdateFlags( flags, item ); qskApplyUpdateFlags( flags, item );
@ -525,7 +521,7 @@ void QskItem::resetUpdateFlags()
// clear all bits in the mask // clear all bits in the mask
d->updateFlagsMask = 0; d->updateFlagsMask = 0;
d->applyUpdateFlags( qskSetup->itemUpdateFlags() ); d->applyUpdateFlags( QskSetup::updateFlags() );
} }
void QskItem::setUpdateFlag( UpdateFlag flag, bool on ) void QskItem::setUpdateFlag( UpdateFlag flag, bool on )
@ -547,7 +543,7 @@ void QskItem::resetUpdateFlag( UpdateFlag flag )
d->updateFlagsMask &= ~flag; d->updateFlagsMask &= ~flag;
const bool on = qskSetup->testItemUpdateFlag( flag ); const bool on = QskSetup::testUpdateFlag( flag );
if ( testUpdateFlag( flag ) != on ) if ( testUpdateFlag( flag ) != on )
{ {
@ -1045,4 +1041,10 @@ QSGNode* QskItem::updateItemPaintNode( QSGNode* node )
return node; return node;
} }
void qskUpdateItemFlags()
{
if ( qskRegistry )
qskRegistry->updateItemFlags();
}
#include "moc_QskItem.cpp" #include "moc_QskItem.cpp"

View File

@ -14,7 +14,7 @@ static inline void qskSendEventTo( QObject* object, QEvent::Type type )
} }
QskItemPrivate::QskItemPrivate() QskItemPrivate::QskItemPrivate()
: updateFlags( qskSetup->itemUpdateFlags() ) : updateFlags( QskSetup::updateFlags() )
, updateFlagsMask( 0 ) , updateFlagsMask( 0 )
, polishOnResize( false ) , polishOnResize( false )
, blockedPolish( false ) , blockedPolish( false )

View File

@ -5,131 +5,98 @@
#include "QskSetup.h" #include "QskSetup.h"
QskSetup* QskSetup::s_instance = nullptr; extern void qskUpdateItemFlags();
static inline bool qskHasEnvironment( const char* env ) namespace
{ {
bool ok; inline bool hasEnvironment( const char* env )
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 )
{ {
flags |= QskItem::DeferredUpdate; bool ok;
flags |= QskItem::DeferredPolish;
flags |= QskItem::DeferredLayout; const int value = qEnvironmentVariableIntValue( env, &ok );
flags |= QskItem::CleanupOnVisibility; if ( ok )
flags |= qskEnvironmentUpdateFlags(); return value != 0;
// All other strings are true, apart from "false"
auto result = qgetenv( env );
return !result.isEmpty() && result != "false";
} }
return flags; inline const QskItem::UpdateFlags environmentUpdateFlags()
}
static void qskApplicationHook()
{
QskSetup::setup();
qAddPostRoutine( QskSetup::cleanup );
}
Q_CONSTRUCTOR_FUNCTION( qskApplicationHook )
class QskSetup::PrivateData
{
public:
PrivateData()
: itemUpdateFlags( qskDefaultUpdateFlags() )
{ {
QskItem::UpdateFlags flags;
if ( hasEnvironment( "QSK_PREFER_RASTER" ) )
flags |= QskItem::PreferRasterForTextures;
if ( hasEnvironment( "QSK_FORCE_BACKGROUND" ) )
flags |= QskItem::DebugForceBackground;
return flags;
} }
QskItem::UpdateFlags itemUpdateFlags; inline QskItem::UpdateFlags defaultUpdateFlags()
};
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 )
{ {
m_data->itemUpdateFlags = flags; static QskItem::UpdateFlags flags;
Q_EMIT itemUpdateFlagsChanged();
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 ) if ( on )
m_data->itemUpdateFlags |= flag; qskUpdateFlags |= flag;
else 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"

View File

@ -9,53 +9,15 @@
#include "QskGlobal.h" #include "QskGlobal.h"
#include "QskItem.h" #include "QskItem.h"
#include <qobject.h> namespace QskSetup
#include <memory>
class QQuickItem;
#if defined( qskSetup )
#undef qskSetup
#endif
#define qskSetup QskSetup::instance()
class QSK_EXPORT QskSetup : public QObject
{ {
Q_OBJECT QSK_EXPORT void setUpdateFlags( QskItem::UpdateFlags );
QSK_EXPORT void resetUpdateFlags();
QSK_EXPORT QskItem::UpdateFlags updateFlags();
public: QSK_EXPORT void setUpdateFlag( QskItem::UpdateFlag, bool on = true );
QSK_EXPORT void resetUpdateFlag( QskItem::UpdateFlag );
static QskSetup* instance(); QSK_EXPORT bool testUpdateFlag( QskItem::UpdateFlag );
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;
}; };
inline QskSetup* QskSetup::instance()
{
Q_ASSERT( s_instance );
return s_instance;
}
#endif #endif

View File

@ -128,7 +128,7 @@ static inline QSGNode* qskUpdateGraphicNode(
const auto flag = QskItem::PreferRasterForTextures; const auto flag = QskItem::PreferRasterForTextures;
bool useRaster = qskSetup->testItemUpdateFlag( flag ); bool useRaster = QskSetup::testUpdateFlag( flag );
if ( auto qItem = qobject_cast< const QskItem* >( item ) ) if ( auto qItem = qobject_cast< const QskItem* >( item ) )
useRaster = qItem->testUpdateFlag( flag ); useRaster = qItem->testUpdateFlag( flag );

View File

@ -111,7 +111,7 @@ void SkinnyShortcut::showBackground()
scengraphDebugMode = sgDebugModes[ id - 2 ]; scengraphDebugMode = sgDebugModes[ id - 2 ];
} }
qskSetup->setItemUpdateFlag( QskItem::DebugForceBackground, forceBackground ); QskSetup::setUpdateFlag( QskItem::DebugForceBackground, forceBackground );
const auto windows = QGuiApplication::topLevelWindows(); const auto windows = QGuiApplication::topLevelWindows();
for ( auto window : windows ) for ( auto window : windows )