QskAspect::Section introduced

This commit is contained in:
Uwe Rathmann 2022-06-29 16:15:38 +02:00
parent 44e264d472
commit 62fcbc6c32
12 changed files with 323 additions and 99 deletions

View File

@ -295,6 +295,9 @@ void qskDebugAspect( QDebug debug, const QMetaObject* metaObject, QskAspect aspe
else else
debug << subControlName; debug << subControlName;
if ( aspect.section() != QskAspect::Body )
debug << ", " << qskEnumString( "Section", aspect.section() );
debug << ", " << qskEnumString( "Type", aspect.type() ); debug << ", " << qskEnumString( "Type", aspect.type() );
if ( aspect.isAnimator() ) if ( aspect.isAnimator() )
debug << "(A)"; debug << "(A)";
@ -338,7 +341,7 @@ const char* QskAspect::toPrintable() const
QDebug debug( &tmp ); QDebug debug( &tmp );
debug << *this; debug << *this;
// we should find a better impementation // we should find a better implementation
static QByteArray bytes[ 10 ]; static QByteArray bytes[ 10 ];
static int counter = 0; static int counter = 0;

View File

@ -27,6 +27,18 @@ class QSK_EXPORT QskAspect
static constexpr uint typeCount = 3; static constexpr uint typeCount = 3;
enum Section : quint8
{
Body = 0,
Header,
Footer
};
Q_ENUM( Section )
static constexpr uint FirstUserSection = Section::Footer + 1;
static constexpr uint LastSection = ( 1 << 4 ) - 1;
enum Primitive : quint8 enum Primitive : quint8
{ {
NoPrimitive = 0, NoPrimitive = 0,
@ -88,11 +100,14 @@ class QSK_EXPORT QskAspect
AllStates = 0xFFFF AllStates = 0xFFFF
}; };
Q_ENUM( State ) Q_ENUM( State )
Q_DECLARE_FLAGS( States, State ) Q_DECLARE_FLAGS( States, State )
constexpr QskAspect() noexcept; constexpr QskAspect() noexcept;
constexpr QskAspect( Subcontrol ) noexcept; constexpr QskAspect( Subcontrol ) noexcept;
constexpr QskAspect( Section ) noexcept;
constexpr QskAspect( Type ) noexcept; constexpr QskAspect( Type ) noexcept;
constexpr QskAspect( Placement ) noexcept; constexpr QskAspect( Placement ) noexcept;
@ -107,6 +122,7 @@ class QSK_EXPORT QskAspect
bool operator<( const QskAspect& ) const noexcept; bool operator<( const QskAspect& ) const noexcept;
constexpr QskAspect operator|( Subcontrol ) const noexcept; constexpr QskAspect operator|( Subcontrol ) const noexcept;
constexpr QskAspect operator|( Section ) const noexcept;
constexpr QskAspect operator|( Type ) const noexcept; constexpr QskAspect operator|( Type ) const noexcept;
constexpr QskAspect operator|( Primitive ) const noexcept; constexpr QskAspect operator|( Primitive ) const noexcept;
constexpr QskAspect operator|( Placement ) const noexcept; constexpr QskAspect operator|( Placement ) const noexcept;
@ -134,6 +150,9 @@ class QSK_EXPORT QskAspect
constexpr Subcontrol subControl() const noexcept; constexpr Subcontrol subControl() const noexcept;
void setSubControl( Subcontrol ) noexcept; void setSubControl( Subcontrol ) noexcept;
constexpr Section section() const noexcept;
void setSection( Section ) noexcept;
constexpr Type type() const noexcept; constexpr Type type() const noexcept;
void setType( Type ) noexcept; void setType( Type ) noexcept;
@ -175,23 +194,25 @@ class QSK_EXPORT QskAspect
static void reservePrimitives( quint8 count ); static void reservePrimitives( quint8 count );
private: private:
constexpr QskAspect( Subcontrol, Type, Placement ) noexcept; constexpr QskAspect( Subcontrol, Section, Type, Placement ) noexcept;
constexpr QskAspect( uint subControl, uint type, bool isAnimator, constexpr QskAspect( uint subControl, uint section, uint type, bool isAnimator,
uint primitive, uint placement, uint states ) noexcept; uint primitive, uint placement, uint states ) noexcept;
struct Bits struct Bits
{ {
uint subControl : 12; uint subControl : 12;
uint section : 4;
uint type : 3; uint type : 3;
uint isAnimator : 1; uint isAnimator : 1;
uint primitive : 5; uint primitive : 5;
uint placement : 3; uint placement : 3;
uint reserved1 : 8; uint reserved1 : 4;
uint states : 16; uint states : 16;
uint reserved2 : 16; uint reserved2 : 16;
}; };
@ -218,34 +239,39 @@ constexpr inline QskAspect::State operator>>( QskAspect::State a, const int b )
} }
inline constexpr QskAspect::QskAspect() noexcept inline constexpr QskAspect::QskAspect() noexcept
: QskAspect( Control, Flag, NoPlacement ) : QskAspect( Control, Body, Flag, NoPlacement )
{ {
} }
inline constexpr QskAspect::QskAspect( Subcontrol subControl ) noexcept inline constexpr QskAspect::QskAspect( Subcontrol subControl ) noexcept
: QskAspect( subControl, Flag, NoPlacement ) : QskAspect( subControl, Body, Flag, NoPlacement )
{
}
inline constexpr QskAspect::QskAspect( Section section ) noexcept
: QskAspect( Control, section, Flag, NoPlacement )
{ {
} }
inline constexpr QskAspect::QskAspect( Type type ) noexcept inline constexpr QskAspect::QskAspect( Type type ) noexcept
: QskAspect( Control, type, NoPlacement ) : QskAspect( Control, Body, type, NoPlacement )
{ {
} }
inline constexpr QskAspect::QskAspect( Placement placement ) noexcept inline constexpr QskAspect::QskAspect( Placement placement ) noexcept
: QskAspect( Control, Flag, placement ) : QskAspect( Control, Body, Flag, placement )
{ {
} }
inline constexpr QskAspect::QskAspect( inline constexpr QskAspect::QskAspect(
Subcontrol subControl, Type type, Placement placement ) noexcept Subcontrol subControl, Section section, Type type, Placement placement ) noexcept
: QskAspect( subControl, type, false, 0, placement, NoState ) : QskAspect( subControl, section, type, false, 0, placement, NoState )
{ {
} }
inline constexpr QskAspect::QskAspect( uint subControl, uint type, bool isAnimator, inline constexpr QskAspect::QskAspect( uint subControl, uint section, uint type, bool isAnimator,
uint primitive, uint placement, uint states ) noexcept uint primitive, uint placement, uint states ) noexcept
: m_bits { subControl, type, isAnimator, primitive, placement, 0, states, 0 } : m_bits { subControl, section, type, isAnimator, primitive, placement, 0, states, 0 }
{ {
} }
@ -266,32 +292,38 @@ inline bool QskAspect::operator<( const QskAspect& other ) const noexcept
inline constexpr QskAspect QskAspect::operator|( Subcontrol subControl ) const noexcept inline constexpr QskAspect QskAspect::operator|( Subcontrol subControl ) const noexcept
{ {
return QskAspect( subControl, m_bits.type, m_bits.isAnimator, return QskAspect( subControl, m_bits.section, m_bits.type,
m_bits.primitive, m_bits.placement, m_bits.states ); m_bits.isAnimator, m_bits.primitive, m_bits.placement, m_bits.states );
}
inline constexpr QskAspect QskAspect::operator|( Section section ) const noexcept
{
return QskAspect( m_bits.subControl, section, m_bits.type,
m_bits.isAnimator, m_bits.primitive, m_bits.placement, m_bits.states );
} }
inline constexpr QskAspect QskAspect::operator|( Type type ) const noexcept inline constexpr QskAspect QskAspect::operator|( Type type ) const noexcept
{ {
return QskAspect( m_bits.subControl, type, m_bits.isAnimator, return QskAspect( m_bits.subControl, m_bits.section, type,
m_bits.primitive, m_bits.placement, m_bits.states ); m_bits.isAnimator, m_bits.primitive, m_bits.placement, m_bits.states );
} }
inline constexpr QskAspect QskAspect::operator|( Primitive primitive ) const noexcept inline constexpr QskAspect QskAspect::operator|( Primitive primitive ) const noexcept
{ {
return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, return QskAspect( m_bits.subControl, m_bits.section, m_bits.type,
primitive, m_bits.placement, m_bits.states ); m_bits.isAnimator, primitive, m_bits.placement, m_bits.states );
} }
inline constexpr QskAspect QskAspect::operator|( Placement placement ) const noexcept inline constexpr QskAspect QskAspect::operator|( Placement placement ) const noexcept
{ {
return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, return QskAspect( m_bits.subControl, m_bits.section, m_bits.type,
m_bits.primitive, placement, m_bits.states ); m_bits.isAnimator, m_bits.primitive, placement, m_bits.states );
} }
inline constexpr QskAspect QskAspect::operator|( State state ) const noexcept inline constexpr QskAspect QskAspect::operator|( State state ) const noexcept
{ {
return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, return QskAspect( m_bits.subControl, m_bits.section, m_bits.type,
m_bits.primitive, m_bits.placement, m_bits.states | state ); m_bits.isAnimator, m_bits.primitive, m_bits.placement, m_bits.states | state );
} }
inline QskAspect& QskAspect::operator|=( State state ) noexcept inline QskAspect& QskAspect::operator|=( State state ) noexcept
@ -302,7 +334,7 @@ inline QskAspect& QskAspect::operator|=( State state ) noexcept
inline constexpr QskAspect QskAspect::operator&( State state ) const noexcept inline constexpr QskAspect QskAspect::operator&( State state ) const noexcept
{ {
return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, return QskAspect( m_bits.subControl, m_bits.section, m_bits.type, m_bits.isAnimator,
m_bits.primitive, m_bits.placement, m_bits.states & state ); m_bits.primitive, m_bits.placement, m_bits.states & state );
} }
@ -314,7 +346,7 @@ inline QskAspect& QskAspect::operator&=( State state ) noexcept
inline constexpr QskAspect QskAspect::operator|( States states ) const noexcept inline constexpr QskAspect QskAspect::operator|( States states ) const noexcept
{ {
return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, return QskAspect( m_bits.subControl, m_bits.section, m_bits.type, m_bits.isAnimator,
m_bits.primitive, m_bits.placement, m_bits.states | states ); m_bits.primitive, m_bits.placement, m_bits.states | states );
} }
@ -326,8 +358,8 @@ inline QskAspect& QskAspect::operator|=( States states ) noexcept
inline constexpr QskAspect QskAspect::operator&( States states ) const noexcept inline constexpr QskAspect QskAspect::operator&( States states ) const noexcept
{ {
return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, return QskAspect( m_bits.subControl, m_bits.section, m_bits.type,
m_bits.primitive, m_bits.placement, m_bits.states & states ); m_bits.isAnimator, m_bits.primitive, m_bits.placement, m_bits.states & states );
} }
inline QskAspect& QskAspect::operator&=( States states ) noexcept inline QskAspect& QskAspect::operator&=( States states ) noexcept
@ -338,14 +370,14 @@ inline QskAspect& QskAspect::operator&=( States states ) noexcept
inline constexpr QskAspect QskAspect::stateless() const noexcept inline constexpr QskAspect QskAspect::stateless() const noexcept
{ {
return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, return QskAspect( m_bits.subControl, m_bits.section, m_bits.type,
m_bits.primitive, m_bits.placement, 0 ); m_bits.isAnimator, m_bits.primitive, m_bits.placement, 0 );
} }
inline constexpr QskAspect QskAspect::trunk() const noexcept inline constexpr QskAspect QskAspect::trunk() const noexcept
{ {
return QskAspect( m_bits.subControl, m_bits.type, m_bits.isAnimator, return QskAspect( m_bits.subControl, m_bits.section, m_bits.type,
m_bits.primitive, 0, 0 ); m_bits.isAnimator, m_bits.primitive, 0, 0 );
} }
inline constexpr quint64 QskAspect::value() const noexcept inline constexpr quint64 QskAspect::value() const noexcept
@ -373,6 +405,16 @@ inline void QskAspect::setSubControl( Subcontrol subControl ) noexcept
m_bits.subControl = subControl; m_bits.subControl = subControl;
} }
inline constexpr QskAspect::Section QskAspect::section() const noexcept
{
return static_cast< Section >( m_bits.section );
}
inline void QskAspect::setSection( Section section ) noexcept
{
m_bits.section = section;
}
inline constexpr QskAspect::Type QskAspect::type() const noexcept inline constexpr QskAspect::Type QskAspect::type() const noexcept
{ {
return static_cast< Type >( m_bits.type ); return static_cast< Type >( m_bits.type );
@ -490,6 +532,12 @@ inline constexpr QskAspect operator|(
return aspect | subControl; return aspect | subControl;
} }
inline constexpr QskAspect operator|(
QskAspect::Section section, const QskAspect& aspect ) noexcept
{
return aspect | section;
}
inline constexpr QskAspect operator|( inline constexpr QskAspect operator|(
QskAspect::Type type, const QskAspect& aspect ) noexcept QskAspect::Type type, const QskAspect& aspect ) noexcept
{ {
@ -502,6 +550,18 @@ inline constexpr QskAspect operator|(
return aspect | placement; return aspect | placement;
} }
inline constexpr QskAspect operator|(
QskAspect::Subcontrol subControl, QskAspect::Section section ) noexcept
{
return QskAspect( subControl ) | section;
}
inline constexpr QskAspect operator|(
QskAspect::Section section, QskAspect::Subcontrol subControl ) noexcept
{
return subControl | section;
}
inline constexpr QskAspect operator|( inline constexpr QskAspect operator|(
QskAspect::Subcontrol subControl, QskAspect::Type type ) noexcept QskAspect::Subcontrol subControl, QskAspect::Type type ) noexcept
{ {

View File

@ -38,6 +38,7 @@ QskControl::QskControl( QQuickItem* parent )
{ {
// inheriting attributes from parent // inheriting attributes from parent
QskControlPrivate::resolveLocale( this ); QskControlPrivate::resolveLocale( this );
QskControlPrivate::resolveSection( this );
} }
} }
@ -240,9 +241,12 @@ void QskControl::setLocale( const QLocale& locale )
if ( d->locale != locale ) if ( d->locale != locale )
{ {
extern void qskInheritLocale( QObject*, const QLocale& );
d->locale = locale; d->locale = locale;
qskSendEventTo( this, QEvent::LocaleChange ); qskSendEventTo( this, QEvent::LocaleChange );
qskSetup->inheritLocale( this, locale );
qskInheritLocale( this, locale );
} }
} }
@ -257,6 +261,47 @@ void QskControl::resetLocale()
} }
} }
void QskControl::setSection( QskAspect::Section section )
{
if ( section > QskAspect::LastSection )
{
qWarning() << "Trying to set an invalid section, ignored";
return;
}
Q_D( QskControl );
d->explicitSection = true;
if ( d->section != section )
{
extern void qskInheritSection( QskControl*, const QskAspect::Section );
d->section = section;
update();
resetImplicitSize();
qskInheritSection( this, section );
}
}
void QskControl::resetSection()
{
Q_D( QskControl );
if ( d->explicitSection )
{
d->explicitSection = false;
QskControlPrivate::resolveSection( this );
}
}
QskAspect::Section QskControl::section() const
{
return static_cast< QskAspect::Section >( d_func()->section );
}
void QskControl::initSizePolicy( void QskControl::initSizePolicy(
QskSizePolicy::Policy horizontalPolicy, QskSizePolicy::Policy horizontalPolicy,
QskSizePolicy::Policy verticalPolicy ) QskSizePolicy::Policy verticalPolicy )
@ -809,6 +854,9 @@ void QskControl::itemChange( QQuickItem::ItemChange change,
{ {
if ( !d_func()->explicitLocale ) if ( !d_func()->explicitLocale )
QskControlPrivate::resolveLocale( this ); QskControlPrivate::resolveLocale( this );
if ( !d_func()->explicitSection )
QskControlPrivate::resolveSection( this );
} }
#if 1 #if 1

View File

@ -26,6 +26,9 @@ class QSK_EXPORT QskControl : public QskQuickItem, public QskSkinnable
Q_PROPERTY( QLocale locale READ locale Q_PROPERTY( QLocale locale READ locale
WRITE setLocale RESET resetLocale NOTIFY localeChanged ) WRITE setLocale RESET resetLocale NOTIFY localeChanged )
Q_PROPERTY( QskAspect::Section section READ section
WRITE setSection RESET resetSection NOTIFY sectionChanged )
Q_PROPERTY( bool autoFillBackground READ autoFillBackground Q_PROPERTY( bool autoFillBackground READ autoFillBackground
WRITE setAutoFillBackground ) WRITE setAutoFillBackground )
@ -104,6 +107,10 @@ class QSK_EXPORT QskControl : public QskQuickItem, public QskSkinnable
void setFocusPolicy( Qt::FocusPolicy ); void setFocusPolicy( Qt::FocusPolicy );
Qt::FocusPolicy focusPolicy() const; Qt::FocusPolicy focusPolicy() const;
void setSection( QskAspect::Section );
void resetSection();
QskAspect::Section section() const override final;
void setSizePolicy( QskSizePolicy ); void setSizePolicy( QskSizePolicy );
void setSizePolicy( QskSizePolicy::Policy, QskSizePolicy::Policy ); void setSizePolicy( QskSizePolicy::Policy, QskSizePolicy::Policy );
void setSizePolicy( Qt::Orientation, QskSizePolicy::Policy ); void setSizePolicy( Qt::Orientation, QskSizePolicy::Policy );
@ -175,6 +182,7 @@ class QSK_EXPORT QskControl : public QskQuickItem, public QskSkinnable
Q_SIGNALS: Q_SIGNALS:
void backgroundChanged(); void backgroundChanged();
void sectionChanged( QskAspect::Section );
void marginsChanged( const QMarginsF& ); void marginsChanged( const QMarginsF& );
void focusIndicatorRectChanged(); void focusIndicatorRectChanged();
void localeChanged( const QLocale& ); void localeChanged( const QLocale& );

View File

@ -6,6 +6,8 @@
#include "QskControlPrivate.h" #include "QskControlPrivate.h"
#include "QskSetup.h" #include "QskSetup.h"
#include "QskLayoutMetrics.h" #include "QskLayoutMetrics.h"
#include "QskObjectTree.h"
#include "QskWindow.h"
static inline void qskSendEventTo( QObject* object, QEvent::Type type ) static inline void qskSendEventTo( QObject* object, QEvent::Type type )
{ {
@ -22,6 +24,108 @@ static inline QPointF qskScenePosition( const QMouseEvent* event )
#endif #endif
} }
extern bool qskInheritLocale( QskWindow*, const QLocale& );
namespace
{
class VisitorLocale final : public QskObjectTree::ResolveVisitor< QLocale >
{
public:
VisitorLocale()
: ResolveVisitor< QLocale >( "locale" )
{
}
private:
bool setImplicitValue( QskControl* control,
const QLocale& locale ) override
{
return QskControlPrivate::inheritLocale( control, locale );
}
bool setImplicitValue( QskWindow* window,
const QLocale& locale ) override
{
return qskInheritLocale( window, locale );
}
QLocale value( const QskControl* control ) const override
{
return control->locale();
}
QLocale value( const QskWindow* window ) const override
{
return window->locale();
}
};
class VisitorSection final : public QskObjectTree::ResolveVisitor< QskAspect::Section >
{
public:
VisitorSection()
: ResolveVisitor< QskAspect::Section >( "section" )
{
}
private:
bool setImplicitValue( QskControl* control,
const QskAspect::Section& section ) override
{
return QskControlPrivate::inheritSection( control, section );
}
bool setImplicitValue( QskWindow*, const QskAspect::Section& ) override
{
return true;
}
QskAspect::Section value( const QskControl* control ) const override
{
return control->section();
}
QskAspect::Section value( const QskWindow* ) const override
{
return QskAspect::Body;
}
};
}
QLocale qskInheritedLocale( const QObject* object )
{
VisitorLocale visitor;
visitor.setResolveValue( QLocale() );
QskObjectTree::traverseUp( const_cast< QObject* >( object ), visitor );
return visitor.resolveValue();
}
void qskInheritLocale( QObject* object, const QLocale& locale )
{
VisitorLocale visitor;
visitor.setResolveValue( locale );
QskObjectTree::traverseDown( object, visitor );
}
static QskAspect::Section qskInheritedSection( const QskControl* control )
{
VisitorSection visitor;
visitor.setResolveValue( QskAspect::Body );
QskObjectTree::traverseUp( const_cast< QskControl* >( control ), visitor );
return visitor.resolveValue();
}
void qskInheritSection( QskControl* control, QskAspect::Section section )
{
VisitorSection visitor;
visitor.setResolveValue( section );
QskObjectTree::traverseDown( control, visitor );
}
/* /*
Qt 5.12: Qt 5.12:
sizeof( QQuickItemPrivate::ExtraData ) -> 184 sizeof( QQuickItemPrivate::ExtraData ) -> 184
@ -52,6 +156,7 @@ QskControlPrivate::QskControlPrivate()
, hiddenPlacementPolicy( 0 ) , hiddenPlacementPolicy( 0 )
, layoutAlignmentHint( 0 ) , layoutAlignmentHint( 0 )
, explicitLocale( false ) , explicitLocale( false )
, explicitSection( false )
, autoFillBackground( false ) , autoFillBackground( false )
, autoLayoutChildren( false ) , autoLayoutChildren( false )
, focusPolicy( Qt::NoFocus ) , focusPolicy( Qt::NoFocus )
@ -255,7 +360,7 @@ bool QskControlPrivate::inheritLocale( QskControl* control, const QLocale& local
void QskControlPrivate::resolveLocale( QskControl* control ) void QskControlPrivate::resolveLocale( QskControl* control )
{ {
const auto locale = qskSetup->inheritedLocale( control ); const auto locale = qskInheritedLocale( control );
auto d = static_cast< QskControlPrivate* >( QQuickItemPrivate::get( control ) ); auto d = static_cast< QskControlPrivate* >( QQuickItemPrivate::get( control ) );
if ( d->locale != locale ) if ( d->locale != locale )
@ -263,7 +368,39 @@ void QskControlPrivate::resolveLocale( QskControl* control )
d->locale = locale; d->locale = locale;
qskSendEventTo( control, QEvent::LocaleChange ); qskSendEventTo( control, QEvent::LocaleChange );
qskSetup->inheritLocale( control, locale ); qskInheritLocale( control, locale );
}
}
bool QskControlPrivate::inheritSection(
QskControl* control, const QskAspect::Section section )
{
auto d = static_cast< QskControlPrivate* >( QQuickItemPrivate::get( control ) );
if ( d->explicitSection || d->section == section )
return true;
d->section = section;
control->update();
control->resetImplicitSize();
return false;
}
void QskControlPrivate::resolveSection( QskControl* control )
{
const auto section = qskInheritedSection( control );
auto d = static_cast< QskControlPrivate* >( QQuickItemPrivate::get( control ) );
if ( d->section != section )
{
d->section = section;
control->update();
control->resetImplicitSize();
qskInheritSection( control, section );
} }
} }

View File

@ -18,6 +18,9 @@ class QskControlPrivate : public QskQuickItemPrivate
static bool inheritLocale( QskControl*, const QLocale& ); static bool inheritLocale( QskControl*, const QLocale& );
static void resolveLocale( QskControl* ); static void resolveLocale( QskControl* );
static bool inheritSection( QskControl*, QskAspect::Section );
static void resolveSection( QskControl* );
protected: protected:
QskControlPrivate(); QskControlPrivate();
~QskControlPrivate() override; ~QskControlPrivate() override;
@ -51,8 +54,10 @@ class QskControlPrivate : public QskQuickItemPrivate
unsigned int hiddenPlacementPolicy : 2; unsigned int hiddenPlacementPolicy : 2;
unsigned int layoutAlignmentHint : 8; unsigned int layoutAlignmentHint : 8;
unsigned int section : 4;
bool explicitLocale : 1; bool explicitLocale : 1;
bool explicitSection : 1;
bool autoFillBackground : 1; bool autoFillBackground : 1;
bool autoLayoutChildren : 1; bool autoLayoutChildren : 1;

View File

@ -7,7 +7,6 @@
#include "QskControl.h" #include "QskControl.h"
#include "QskControlPrivate.h" #include "QskControlPrivate.h"
#include "QskGraphicProviderMap.h" #include "QskGraphicProviderMap.h"
#include "QskObjectTree.h"
#include "QskSkin.h" #include "QskSkin.h"
#include "QskSkinManager.h" #include "QskSkinManager.h"
#include "QskWindow.h" #include "QskWindow.h"
@ -74,43 +73,6 @@ static void qskApplicationFilter()
Q_CONSTRUCTOR_FUNCTION( qskApplicationHook ) Q_CONSTRUCTOR_FUNCTION( qskApplicationHook )
Q_COREAPP_STARTUP_FUNCTION( qskApplicationFilter ) Q_COREAPP_STARTUP_FUNCTION( qskApplicationFilter )
extern bool qskInheritLocale( QskWindow*, const QLocale& );
namespace
{
class VisitorLocale final : public QskObjectTree::ResolveVisitor< QLocale >
{
public:
VisitorLocale()
: ResolveVisitor< QLocale >( "locale" )
{
}
private:
bool setImplicitValue( QskControl* control,
const QLocale& locale ) override
{
return QskControlPrivate::inheritLocale( control, locale );
}
bool setImplicitValue( QskWindow* window,
const QLocale& locale ) override
{
return qskInheritLocale( window, locale );
}
QLocale value( const QskControl* control ) const override
{
return control->locale();
}
QLocale value( const QskWindow* window ) const override
{
return window->locale();
}
};
}
class QskSetup::PrivateData class QskSetup::PrivateData
{ {
public: public:
@ -254,23 +216,6 @@ QskGraphicProvider* QskSetup::graphicProvider( const QString& providerId ) const
return m_data->graphicProviders.provider( providerId ); return m_data->graphicProviders.provider( providerId );
} }
QLocale QskSetup::inheritedLocale( const QObject* object )
{
VisitorLocale visitor;
visitor.setResolveValue( QLocale() );
QskObjectTree::traverseUp( const_cast< QObject* >( object ), visitor );
return visitor.resolveValue();
}
void QskSetup::inheritLocale( QObject* object, const QLocale& locale )
{
VisitorLocale visitor;
visitor.setResolveValue( locale );
QskObjectTree::traverseDown( object, visitor );
}
bool QskSetup::eventFilter( QObject* object, QEvent* event ) bool QskSetup::eventFilter( QObject* object, QEvent* event )
{ {
if ( auto control = qskControlCast( object ) ) if ( auto control = qskControlCast( object ) )

View File

@ -16,8 +16,6 @@ class QskSkin;
class QQuickItem; class QQuickItem;
class QskGraphicProvider; class QskGraphicProvider;
class QLocale;
#if defined( qskSetup ) #if defined( qskSetup )
#undef qskSetup #undef qskSetup
#endif #endif
@ -51,9 +49,6 @@ class QSK_EXPORT QskSetup : public QObject
static void setup(); static void setup();
static void cleanup(); static void cleanup();
QLocale inheritedLocale( const QObject* );
void inheritLocale( QObject*, const QLocale& );
static QskSetup* qmlAttachedProperties( QObject* ); static QskSetup* qmlAttachedProperties( QObject* );
Q_SIGNALS: Q_SIGNALS:

View File

@ -14,7 +14,7 @@ inline const QVariant* qskResolvedHint( QskAspect aspect,
const std::unordered_map< QskAspect, QVariant >& hints, const std::unordered_map< QskAspect, QVariant >& hints,
QskAspect* resolvedAspect ) QskAspect* resolvedAspect )
{ {
const auto a = aspect; auto a = aspect;
Q_FOREVER Q_FOREVER
{ {
@ -56,6 +56,16 @@ inline const QVariant* qskResolvedHint( QskAspect aspect,
continue; continue;
} }
if ( aspect.section() != QskAspect::Body )
{
// try to resolve from QskAspect::Body
a.setSection( QskAspect::Body );
aspect = a;
continue;
}
return nullptr; return nullptr;
} }
} }

View File

@ -838,6 +838,9 @@ QVariant QskSkinnable::effectiveSkinHint(
{ {
aspect.setSubControl( effectiveSubcontrol( aspect.subControl() ) ); aspect.setSubControl( effectiveSubcontrol( aspect.subControl() ) );
if ( aspect.section() == QskAspect::Body )
aspect.setSection( section() );
if ( aspect.placement() == QskAspect::NoPlacement ) if ( aspect.placement() == QskAspect::NoPlacement )
aspect.setPlacement( effectivePlacement() ); aspect.setPlacement( effectivePlacement() );
@ -1337,6 +1340,11 @@ QskAspect::Placement QskSkinnable::effectivePlacement() const
return QskAspect::NoPlacement; return QskAspect::NoPlacement;
} }
QskAspect::Section QskSkinnable::section() const
{
return QskAspect::Body;
}
void QskSkinnable::updateNode( QSGNode* parentNode ) void QskSkinnable::updateNode( QSGNode* parentNode )
{ {
effectiveSkinlet()->updateNode( this, parentNode ); effectiveSkinlet()->updateNode( this, parentNode );

View File

@ -103,6 +103,8 @@ class QSK_EXPORT QskSkinnable
QVariant effectiveSkinHint( QskAspect, QskSkinHintStatus* = nullptr ) const; QVariant effectiveSkinHint( QskAspect, QskSkinHintStatus* = nullptr ) const;
virtual QskAspect::Placement effectivePlacement() const; virtual QskAspect::Placement effectivePlacement() const;
virtual QskAspect::Section section() const;
QskSkinHintStatus hintStatus( QskAspect ) const; QskSkinHintStatus hintStatus( QskAspect ) const;
QRectF subControlRect( const QRectF&, QskAspect::Subcontrol ) const; QRectF subControlRect( const QRectF&, QskAspect::Subcontrol ) const;

View File

@ -34,6 +34,9 @@ Q_LOGGING_CATEGORY( logTiming, "qsk.window.timing", QtCriticalMsg )
#endif #endif
extern QLocale qskInheritedLocale( const QObject* );
extern void qskInheritLocale( QObject*, const QLocale& );
static void qskResolveLocale( QskWindow* ); static void qskResolveLocale( QskWindow* );
static bool qskEnforcedSkin = false; static bool qskEnforcedSkin = false;
@ -423,7 +426,7 @@ void QskWindow::setLocale( const QLocale& locale )
{ {
d->locale = locale; d->locale = locale;
qskSendEventTo( this, QEvent::LocaleChange ); qskSendEventTo( this, QEvent::LocaleChange );
qskSetup->inheritLocale( this, locale ); qskInheritLocale( this, locale );
} }
} }
@ -452,14 +455,14 @@ static void qskResolveLocale( QskWindow* window )
{ {
auto d = static_cast< QskWindowPrivate* >( QQuickWindowPrivate::get( window ) ); auto d = static_cast< QskWindowPrivate* >( QQuickWindowPrivate::get( window ) );
const QLocale locale = qskSetup->inheritedLocale( window ); const auto locale = qskInheritedLocale( window );
if ( d->locale != locale ) if ( d->locale != locale )
{ {
d->locale = locale; d->locale = locale;
qskSendEventTo( window, QEvent::LocaleChange ); qskSendEventTo( window, QEvent::LocaleChange );
qskSetup->inheritLocale( window, locale ); qskInheritLocale( window, locale );
} }
} }