QskItem::polishOnParentResize flag introduced

This commit is contained in:
Uwe Rathmann 2024-02-08 11:33:42 +01:00
parent fc1ed926e6
commit 36fab6a9c2
7 changed files with 107 additions and 157 deletions

View File

@ -16,7 +16,6 @@
QSK_QT_PRIVATE_BEGIN
#include <private/qquickitem_p.h>
#include <private/qquickitemchangelistener_p.h>
QSK_QT_PRIVATE_END
QSK_SUBCONTROL( QskDrawer, Panel )
@ -110,52 +109,6 @@ static QPointF qskDrawerTranslation( const QskDrawer* drawer, const QSizeF& size
namespace
{
// Using an eventFilter for QskEvent::GeometryChange instead ???
class GeometryListener final : public QQuickItemChangeListener
{
public:
GeometryListener( QQuickItem* item, QQuickItem* adjustedItem )
: m_item( item )
, m_adjustedItem( adjustedItem )
{
adjust();
setEnabled( true );
}
~GeometryListener()
{
setEnabled( false );
}
private:
void itemGeometryChanged( QQuickItem*,
QQuickGeometryChange, const QRectF& ) override
{
adjust();
}
private:
void adjust()
{
m_adjustedItem->polish();
}
void setEnabled( bool on )
{
const auto changeTypes = QQuickItemPrivate::Geometry;
auto d = QQuickItemPrivate::get( m_item );
if ( on )
d->addItemChangeListener( this, changeTypes );
else
d->removeItemChangeListener( this, changeTypes );
}
QQuickItem* m_item;
QQuickItem* m_adjustedItem;
};
class GestureRecognizer : public QskPanGestureRecognizer
{
using Inherited = QskPanGestureRecognizer;
@ -216,16 +169,6 @@ class QskDrawer::PrivateData
{
}
inline void resetListener( QskDrawer* drawer )
{
delete listener;
listener = nullptr;
if ( drawer->parentItem() && drawer->isVisible() )
listener = new GeometryListener( drawer->parentItem(), drawer );
}
GeometryListener* listener = nullptr;
GestureRecognizer* gestureRecognizer = nullptr;
qreal dragMargin = qskDefaultDragMargin();
@ -235,6 +178,7 @@ class QskDrawer::PrivateData
QskDrawer::QskDrawer( QQuickItem* parentItem )
: QskDrawer( Qt::LeftEdge, parentItem )
{
setPolishOnParentResize( true );
}
QskDrawer::QskDrawer( Qt::Edge edge, QQuickItem* parentItem )
@ -262,7 +206,6 @@ QskDrawer::QskDrawer( Qt::Edge edge, QQuickItem* parentItem )
QskDrawer::~QskDrawer()
{
delete m_data->listener;
}
Qt::Edge QskDrawer::edge() const
@ -361,12 +304,6 @@ void QskDrawer::itemChange( QQuickItem::ItemChange change,
if ( parentItem() && isInteractive() )
qskCatchMouseEvents( parentItem() );
m_data->resetListener( this );
break;
}
case QQuickItem::ItemVisibleHasChanged:
{
m_data->resetListener( this );
break;
}
}

View File

@ -31,6 +31,8 @@ QSK_QT_PRIVATE_BEGIN
#include <private/qquickpositioners_p.h>
#endif
#include <private/qquickitemchangelistener_p.h>
QSK_QT_PRIVATE_END
#endif
@ -160,8 +162,72 @@ namespace
};
}
namespace
{
// A helper class for the polishOnParentResize feature
class QskParentListener final : public QQuickItemChangeListener
{
public:
void update( QQuickItem* parentItem )
{
if ( parentItem == nullptr )
return;
const auto changeTypes =
QQuickItemPrivate::Geometry | QQuickItemPrivate::Children;
auto d = QQuickItemPrivate::get( parentItem );
if ( needListening( parentItem ) )
d->updateOrAddItemChangeListener( this, changeTypes );
else
d->removeItemChangeListener( this, changeTypes );
}
private:
inline bool needListening( const QQuickItem* parentItem ) const
{
const auto children = parentItem->childItems();
for ( auto child : children )
{
if ( auto item = qobject_cast< const QskItem* >( child ) )
{
if ( item->polishOnParentResize() )
return true;
}
}
return false;
}
void itemGeometryChanged( QQuickItem* parentItem,
QQuickGeometryChange, const QRectF& ) override
{
const auto children = parentItem->childItems();
for ( auto child : children )
{
if ( auto item = qobject_cast< QskItem* >( child ) )
{
if ( item->polishOnParentResize() )
{
item->resetImplicitSize();
item->polish();
}
}
}
}
void itemChildRemoved( QQuickItem* parentItem, QQuickItem* )
{
update( parentItem );
}
};
}
Q_GLOBAL_STATIC( QskItemRegistry, qskRegistry )
Q_GLOBAL_STATIC( QskWindowStore, qskReleasedWindowCounter )
Q_GLOBAL_STATIC( QskParentListener, qskParentListener )
QskItem::QskItem( QskItemPrivate& dd, QQuickItem* parent )
: QQuickItem( dd, parent )
@ -418,6 +484,30 @@ bool QskItem::polishOnResize() const
return d_func()->polishOnResize;
}
void QskItem::setPolishOnParentResize( bool on )
{
Q_D( QskItem );
if ( on != d->polishOnParentResize )
{
d->polishOnParentResize = on;
if ( parentItem() && qskParentListener )
{
qskParentListener->update( parentItem() );
resetImplicitSize();
polish();
}
Q_EMIT itemFlagsChanged();
}
}
bool QskItem::polishOnParentResize() const
{
return d_func()->polishOnParentResize;
}
bool QskItem::layoutMirroring() const
{
#if 1
@ -894,9 +984,13 @@ void QskItem::itemChange( QQuickItem::ItemChange change,
break;
}
case QQuickItem::ItemParentHasChanged:
{
if( polishOnParentResize() && qskParentListener )
qskParentListener->update( parentItem() );
break;
}
case QQuickItem::ItemChildAddedChange:
case QQuickItem::ItemChildRemovedChange:
{

View File

@ -26,6 +26,9 @@ class QSK_EXPORT QskItem : public QQuickItem
Q_PROPERTY( bool polishOnResize READ polishOnResize
WRITE setPolishOnResize NOTIFY itemFlagsChanged FINAL )
Q_PROPERTY( bool polishOnParentResize READ polishOnParentResize
WRITE setPolishOnParentResize NOTIFY itemFlagsChanged FINAL )
Q_PROPERTY( Qt::FocusPolicy focusPolicy READ focusPolicy
WRITE setFocusPolicy NOTIFY focusPolicyChanged )
@ -81,6 +84,9 @@ class QSK_EXPORT QskItem : public QQuickItem
void setPolishOnResize( bool );
bool polishOnResize() const;
void setPolishOnParentResize( bool );
bool polishOnParentResize() const;
void setFocusPolicy( Qt::FocusPolicy );
Qt::FocusPolicy focusPolicy() const;

View File

@ -17,6 +17,7 @@ QskItemPrivate::QskItemPrivate()
: updateFlags( QskSetup::updateFlags() )
, updateFlagsMask( 0 )
, polishOnResize( false )
, polishOnParentResize( false )
, blockedPolish( false )
, blockedImplicitSize( true )
, clearPreviousNodes( false )

View File

@ -51,6 +51,7 @@ class QskItemPrivate : public QQuickItemPrivate
quint8 updateFlagsMask;
bool polishOnResize : 1;
bool polishOnParentResize : 1;
bool blockedPolish : 1;
bool blockedImplicitSize : 1;

View File

@ -15,11 +15,6 @@
#include <QskPlatform.h>
#endif
QSK_QT_PRIVATE_BEGIN
#include <private/qquickitem_p.h>
#include <private/qquickitemchangelistener_p.h>
QSK_QT_PRIVATE_END
#include <qquickwindow.h>
#include <qpointer.h>
@ -37,60 +32,9 @@ static inline void qskSetRejectOnClose( QskDialogSubWindow* subWindow, bool on )
}
}
namespace
{
class GeometryListener final : public QQuickItemChangeListener
{
public:
GeometryListener( QskControl* control )
: m_control( control )
, m_parent( m_control->parentItem() )
{
setEnabled( true );
m_control->polish();
}
~GeometryListener()
{
setEnabled( false );
}
private:
void setEnabled( bool on )
{
const auto changeTypes = QQuickItemPrivate::Geometry;
auto d = QQuickItemPrivate::get( m_parent );
if ( on )
d->addItemChangeListener( this, changeTypes );
else
d->removeItemChangeListener( this, changeTypes );
}
void itemGeometryChanged( QQuickItem*,
QQuickGeometryChange, const QRectF& ) override
{
m_control->resetImplicitSize();
m_control->polish();
}
QskControl* m_control;
QQuickItem* m_parent;
};
}
class QskDialogSubWindow::PrivateData
{
public:
inline void resetListener( QskDialogSubWindow* subWindow )
{
delete listener;
listener = nullptr;
if ( subWindow->parentItem() && subWindow->isVisible() )
listener = new GeometryListener( subWindow );
}
QskDialog::Actions actions = QskDialog::NoAction;
QskTextLabel* titleLabel = nullptr;
@ -99,7 +43,6 @@ class QskDialogSubWindow::PrivateData
QPointer< QQuickItem > contentItem;
QskLinearBox* layout = nullptr;
GeometryListener* listener = nullptr;
QskDialog::DialogCode result = QskDialog::Rejected;
};
@ -115,14 +58,11 @@ QskDialogSubWindow::QskDialogSubWindow( QQuickItem* parent )
QskSizePolicy::MinimumExpanding, QskSizePolicy::Constrained );
setPolishOnResize( true );
if ( parent )
m_data->listener = new GeometryListener( this );
setPolishOnParentResize( true );
}
QskDialogSubWindow::~QskDialogSubWindow()
{
delete m_data->listener;
}
void QskDialogSubWindow::addDialogAction( QskDialog::Action action )
@ -432,7 +372,7 @@ void QskDialogSubWindow::updateGeometry()
QSizeF QskDialogSubWindow::layoutSizeHint(
Qt::SizeHint which, const QSizeF& constraint ) const
{
if ( which == Qt::MaximumSize )
if ( which == Qt::MaximumSize && polishOnParentResize() )
return 0.9 * parentItem()->size();
auto size = m_data->layout->effectiveSizeHint( which, constraint );
@ -446,31 +386,4 @@ QSizeF QskDialogSubWindow::layoutSizeHint(
return size;
}
void QskDialogSubWindow::aboutToShow()
{
updateGeometry();
Inherited::aboutToShow();
}
void QskDialogSubWindow::itemChange( QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData& value )
{
Inherited::itemChange( change, value );
switch( static_cast< int >( change ) )
{
case QQuickItem::ItemParentHasChanged:
case QQuickItem::ItemVisibleHasChanged:
{
delete m_data->listener;
m_data->listener = nullptr;
if ( parentItem() && isVisible() )
m_data->listener = new GeometryListener( this );
break;
}
}
}
#include "moc_QskDialogSubWindow.cpp"

View File

@ -82,8 +82,6 @@ class QSK_EXPORT QskDialogSubWindow : public QskSubWindow
virtual void updateGeometry();
void updateLayout() override;
void aboutToShow() override;
void itemChange( ItemChange, const ItemChangeData& ) override;
QSizeF layoutSizeHint( Qt::SizeHint, const QSizeF& ) const;