From 66041bca222752fa9256667212106e433aff9138 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sun, 28 Jul 2019 17:06:50 +0200 Subject: [PATCH] grid layout code improved --- src/layouts/QskGridLayoutEngine.cpp | 3 ++- src/layouts/QskLayoutChain.cpp | 32 +++++++++++++++------- src/layouts/QskLayoutChain.h | 23 +++++----------- src/layouts/QskLayoutEngine2D.cpp | 41 ++++++++++++++++------------- 4 files changed, 54 insertions(+), 45 deletions(-) diff --git a/src/layouts/QskGridLayoutEngine.cpp b/src/layouts/QskGridLayoutEngine.cpp index b8f62f68..a5d420bd 100644 --- a/src/layouts/QskGridLayoutEngine.cpp +++ b/src/layouts/QskGridLayoutEngine.cpp @@ -670,6 +670,7 @@ void QskGridLayoutEngine::setupChain( Qt::Orientation orientation, before adding those that occupy more than one cell */ QVarLengthArray< const Element* > postponed; + postponed.reserve( m_data->elements.size() ); for ( const auto& element : m_data->elements ) { @@ -697,7 +698,7 @@ void QskGridLayoutEngine::setupChain( Qt::Orientation orientation, const auto& settings = m_data->settings( orientation ); for ( const auto& setting : settings.settings() ) - chain.narrowCell( setting.position, setting.cell() ); + chain.shrinkCell( setting.position, setting.cell() ); for ( const auto element : postponed ) { diff --git a/src/layouts/QskLayoutChain.cpp b/src/layouts/QskLayoutChain.cpp index 2d435c94..7f7cbb53 100644 --- a/src/layouts/QskLayoutChain.cpp +++ b/src/layouts/QskLayoutChain.cpp @@ -37,7 +37,7 @@ void QskLayoutChain::reset( int count, qreal constraint ) m_validCells = 0; } -void QskLayoutChain::narrowCell( int index, const CellData& newCell ) +void QskLayoutChain::shrinkCell( int index, const CellData& newCell ) { if ( !newCell.isValid ) return; @@ -58,11 +58,17 @@ void QskLayoutChain::narrowCell( int index, const CellData& newCell ) if ( !newCell.hint.isDefault() ) { - cell.hint.setSizes( - qMax( cell.hint.minimum(), newCell.hint.minimum() ), - qMax( cell.hint.preferred(), newCell.hint.preferred() ), - qMin( cell.hint.maximum(), newCell.hint.maximum() ) - ); + auto& hint = cell.hint; + auto& newHint = newCell.hint; + + hint.setMinimum( qMax( hint.minimum(), newHint.minimum() ) ); + hint.setPreferred( qMax( hint.preferred(), newHint.preferred() ) ); + + if ( newHint.maximum() < hint.maximum() ) + { + hint.setMaximum( newHint.maximum() ); + cell.isShrunk = true; + } cell.hint.normalize(); } @@ -244,7 +250,7 @@ QskLayoutChain::Segments QskLayoutChain::segments( qreal size ) const qreal offset = 0.0; qreal extra = 0.0;; - switch( m_extraSpacingAt ) + switch( m_fillMode ) { case Leading: offset = padding; @@ -290,9 +296,17 @@ QskLayoutChain::Segments QskLayoutChain::distributed( fillSpacing = m_spacing; segment.start = offset; - segment.length = cell.hint.size( which ) + extra; - offset += segment.length; + if ( which == Qt::MaximumSize && cell.isShrunk ) + { + segment.length = cell.hint.size( which ); + offset += segment.length + extra; + } + else + { + segment.length = cell.hint.size( which ) + extra; + offset += segment.length; + } } } diff --git a/src/layouts/QskLayoutChain.h b/src/layouts/QskLayoutChain.h index d267288f..1abab8f8 100644 --- a/src/layouts/QskLayoutChain.h +++ b/src/layouts/QskLayoutChain.h @@ -29,19 +29,6 @@ class QskLayoutChain class CellData { public: - inline bool operator==( const CellData& other ) const - { - return ( isValid == other.isValid ) - && ( canGrow == other.canGrow ) - && ( stretch == other.stretch ) - && ( hint == other.hint ); - } - - inline bool operator!=( const CellData& other ) const - { - return !( *this == other ); - } - inline qreal size( int which ) const { return hint.size( which ); @@ -56,10 +43,11 @@ class QskLayoutChain int stretch = 0; bool canGrow = false; + bool isShrunk = false; bool isValid = false; }; - enum ExtraSpacing + enum FillMode { Leading = 1 << 0, Trailing = 1 << 1 @@ -73,7 +61,7 @@ class QskLayoutChain void reset( int count, qreal constraint ); void expandCell( int index, const CellData& ); void expandCells( int start, int end, const CellData& ); - void narrowCell( int index, const CellData& ); + void shrinkCell( int index, const CellData& ); void finish(); const CellData& cell( int index ) const { return m_cells[ index ]; } @@ -81,7 +69,8 @@ class QskLayoutChain bool setSpacing( qreal spacing ); qreal spacing() const { return m_spacing; } - void setExtraSpacingAt( int extraSpacingAt ) { m_extraSpacingAt = extraSpacingAt; } + void setFillMode( int mode ) { m_fillMode = mode; } + int fillMode() const { return m_fillMode; } Segments segments( qreal size ) const; QskLayoutHint boundingHint() const { return m_boundingHint; } @@ -98,7 +87,7 @@ class QskLayoutChain qreal m_constraint = -2.0; qreal m_spacing = 0; - int m_extraSpacingAt; + int m_fillMode = 0; int m_sumStretches = 0; int m_validCells = 0; diff --git a/src/layouts/QskLayoutEngine2D.cpp b/src/layouts/QskLayoutEngine2D.cpp index edaf0008..d1116be9 100644 --- a/src/layouts/QskLayoutEngine2D.cpp +++ b/src/layouts/QskLayoutEngine2D.cpp @@ -130,7 +130,6 @@ Qt::Alignment QskLayoutEngine2D::defaultAlignment() const return static_cast< Qt::Alignment >( m_data->defaultAlignment ); } - qreal QskLayoutEngine2D::defaultSpacing( Qt::Orientation ) const { return 5.0; // should be from the skin @@ -168,27 +167,33 @@ bool QskLayoutEngine2D::setExtraSpacingAt( Qt::Edges edges ) m_data->extraSpacingAt = edges; - int value = 0; + { + int fillMode = 0; - if ( edges & Qt::LeftEdge ) - value |= QskLayoutChain::Leading; + if ( edges & Qt::LeftEdge ) + fillMode |= QskLayoutChain::Leading; - if ( edges & Qt::RightEdge ) - value |= QskLayoutChain::Trailing; + if ( edges & Qt::RightEdge ) + fillMode |= QskLayoutChain::Trailing; - m_data->columnChain.setExtraSpacingAt( value ); + m_data->columnChain.setFillMode( fillMode ); + } - value = 0; + { + int fillMode = 0; - if ( edges & Qt::TopEdge ) - value |= QskLayoutChain::Leading; + if ( edges & Qt::TopEdge ) + fillMode |= QskLayoutChain::Leading; - if ( edges & Qt::BottomEdge ) - value |= QskLayoutChain::Trailing; + if ( edges & Qt::BottomEdge ) + fillMode |= QskLayoutChain::Trailing; - m_data->rowChain.setExtraSpacingAt( value ); + m_data->rowChain.setFillMode( fillMode ); + } - invalidate(); + m_data->layoutSize = QSize(); + m_data->rows.clear(); + m_data->columns.clear(); return true; } @@ -357,7 +362,7 @@ void QskLayoutEngine2D::setupChain( Qt::Orientation orientation, void QskLayoutEngine2D::updateSegments( const QSizeF& size ) const { auto& rowChain = m_data->rowChain; - auto& colLine = m_data->columnChain; + auto& columnChain = m_data->columnChain; auto& rows = m_data->rows; auto& columns = m_data->columns; @@ -372,14 +377,14 @@ void QskLayoutEngine2D::updateSegments( const QSizeF& size ) const rows = rowChain.segments( size.height() ); setupChain( Qt::Horizontal, rows ); - columns = colLine.segments( size.width() ); + columns = columnChain.segments( size.width() ); break; } case QskLayoutConstraint::HeightForWidth: { setupChain( Qt::Horizontal ); - columns = colLine.segments( size.width() ); + columns = columnChain.segments( size.width() ); setupChain( Qt::Vertical, m_data->columns ); rows = rowChain.segments( size.height() ); @@ -389,7 +394,7 @@ void QskLayoutEngine2D::updateSegments( const QSizeF& size ) const default: { setupChain( Qt::Horizontal ); - columns = colLine.segments( size.width() ); + columns = columnChain.segments( size.width() ); setupChain( Qt::Vertical ); rows = rowChain.segments( size.height() );