QskItem::polishOnParentResize flag introduced
This commit is contained in:
parent
fc1ed926e6
commit
36fab6a9c2
|
@ -16,7 +16,6 @@
|
||||||
|
|
||||||
QSK_QT_PRIVATE_BEGIN
|
QSK_QT_PRIVATE_BEGIN
|
||||||
#include <private/qquickitem_p.h>
|
#include <private/qquickitem_p.h>
|
||||||
#include <private/qquickitemchangelistener_p.h>
|
|
||||||
QSK_QT_PRIVATE_END
|
QSK_QT_PRIVATE_END
|
||||||
|
|
||||||
QSK_SUBCONTROL( QskDrawer, Panel )
|
QSK_SUBCONTROL( QskDrawer, Panel )
|
||||||
|
@ -110,52 +109,6 @@ static QPointF qskDrawerTranslation( const QskDrawer* drawer, const QSizeF& size
|
||||||
|
|
||||||
namespace
|
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
|
class GestureRecognizer : public QskPanGestureRecognizer
|
||||||
{
|
{
|
||||||
using Inherited = 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;
|
GestureRecognizer* gestureRecognizer = nullptr;
|
||||||
|
|
||||||
qreal dragMargin = qskDefaultDragMargin();
|
qreal dragMargin = qskDefaultDragMargin();
|
||||||
|
@ -235,6 +178,7 @@ class QskDrawer::PrivateData
|
||||||
QskDrawer::QskDrawer( QQuickItem* parentItem )
|
QskDrawer::QskDrawer( QQuickItem* parentItem )
|
||||||
: QskDrawer( Qt::LeftEdge, parentItem )
|
: QskDrawer( Qt::LeftEdge, parentItem )
|
||||||
{
|
{
|
||||||
|
setPolishOnParentResize( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
QskDrawer::QskDrawer( Qt::Edge edge, QQuickItem* parentItem )
|
QskDrawer::QskDrawer( Qt::Edge edge, QQuickItem* parentItem )
|
||||||
|
@ -262,7 +206,6 @@ QskDrawer::QskDrawer( Qt::Edge edge, QQuickItem* parentItem )
|
||||||
|
|
||||||
QskDrawer::~QskDrawer()
|
QskDrawer::~QskDrawer()
|
||||||
{
|
{
|
||||||
delete m_data->listener;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Qt::Edge QskDrawer::edge() const
|
Qt::Edge QskDrawer::edge() const
|
||||||
|
@ -361,12 +304,6 @@ void QskDrawer::itemChange( QQuickItem::ItemChange change,
|
||||||
if ( parentItem() && isInteractive() )
|
if ( parentItem() && isInteractive() )
|
||||||
qskCatchMouseEvents( parentItem() );
|
qskCatchMouseEvents( parentItem() );
|
||||||
|
|
||||||
m_data->resetListener( this );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case QQuickItem::ItemVisibleHasChanged:
|
|
||||||
{
|
|
||||||
m_data->resetListener( this );
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,8 @@ QSK_QT_PRIVATE_BEGIN
|
||||||
#include <private/qquickpositioners_p.h>
|
#include <private/qquickpositioners_p.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <private/qquickitemchangelistener_p.h>
|
||||||
|
|
||||||
QSK_QT_PRIVATE_END
|
QSK_QT_PRIVATE_END
|
||||||
|
|
||||||
#endif
|
#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( QskItemRegistry, qskRegistry )
|
||||||
Q_GLOBAL_STATIC( QskWindowStore, qskReleasedWindowCounter )
|
Q_GLOBAL_STATIC( QskWindowStore, qskReleasedWindowCounter )
|
||||||
|
Q_GLOBAL_STATIC( QskParentListener, qskParentListener )
|
||||||
|
|
||||||
QskItem::QskItem( QskItemPrivate& dd, QQuickItem* parent )
|
QskItem::QskItem( QskItemPrivate& dd, QQuickItem* parent )
|
||||||
: QQuickItem( dd, parent )
|
: QQuickItem( dd, parent )
|
||||||
|
@ -418,6 +484,30 @@ bool QskItem::polishOnResize() const
|
||||||
return d_func()->polishOnResize;
|
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
|
bool QskItem::layoutMirroring() const
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
|
@ -894,9 +984,13 @@ void QskItem::itemChange( QQuickItem::ItemChange change,
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
case QQuickItem::ItemParentHasChanged:
|
case QQuickItem::ItemParentHasChanged:
|
||||||
|
{
|
||||||
|
if( polishOnParentResize() && qskParentListener )
|
||||||
|
qskParentListener->update( parentItem() );
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
case QQuickItem::ItemChildAddedChange:
|
case QQuickItem::ItemChildAddedChange:
|
||||||
case QQuickItem::ItemChildRemovedChange:
|
case QQuickItem::ItemChildRemovedChange:
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,6 +26,9 @@ class QSK_EXPORT QskItem : public QQuickItem
|
||||||
Q_PROPERTY( bool polishOnResize READ polishOnResize
|
Q_PROPERTY( bool polishOnResize READ polishOnResize
|
||||||
WRITE setPolishOnResize NOTIFY itemFlagsChanged FINAL )
|
WRITE setPolishOnResize NOTIFY itemFlagsChanged FINAL )
|
||||||
|
|
||||||
|
Q_PROPERTY( bool polishOnParentResize READ polishOnParentResize
|
||||||
|
WRITE setPolishOnParentResize NOTIFY itemFlagsChanged FINAL )
|
||||||
|
|
||||||
Q_PROPERTY( Qt::FocusPolicy focusPolicy READ focusPolicy
|
Q_PROPERTY( Qt::FocusPolicy focusPolicy READ focusPolicy
|
||||||
WRITE setFocusPolicy NOTIFY focusPolicyChanged )
|
WRITE setFocusPolicy NOTIFY focusPolicyChanged )
|
||||||
|
|
||||||
|
@ -81,6 +84,9 @@ class QSK_EXPORT QskItem : public QQuickItem
|
||||||
void setPolishOnResize( bool );
|
void setPolishOnResize( bool );
|
||||||
bool polishOnResize() const;
|
bool polishOnResize() const;
|
||||||
|
|
||||||
|
void setPolishOnParentResize( bool );
|
||||||
|
bool polishOnParentResize() const;
|
||||||
|
|
||||||
void setFocusPolicy( Qt::FocusPolicy );
|
void setFocusPolicy( Qt::FocusPolicy );
|
||||||
Qt::FocusPolicy focusPolicy() const;
|
Qt::FocusPolicy focusPolicy() const;
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ QskItemPrivate::QskItemPrivate()
|
||||||
: updateFlags( QskSetup::updateFlags() )
|
: updateFlags( QskSetup::updateFlags() )
|
||||||
, updateFlagsMask( 0 )
|
, updateFlagsMask( 0 )
|
||||||
, polishOnResize( false )
|
, polishOnResize( false )
|
||||||
|
, polishOnParentResize( false )
|
||||||
, blockedPolish( false )
|
, blockedPolish( false )
|
||||||
, blockedImplicitSize( true )
|
, blockedImplicitSize( true )
|
||||||
, clearPreviousNodes( false )
|
, clearPreviousNodes( false )
|
||||||
|
|
|
@ -51,6 +51,7 @@ class QskItemPrivate : public QQuickItemPrivate
|
||||||
quint8 updateFlagsMask;
|
quint8 updateFlagsMask;
|
||||||
|
|
||||||
bool polishOnResize : 1;
|
bool polishOnResize : 1;
|
||||||
|
bool polishOnParentResize : 1;
|
||||||
|
|
||||||
bool blockedPolish : 1;
|
bool blockedPolish : 1;
|
||||||
bool blockedImplicitSize : 1;
|
bool blockedImplicitSize : 1;
|
||||||
|
|
|
@ -15,11 +15,6 @@
|
||||||
#include <QskPlatform.h>
|
#include <QskPlatform.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QSK_QT_PRIVATE_BEGIN
|
|
||||||
#include <private/qquickitem_p.h>
|
|
||||||
#include <private/qquickitemchangelistener_p.h>
|
|
||||||
QSK_QT_PRIVATE_END
|
|
||||||
|
|
||||||
#include <qquickwindow.h>
|
#include <qquickwindow.h>
|
||||||
#include <qpointer.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
|
class QskDialogSubWindow::PrivateData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline void resetListener( QskDialogSubWindow* subWindow )
|
|
||||||
{
|
|
||||||
delete listener;
|
|
||||||
listener = nullptr;
|
|
||||||
|
|
||||||
if ( subWindow->parentItem() && subWindow->isVisible() )
|
|
||||||
listener = new GeometryListener( subWindow );
|
|
||||||
}
|
|
||||||
|
|
||||||
QskDialog::Actions actions = QskDialog::NoAction;
|
QskDialog::Actions actions = QskDialog::NoAction;
|
||||||
|
|
||||||
QskTextLabel* titleLabel = nullptr;
|
QskTextLabel* titleLabel = nullptr;
|
||||||
|
@ -99,7 +43,6 @@ class QskDialogSubWindow::PrivateData
|
||||||
QPointer< QQuickItem > contentItem;
|
QPointer< QQuickItem > contentItem;
|
||||||
|
|
||||||
QskLinearBox* layout = nullptr;
|
QskLinearBox* layout = nullptr;
|
||||||
GeometryListener* listener = nullptr;
|
|
||||||
|
|
||||||
QskDialog::DialogCode result = QskDialog::Rejected;
|
QskDialog::DialogCode result = QskDialog::Rejected;
|
||||||
};
|
};
|
||||||
|
@ -115,14 +58,11 @@ QskDialogSubWindow::QskDialogSubWindow( QQuickItem* parent )
|
||||||
QskSizePolicy::MinimumExpanding, QskSizePolicy::Constrained );
|
QskSizePolicy::MinimumExpanding, QskSizePolicy::Constrained );
|
||||||
|
|
||||||
setPolishOnResize( true );
|
setPolishOnResize( true );
|
||||||
|
setPolishOnParentResize( true );
|
||||||
if ( parent )
|
|
||||||
m_data->listener = new GeometryListener( this );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QskDialogSubWindow::~QskDialogSubWindow()
|
QskDialogSubWindow::~QskDialogSubWindow()
|
||||||
{
|
{
|
||||||
delete m_data->listener;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QskDialogSubWindow::addDialogAction( QskDialog::Action action )
|
void QskDialogSubWindow::addDialogAction( QskDialog::Action action )
|
||||||
|
@ -432,7 +372,7 @@ void QskDialogSubWindow::updateGeometry()
|
||||||
QSizeF QskDialogSubWindow::layoutSizeHint(
|
QSizeF QskDialogSubWindow::layoutSizeHint(
|
||||||
Qt::SizeHint which, const QSizeF& constraint ) const
|
Qt::SizeHint which, const QSizeF& constraint ) const
|
||||||
{
|
{
|
||||||
if ( which == Qt::MaximumSize )
|
if ( which == Qt::MaximumSize && polishOnParentResize() )
|
||||||
return 0.9 * parentItem()->size();
|
return 0.9 * parentItem()->size();
|
||||||
|
|
||||||
auto size = m_data->layout->effectiveSizeHint( which, constraint );
|
auto size = m_data->layout->effectiveSizeHint( which, constraint );
|
||||||
|
@ -446,31 +386,4 @@ QSizeF QskDialogSubWindow::layoutSizeHint(
|
||||||
return size;
|
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"
|
#include "moc_QskDialogSubWindow.cpp"
|
||||||
|
|
|
@ -82,8 +82,6 @@ class QSK_EXPORT QskDialogSubWindow : public QskSubWindow
|
||||||
virtual void updateGeometry();
|
virtual void updateGeometry();
|
||||||
|
|
||||||
void updateLayout() override;
|
void updateLayout() override;
|
||||||
void aboutToShow() override;
|
|
||||||
void itemChange( ItemChange, const ItemChangeData& ) override;
|
|
||||||
|
|
||||||
QSizeF layoutSizeHint( Qt::SizeHint, const QSizeF& ) const;
|
QSizeF layoutSizeHint( Qt::SizeHint, const QSizeF& ) const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue