QskControlPrivate separate declaration/implemetation

This commit is contained in:
Uwe Rathmann 2018-11-25 12:52:37 +01:00
parent cbc5d2b11f
commit b99dd147f2
1 changed files with 162 additions and 142 deletions

View File

@ -195,7 +195,90 @@ class QskControlPrivate final : public QQuickItemPrivate
{ qskDefaultSizeHints[ 0 ], qskDefaultSizeHints[ 1 ], qskDefaultSizeHints[ 2 ] };
};
QskControlPrivate()
QskControlPrivate();
~QskControlPrivate() override;
void mirrorChange() override;
#if 0
// can we do something useful with overloading those ???
qreal getImplicitWidth() const override;
qreal getImplicitHeight() const override;
QSGTransformNode* createTransformNode() override;
#endif
void implicitWidthChanged() override;
void implicitHeightChanged() override;
void setExplicitSizeHint( Qt::SizeHint whichHint, const QSizeF& size );
QSizeF explicitSizeHint( Qt::SizeHint whichHint ) const;
bool maybeGesture( QQuickItem* child, QEvent* event );
void updateControlFlags( QskControl::Flags flags );
/*
Qt 5.11:
sizeof( QQuickItemPrivate::ExtraData ) -> 184
sizeof( QQuickItemPrivate ) -> 320
sizeof( QskControlPrivate ) -> sizeof( QQuickItemPrivate ) + 32
sizeof( QskSkinnable::PrivateData ) -> 40
( these numbers include pointers to optional extra data, that might
increase the effective memory footprint, when being accurate ).
It might be possible to save some bytes, but in the end QskControl
is heavy simply because of deriving from QQuickItem. So without
patching Qt the only way to limit the memory footprint of an application
substantially is to limit the number of QQuickItems.
That's why QSkinny builds more complex controls from scene graph nodes
instead of doing QQuickItem composition. As this can only be done
in C++ it is kind of obvious, why it is often a bad idea to build
custom controls in QML.
*/
private:
void implicitSizeChanged();
ExplicitSizeData* explicitSizeData;
public:
QLocale locale;
QskSizePolicy sizePolicy;
quint16 controlFlags;
quint16 controlFlagsMask;
bool explicitLocale : 1;
bool autoFillBackground : 1;
bool autoLayoutChildren : 1;
bool polishOnResize : 1;
bool blockedPolish : 1;
bool blockedImplicitSize : 1;
bool clearPreviousNodes : 1;
bool blockImplicitSizeNotification : 1;
bool isInitiallyPainted : 1;
uint focusPolicy : 4;
bool isWheelEnabled : 1;
};
static void qskUpdateControlFlags( QskControl::Flags flags, QskControl* control )
{
auto d = static_cast< QskControlPrivate* >( QQuickItemPrivate::get( control ) );
d->updateControlFlags( flags );
}
QskControlPrivate::QskControlPrivate()
: explicitSizeData( nullptr )
, sizePolicy( QskSizePolicy::Preferred, QskSizePolicy::Preferred )
, controlFlags( qskControlFlags() )
@ -233,18 +316,18 @@ class QskControlPrivate final : public QQuickItemPrivate
}
}
~QskControlPrivate() override
QskControlPrivate::~QskControlPrivate()
{
delete explicitSizeData;
}
void mirrorChange() override
void QskControlPrivate::mirrorChange()
{
Q_Q( QskControl );
qskSendEventTo( q, QEvent::LayoutDirectionChange );
}
inline void implicitSizeChanged()
inline void QskControlPrivate::implicitSizeChanged()
{
Q_Q( QskControl );
if ( !q->explicitSizeHint( Qt::PreferredSize ).isValid() )
@ -256,16 +339,7 @@ class QskControlPrivate final : public QQuickItemPrivate
}
}
#if 0
// can we do something useful with overloading those ???
qreal getImplicitWidth() const override;
qreal getImplicitHeight() const override;
QSGTransformNode* createTransformNode() override;
#endif
void implicitWidthChanged() override
void QskControlPrivate::implicitWidthChanged()
{
QQuickItemPrivate::implicitWidthChanged();
@ -273,7 +347,7 @@ class QskControlPrivate final : public QQuickItemPrivate
implicitSizeChanged();
}
void implicitHeightChanged() override
void QskControlPrivate::implicitHeightChanged()
{
QQuickItemPrivate::implicitWidthChanged();
@ -281,7 +355,8 @@ class QskControlPrivate final : public QQuickItemPrivate
implicitSizeChanged();
}
inline void setExplicitSizeHint( Qt::SizeHint whichHint, const QSizeF& size )
inline void QskControlPrivate::setExplicitSizeHint(
Qt::SizeHint whichHint, const QSizeF& size )
{
if ( explicitSizeData == nullptr )
explicitSizeData = new ExplicitSizeData;
@ -289,7 +364,7 @@ class QskControlPrivate final : public QQuickItemPrivate
explicitSizeData->sizeHints[ whichHint ] = size;
}
inline QSizeF explicitSizeHint( Qt::SizeHint whichHint ) const
inline QSizeF QskControlPrivate::explicitSizeHint( Qt::SizeHint whichHint ) const
{
if ( explicitSizeData )
return explicitSizeData->sizeHints[ whichHint ];
@ -297,7 +372,7 @@ class QskControlPrivate final : public QQuickItemPrivate
return qskDefaultSizeHints[ whichHint ];
}
bool maybeGesture( QQuickItem* child, QEvent* event )
bool QskControlPrivate::maybeGesture( QQuickItem* child, QEvent* event )
{
Q_Q( QskControl );
@ -330,7 +405,7 @@ class QskControlPrivate final : public QQuickItemPrivate
return q->gestureFilter( child, event );
}
void updateControlFlags( QskControl::Flags flags )
void QskControlPrivate::updateControlFlags( QskControl::Flags flags )
{
Q_Q( QskControl );
@ -352,62 +427,7 @@ class QskControlPrivate final : public QQuickItemPrivate
}
}
/*
Qt 5.11:
sizeof( QQuickItemPrivate::ExtraData ) -> 184
sizeof( QQuickItemPrivate ) -> 320
sizeof( QskControlPrivate ) -> sizeof( QQuickItemPrivate ) + 32
sizeof( QskSkinnable::PrivateData ) -> 40
( these numbers include pointers to optional extra data, that might
increase the effective memory footprint, when being accurate ).
It might be possible to save some bytes, but in the end QskControl
is heavy simply because of deriving from QQuickItem. So without
patching Qt the only way to limit the memory footprint of an application
substantially is to limit the number of QQuickItems.
That's why QSkinny builds more complex controls from scene graph nodes
instead of doing QQuickItem composition. As this can only be done
in C++ it is kind of obvious, why it is often a bad idea to build
custom controls in QML.
*/
private:
ExplicitSizeData* explicitSizeData;
public:
QLocale locale;
QskSizePolicy sizePolicy;
quint16 controlFlags;
quint16 controlFlagsMask;
bool explicitLocale : 1;
bool autoFillBackground : 1;
bool autoLayoutChildren : 1;
bool polishOnResize : 1;
bool blockedPolish : 1;
bool blockedImplicitSize : 1;
bool clearPreviousNodes : 1;
bool blockImplicitSizeNotification : 1;
bool isInitiallyPainted : 1;
uint focusPolicy : 4;
bool isWheelEnabled : 1;
};
static void qskUpdateControlFlags( QskControl::Flags flags, QskControl* control )
{
auto d = static_cast< QskControlPrivate* >( QQuickItemPrivate::get( control ) );
d->updateControlFlags( flags );
}
// --------
QskControl::QskControl( QQuickItem* parent )
: Inherited( *( new QskControlPrivate() ), parent )