QskItem::polishOnParentResize flag introduced
This commit is contained in:
parent
fc1ed926e6
commit
36fab6a9c2
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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;
|
||||
|
||||
|
@ -17,6 +17,7 @@ QskItemPrivate::QskItemPrivate()
|
||||
: updateFlags( QskSetup::updateFlags() )
|
||||
, updateFlagsMask( 0 )
|
||||
, polishOnResize( false )
|
||||
, polishOnParentResize( false )
|
||||
, blockedPolish( false )
|
||||
, blockedImplicitSize( true )
|
||||
, clearPreviousNodes( false )
|
||||
|
@ -51,6 +51,7 @@ class QskItemPrivate : public QQuickItemPrivate
|
||||
quint8 updateFlagsMask;
|
||||
|
||||
bool polishOnResize : 1;
|
||||
bool polishOnParentResize : 1;
|
||||
|
||||
bool blockedPolish : 1;
|
||||
bool blockedImplicitSize : 1;
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user