QskControlPrivate separate declaration/implemetation
This commit is contained in:
parent
cbc5d2b11f
commit
b99dd147f2
|
@ -195,66 +195,10 @@ class QskControlPrivate final : public QQuickItemPrivate
|
||||||
{ qskDefaultSizeHints[ 0 ], qskDefaultSizeHints[ 1 ], qskDefaultSizeHints[ 2 ] };
|
{ qskDefaultSizeHints[ 0 ], qskDefaultSizeHints[ 1 ], qskDefaultSizeHints[ 2 ] };
|
||||||
};
|
};
|
||||||
|
|
||||||
QskControlPrivate()
|
QskControlPrivate();
|
||||||
: explicitSizeData( nullptr )
|
~QskControlPrivate() override;
|
||||||
, sizePolicy( QskSizePolicy::Preferred, QskSizePolicy::Preferred )
|
|
||||||
, controlFlags( qskControlFlags() )
|
|
||||||
, controlFlagsMask( 0 )
|
|
||||||
, explicitLocale( false )
|
|
||||||
, autoFillBackground( false )
|
|
||||||
, autoLayoutChildren( false )
|
|
||||||
, polishOnResize( false )
|
|
||||||
, blockedPolish( false )
|
|
||||||
, blockedImplicitSize( true )
|
|
||||||
, clearPreviousNodes( false )
|
|
||||||
, blockImplicitSizeNotification( false )
|
|
||||||
, isInitiallyPainted( false )
|
|
||||||
, focusPolicy( Qt::NoFocus )
|
|
||||||
, isWheelEnabled( false )
|
|
||||||
{
|
|
||||||
if ( controlFlags & QskControl::DeferredLayout )
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
In general the geometry of an item should be the job of
|
|
||||||
the parent - unfortunatly not done by Qt Quick
|
|
||||||
probably in the spirit of "making things easier".
|
|
||||||
|
|
||||||
To avoid potentially expensive calculations happening
|
void mirrorChange() override;
|
||||||
too often and early QskControl blocks updates of
|
|
||||||
the implicitSize and any auto resizing of the control
|
|
||||||
according to it.
|
|
||||||
|
|
||||||
There should be no strong reason for using concepts
|
|
||||||
like Positioners, that rely on implicit resizing,
|
|
||||||
but to make it working: the DeferredLayout flag needs to be disabled.
|
|
||||||
*/
|
|
||||||
|
|
||||||
widthValid = heightValid = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
~QskControlPrivate() override
|
|
||||||
{
|
|
||||||
delete explicitSizeData;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mirrorChange() override
|
|
||||||
{
|
|
||||||
Q_Q( QskControl );
|
|
||||||
qskSendEventTo( q, QEvent::LayoutDirectionChange );
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void implicitSizeChanged()
|
|
||||||
{
|
|
||||||
Q_Q( QskControl );
|
|
||||||
if ( !q->explicitSizeHint( Qt::PreferredSize ).isValid() )
|
|
||||||
{
|
|
||||||
// when we have no PreferredSize we fall back
|
|
||||||
// to the implicit size
|
|
||||||
|
|
||||||
q->layoutConstraintChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// can we do something useful with overloading those ???
|
// can we do something useful with overloading those ???
|
||||||
|
@ -265,92 +209,15 @@ class QskControlPrivate final : public QQuickItemPrivate
|
||||||
QSGTransformNode* createTransformNode() override;
|
QSGTransformNode* createTransformNode() override;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void implicitWidthChanged() override
|
void implicitWidthChanged() override;
|
||||||
{
|
void implicitHeightChanged() override;
|
||||||
QQuickItemPrivate::implicitWidthChanged();
|
|
||||||
|
|
||||||
if ( !blockImplicitSizeNotification )
|
void setExplicitSizeHint( Qt::SizeHint whichHint, const QSizeF& size );
|
||||||
implicitSizeChanged();
|
QSizeF explicitSizeHint( Qt::SizeHint whichHint ) const;
|
||||||
}
|
|
||||||
|
|
||||||
void implicitHeightChanged() override
|
bool maybeGesture( QQuickItem* child, QEvent* event );
|
||||||
{
|
|
||||||
QQuickItemPrivate::implicitWidthChanged();
|
|
||||||
|
|
||||||
if ( !blockImplicitSizeNotification )
|
void updateControlFlags( QskControl::Flags flags );
|
||||||
implicitSizeChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void setExplicitSizeHint( Qt::SizeHint whichHint, const QSizeF& size )
|
|
||||||
{
|
|
||||||
if ( explicitSizeData == nullptr )
|
|
||||||
explicitSizeData = new ExplicitSizeData;
|
|
||||||
|
|
||||||
explicitSizeData->sizeHints[ whichHint ] = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline QSizeF explicitSizeHint( Qt::SizeHint whichHint ) const
|
|
||||||
{
|
|
||||||
if ( explicitSizeData )
|
|
||||||
return explicitSizeData->sizeHints[ whichHint ];
|
|
||||||
|
|
||||||
return qskDefaultSizeHints[ whichHint ];
|
|
||||||
}
|
|
||||||
|
|
||||||
bool maybeGesture( QQuickItem* child, QEvent* event )
|
|
||||||
{
|
|
||||||
Q_Q( QskControl );
|
|
||||||
|
|
||||||
switch ( event->type() )
|
|
||||||
{
|
|
||||||
case QEvent::MouseButtonPress:
|
|
||||||
{
|
|
||||||
const auto mouseEvent = static_cast< const QMouseEvent* >( event );
|
|
||||||
const QPointF pos = q->mapFromScene( mouseEvent->windowPos() );
|
|
||||||
|
|
||||||
if ( !q->gestureRect().contains( pos ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case QEvent::MouseMove:
|
|
||||||
case QEvent::MouseButtonRelease:
|
|
||||||
case QEvent::MouseButtonDblClick:
|
|
||||||
case QEvent::UngrabMouse:
|
|
||||||
case QEvent::TouchBegin:
|
|
||||||
case QEvent::TouchCancel:
|
|
||||||
case QEvent::TouchUpdate:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return q->gestureFilter( child, event );
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateControlFlags( QskControl::Flags flags )
|
|
||||||
{
|
|
||||||
Q_Q( QskControl );
|
|
||||||
|
|
||||||
const auto oldFlags = controlFlags;
|
|
||||||
const auto newFlags = static_cast< controlFlags_t >( flags );
|
|
||||||
|
|
||||||
if ( oldFlags != newFlags )
|
|
||||||
{
|
|
||||||
const auto numBits = qCountTrailingZeroBits(
|
|
||||||
static_cast< quint32 >( QskControl::LastFlag ) );
|
|
||||||
|
|
||||||
for ( quint32 i = 0; i <= numBits; ++i )
|
|
||||||
{
|
|
||||||
const quint32 flag = ( 1 << i );
|
|
||||||
q->updateControlFlag( flag, flags & flag );
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_EMIT q->controlFlagsChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Qt 5.11:
|
Qt 5.11:
|
||||||
|
@ -375,6 +242,8 @@ class QskControlPrivate final : public QQuickItemPrivate
|
||||||
*/
|
*/
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void implicitSizeChanged();
|
||||||
|
|
||||||
ExplicitSizeData* explicitSizeData;
|
ExplicitSizeData* explicitSizeData;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -409,6 +278,157 @@ static void qskUpdateControlFlags( QskControl::Flags flags, QskControl* control
|
||||||
d->updateControlFlags( flags );
|
d->updateControlFlags( flags );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QskControlPrivate::QskControlPrivate()
|
||||||
|
: explicitSizeData( nullptr )
|
||||||
|
, sizePolicy( QskSizePolicy::Preferred, QskSizePolicy::Preferred )
|
||||||
|
, controlFlags( qskControlFlags() )
|
||||||
|
, controlFlagsMask( 0 )
|
||||||
|
, explicitLocale( false )
|
||||||
|
, autoFillBackground( false )
|
||||||
|
, autoLayoutChildren( false )
|
||||||
|
, polishOnResize( false )
|
||||||
|
, blockedPolish( false )
|
||||||
|
, blockedImplicitSize( true )
|
||||||
|
, clearPreviousNodes( false )
|
||||||
|
, blockImplicitSizeNotification( false )
|
||||||
|
, isInitiallyPainted( false )
|
||||||
|
, focusPolicy( Qt::NoFocus )
|
||||||
|
, isWheelEnabled( false )
|
||||||
|
{
|
||||||
|
if ( controlFlags & QskControl::DeferredLayout )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
In general the geometry of an item should be the job of
|
||||||
|
the parent - unfortunatly not done by Qt Quick
|
||||||
|
probably in the spirit of "making things easier".
|
||||||
|
|
||||||
|
To avoid potentially expensive calculations happening
|
||||||
|
too often and early QskControl blocks updates of
|
||||||
|
the implicitSize and any auto resizing of the control
|
||||||
|
according to it.
|
||||||
|
|
||||||
|
There should be no strong reason for using concepts
|
||||||
|
like Positioners, that rely on implicit resizing,
|
||||||
|
but to make it working: the DeferredLayout flag needs to be disabled.
|
||||||
|
*/
|
||||||
|
|
||||||
|
widthValid = heightValid = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QskControlPrivate::~QskControlPrivate()
|
||||||
|
{
|
||||||
|
delete explicitSizeData;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskControlPrivate::mirrorChange()
|
||||||
|
{
|
||||||
|
Q_Q( QskControl );
|
||||||
|
qskSendEventTo( q, QEvent::LayoutDirectionChange );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void QskControlPrivate::implicitSizeChanged()
|
||||||
|
{
|
||||||
|
Q_Q( QskControl );
|
||||||
|
if ( !q->explicitSizeHint( Qt::PreferredSize ).isValid() )
|
||||||
|
{
|
||||||
|
// when we have no PreferredSize we fall back
|
||||||
|
// to the implicit size
|
||||||
|
|
||||||
|
q->layoutConstraintChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskControlPrivate::implicitWidthChanged()
|
||||||
|
{
|
||||||
|
QQuickItemPrivate::implicitWidthChanged();
|
||||||
|
|
||||||
|
if ( !blockImplicitSizeNotification )
|
||||||
|
implicitSizeChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskControlPrivate::implicitHeightChanged()
|
||||||
|
{
|
||||||
|
QQuickItemPrivate::implicitWidthChanged();
|
||||||
|
|
||||||
|
if ( !blockImplicitSizeNotification )
|
||||||
|
implicitSizeChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void QskControlPrivate::setExplicitSizeHint(
|
||||||
|
Qt::SizeHint whichHint, const QSizeF& size )
|
||||||
|
{
|
||||||
|
if ( explicitSizeData == nullptr )
|
||||||
|
explicitSizeData = new ExplicitSizeData;
|
||||||
|
|
||||||
|
explicitSizeData->sizeHints[ whichHint ] = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline QSizeF QskControlPrivate::explicitSizeHint( Qt::SizeHint whichHint ) const
|
||||||
|
{
|
||||||
|
if ( explicitSizeData )
|
||||||
|
return explicitSizeData->sizeHints[ whichHint ];
|
||||||
|
|
||||||
|
return qskDefaultSizeHints[ whichHint ];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QskControlPrivate::maybeGesture( QQuickItem* child, QEvent* event )
|
||||||
|
{
|
||||||
|
Q_Q( QskControl );
|
||||||
|
|
||||||
|
switch ( event->type() )
|
||||||
|
{
|
||||||
|
case QEvent::MouseButtonPress:
|
||||||
|
{
|
||||||
|
const auto mouseEvent = static_cast< const QMouseEvent* >( event );
|
||||||
|
const QPointF pos = q->mapFromScene( mouseEvent->windowPos() );
|
||||||
|
|
||||||
|
if ( !q->gestureRect().contains( pos ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case QEvent::MouseMove:
|
||||||
|
case QEvent::MouseButtonRelease:
|
||||||
|
case QEvent::MouseButtonDblClick:
|
||||||
|
case QEvent::UngrabMouse:
|
||||||
|
case QEvent::TouchBegin:
|
||||||
|
case QEvent::TouchCancel:
|
||||||
|
case QEvent::TouchUpdate:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return q->gestureFilter( child, event );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskControlPrivate::updateControlFlags( QskControl::Flags flags )
|
||||||
|
{
|
||||||
|
Q_Q( QskControl );
|
||||||
|
|
||||||
|
const auto oldFlags = controlFlags;
|
||||||
|
const auto newFlags = static_cast< controlFlags_t >( flags );
|
||||||
|
|
||||||
|
if ( oldFlags != newFlags )
|
||||||
|
{
|
||||||
|
const auto numBits = qCountTrailingZeroBits(
|
||||||
|
static_cast< quint32 >( QskControl::LastFlag ) );
|
||||||
|
|
||||||
|
for ( quint32 i = 0; i <= numBits; ++i )
|
||||||
|
{
|
||||||
|
const quint32 flag = ( 1 << i );
|
||||||
|
q->updateControlFlag( flag, flags & flag );
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_EMIT q->controlFlagsChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------
|
||||||
|
|
||||||
QskControl::QskControl( QQuickItem* parent )
|
QskControl::QskControl( QQuickItem* parent )
|
||||||
: Inherited( *( new QskControlPrivate() ), parent )
|
: Inherited( *( new QskControlPrivate() ), parent )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue