From 8ee2377c76aaac708187782f5ca6b0d24ce455ad Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 16 Sep 2019 12:36:29 +0200 Subject: [PATCH] spacer for grid layouts: qreal -> QSizeF --- src/layouts/QskGridBox.cpp | 2 +- src/layouts/QskGridBox.h | 2 +- src/layouts/QskGridLayoutEngine.cpp | 42 ++++++++++++++++++----------- src/layouts/QskGridLayoutEngine.h | 4 +-- src/layouts/QskLayoutEngine2D.h | 1 - src/layouts/QskLinearLayoutEngine.h | 2 +- 6 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/layouts/QskGridBox.cpp b/src/layouts/QskGridBox.cpp index fcd1169e..e7403556 100644 --- a/src/layouts/QskGridBox.cpp +++ b/src/layouts/QskGridBox.cpp @@ -157,7 +157,7 @@ int QskGridBox::addItem( QQuickItem* item, return index; } -int QskGridBox::addSpacer( qreal spacing, +int QskGridBox::addSpacer( const QSizeF& spacing, int row, int column, int rowSpan, int columnSpan ) { const int index = m_data->engine.insertSpacer( diff --git a/src/layouts/QskGridBox.h b/src/layouts/QskGridBox.h index 49ea4821..b388999d 100644 --- a/src/layouts/QskGridBox.h +++ b/src/layouts/QskGridBox.h @@ -34,7 +34,7 @@ class QSK_EXPORT QskGridBox : public QskBox int addItem( QQuickItem*, int row, int column, int rowSpan, int columnSpan, Qt::Alignment ); - Q_INVOKABLE int addSpacer( qreal spacing, + Q_INVOKABLE int addSpacer( const QSizeF&, int row, int column, int columnSpan = 1, int rowSpan = 1 ); void removeItem( const QQuickItem* ); diff --git a/src/layouts/QskGridLayoutEngine.cpp b/src/layouts/QskGridLayoutEngine.cpp index 74385fd7..eff32810 100644 --- a/src/layouts/QskGridLayoutEngine.cpp +++ b/src/layouts/QskGridLayoutEngine.cpp @@ -158,11 +158,11 @@ namespace { public: Element( QQuickItem*, const QRect& ); - Element( qreal spacing, const QRect& ); + Element( const QSizeF& spacing, const QRect& ); Element& operator=( const Element& ); - qreal spacing() const; + QSizeF spacing() const; QQuickItem* item() const; QRect grid() const; @@ -180,7 +180,7 @@ namespace union { QQuickItem* m_item; - qreal m_spacing; + QSizeF m_spacing; }; QRect m_grid; @@ -195,7 +195,7 @@ Element::Element( QQuickItem* item, const QRect& grid ) { } -Element::Element( qreal spacing, const QRect& grid ) +Element::Element( const QSizeF& spacing, const QRect& grid ) : m_spacing( spacing ) , m_grid( grid ) , m_isSpacer( true ) @@ -216,9 +216,9 @@ Element& Element::operator=( const Element& other ) return *this; } -inline qreal Element::spacing() const +inline QSizeF Element::spacing() const { - return m_isSpacer ? m_spacing : -1.0; + return m_isSpacer ? m_spacing : QSizeF(); } inline QQuickItem* Element::item() const @@ -254,9 +254,12 @@ QskLayoutChain::CellData Element::cell( Qt::Orientation orientation ) const if ( m_isSpacer ) { - cell.hint.setMinimum( m_spacing ); - cell.hint.setPreferred( m_spacing ); - cell.hint.setMaximum( m_spacing ); + const qreal value = ( orientation == Qt::Horizontal ) + ? m_spacing.width() : m_spacing.height(); + + cell.hint.setMinimum( value ); + cell.hint.setPreferred( value ); + cell.hint.setMaximum( value ); } else { @@ -289,7 +292,7 @@ class QskGridLayoutEngine::PrivateData return const_cast< Element* >( &this->elements[index] ); } - int insertElement( QQuickItem* item, qreal spacing, QRect grid ) + int insertElement( QQuickItem* item, QSizeF spacing, QRect grid ) { // -1 means unlimited, while 0 does not make any sense if ( grid.width() == 0 ) @@ -299,9 +302,19 @@ class QskGridLayoutEngine::PrivateData grid.setHeight( 1 ); if ( item ) + { elements.push_back( Element( item, grid ) ); + } else + { + if ( spacing.width() < 0.0 ) + spacing.setWidth( 0.0 ); + + if ( spacing.height() < 0.0 ) + spacing.setHeight( 0.0 ); + elements.push_back( Element( spacing, grid ) ); + } grid = effectiveGrid( elements.back() ); @@ -418,12 +431,11 @@ qreal QskGridLayoutEngine::columnSizeHint( int column, Qt::SizeHint which ) cons int QskGridLayoutEngine::insertItem( QQuickItem* item, const QRect& grid ) { invalidate(); - return m_data->insertElement( item, -1, grid ); + return m_data->insertElement( item, QSizeF(), grid ); } -int QskGridLayoutEngine::insertSpacer( qreal spacing, const QRect& grid ) +int QskGridLayoutEngine::insertSpacer( const QSizeF& spacing, const QRect& grid ) { - spacing = qMax( spacing, 0.0 ); return m_data->insertElement( nullptr, spacing, grid ); } @@ -495,12 +507,12 @@ QQuickItem* QskGridLayoutEngine::itemAt( int index ) const return nullptr; } -qreal QskGridLayoutEngine::spacerAt( int index ) const +QSizeF QskGridLayoutEngine::spacerAt( int index ) const { if ( const auto element = m_data->elementAt( index ) ) return element->spacing(); - return -1.0; + return QSizeF(); } QQuickItem* QskGridLayoutEngine::itemAt( int row, int column ) const diff --git a/src/layouts/QskGridLayoutEngine.h b/src/layouts/QskGridLayoutEngine.h index f68154f0..dd49aa01 100644 --- a/src/layouts/QskGridLayoutEngine.h +++ b/src/layouts/QskGridLayoutEngine.h @@ -34,13 +34,13 @@ class QskGridLayoutEngine : public QskLayoutEngine2D qreal columnSizeHint( int column, Qt::SizeHint ) const; int insertItem( QQuickItem*, const QRect& grid ); - int insertSpacer( qreal spacing, const QRect& grid ); + int insertSpacer( const QSizeF&, const QRect& grid ); bool removeAt( int index ); bool clear(); QQuickItem* itemAt( int index ) const override final; - qreal spacerAt( int index ) const override final; + QSizeF spacerAt( int index ) const; QQuickItem* itemAt( int row, int column ) const; int indexAt( int row, int column ) const; diff --git a/src/layouts/QskLayoutEngine2D.h b/src/layouts/QskLayoutEngine2D.h index bedb44ce..c5b4abe8 100644 --- a/src/layouts/QskLayoutEngine2D.h +++ b/src/layouts/QskLayoutEngine2D.h @@ -25,7 +25,6 @@ class QskLayoutEngine2D virtual int count() const = 0; virtual QQuickItem* itemAt( int index ) const = 0; - virtual qreal spacerAt( int index ) const = 0; int indexOf( const QQuickItem* ) const; diff --git a/src/layouts/QskLinearLayoutEngine.h b/src/layouts/QskLinearLayoutEngine.h index b54a0d40..ada6169c 100644 --- a/src/layouts/QskLinearLayoutEngine.h +++ b/src/layouts/QskLinearLayoutEngine.h @@ -40,7 +40,7 @@ class QskLinearLayoutEngine : public QskLayoutEngine2D bool clear(); QQuickItem* itemAt( int index ) const override final; - qreal spacerAt( int index ) const override final; + qreal spacerAt( int index ) const; bool setStretchFactorAt( int index, int stretchFactor ); int stretchFactorAt( int index ) const;