From 36fab6a9c2ff6b7fc61714640da2a5f970518275 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 8 Feb 2024 11:33:42 +0100 Subject: [PATCH] QskItem::polishOnParentResize flag introduced --- src/controls/QskDrawer.cpp | 65 +------------------- src/controls/QskItem.cpp | 98 +++++++++++++++++++++++++++++- src/controls/QskItem.h | 6 ++ src/controls/QskItemPrivate.cpp | 1 + src/controls/QskItemPrivate.h | 1 + src/dialogs/QskDialogSubWindow.cpp | 91 +-------------------------- src/dialogs/QskDialogSubWindow.h | 2 - 7 files changed, 107 insertions(+), 157 deletions(-) diff --git a/src/controls/QskDrawer.cpp b/src/controls/QskDrawer.cpp index c08cbd69..459a8fba 100644 --- a/src/controls/QskDrawer.cpp +++ b/src/controls/QskDrawer.cpp @@ -16,7 +16,6 @@ QSK_QT_PRIVATE_BEGIN #include -#include 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; } } diff --git a/src/controls/QskItem.cpp b/src/controls/QskItem.cpp index db27ec5f..9b2d1eb7 100644 --- a/src/controls/QskItem.cpp +++ b/src/controls/QskItem.cpp @@ -31,6 +31,8 @@ QSK_QT_PRIVATE_BEGIN #include #endif +#include + 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: { diff --git a/src/controls/QskItem.h b/src/controls/QskItem.h index 7d9e90f2..568d7642 100644 --- a/src/controls/QskItem.h +++ b/src/controls/QskItem.h @@ -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; diff --git a/src/controls/QskItemPrivate.cpp b/src/controls/QskItemPrivate.cpp index 74d1f642..5ff79737 100644 --- a/src/controls/QskItemPrivate.cpp +++ b/src/controls/QskItemPrivate.cpp @@ -17,6 +17,7 @@ QskItemPrivate::QskItemPrivate() : updateFlags( QskSetup::updateFlags() ) , updateFlagsMask( 0 ) , polishOnResize( false ) + , polishOnParentResize( false ) , blockedPolish( false ) , blockedImplicitSize( true ) , clearPreviousNodes( false ) diff --git a/src/controls/QskItemPrivate.h b/src/controls/QskItemPrivate.h index 6d7b8d54..db5b0b96 100644 --- a/src/controls/QskItemPrivate.h +++ b/src/controls/QskItemPrivate.h @@ -51,6 +51,7 @@ class QskItemPrivate : public QQuickItemPrivate quint8 updateFlagsMask; bool polishOnResize : 1; + bool polishOnParentResize : 1; bool blockedPolish : 1; bool blockedImplicitSize : 1; diff --git a/src/dialogs/QskDialogSubWindow.cpp b/src/dialogs/QskDialogSubWindow.cpp index f86cd326..51b40dfb 100644 --- a/src/dialogs/QskDialogSubWindow.cpp +++ b/src/dialogs/QskDialogSubWindow.cpp @@ -15,11 +15,6 @@ #include #endif -QSK_QT_PRIVATE_BEGIN -#include -#include -QSK_QT_PRIVATE_END - #include #include @@ -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" diff --git a/src/dialogs/QskDialogSubWindow.h b/src/dialogs/QskDialogSubWindow.h index 65d5dbf5..8686c331 100644 --- a/src/dialogs/QskDialogSubWindow.h +++ b/src/dialogs/QskDialogSubWindow.h @@ -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;