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 );
qskSetup->setItemUpdateFlag( QskItem::PreferRasterForTextures, true );
QskSetup::setUpdateFlag( QskItem::PreferRasterForTextures, true );
qskSkinManager->setSkin( new Skin() );
Qsk::addGraphicProvider( QString(), new GraphicProvider() );

View File

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

View File

@ -41,7 +41,6 @@
#include <QskScrollView.h>
#include <QskSelectionWindow.h>
#include <QskSeparator.h>
#include <QskSetup.h>
#include <QskShadowMetrics.h>
#include <QskSimpleListBox.h>
#include <QskSkin.h>
@ -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* >();

View File

@ -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"

View File

@ -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 )

View File

@ -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"

View File

@ -9,53 +9,15 @@
#include "QskGlobal.h"
#include "QskItem.h"
#include <qobject.h>
#include <memory>
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

View File

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

View File

@ -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 )