From bafaa6a22514b0a8c82a7248f73b3378b55d5c8a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 22 Feb 2016 18:51:44 +0100 Subject: [PATCH] Keep Splitter items on the stack. --- .../partition/gui/PartitionSplitterWidget.cpp | 89 +++++++++---------- .../partition/gui/PartitionSplitterWidget.h | 12 ++- 2 files changed, 52 insertions(+), 49 deletions(-) diff --git a/src/modules/partition/gui/PartitionSplitterWidget.cpp b/src/modules/partition/gui/PartitionSplitterWidget.cpp index 460738820..d96971601 100644 --- a/src/modules/partition/gui/PartitionSplitterWidget.cpp +++ b/src/modules/partition/gui/PartitionSplitterWidget.cpp @@ -33,7 +33,6 @@ #include #include - static const int VIEW_HEIGHT = qMax( CalamaresUtils::defaultFontHeight() + 8, // wins out with big fonts (int)( CalamaresUtils::defaultFontHeight() * 0.6 ) + 22 ); // wins out with small fonts static const int CORNER_RADIUS = 3; @@ -42,8 +41,8 @@ static const int EXTENDED_PARTITION_MARGIN = qMax( 4, VIEW_HEIGHT / 6 ); PartitionSplitterWidget::PartitionSplitterWidget( QWidget* parent ) : QWidget( parent ) , m_resizing( false ) - , m_itemToResize( nullptr ) - , m_itemToResizeNext( nullptr ) + , m_itemToResize( PartitionSplitterItem::null() ) + , m_itemToResizeNext( PartitionSplitterItem::null() ) , m_itemMinSize( 0 ) , m_itemMaxSize( 0 ) , m_itemPrefSize( 0 ) @@ -97,8 +96,8 @@ PartitionSplitterWidget::init( Device* dev, bool drawNestedPartitions ) void PartitionSplitterWidget::setupItems( const QVector& items ) { - m_itemToResize = nullptr; - m_itemToResizeNext = nullptr; + m_itemToResize = PartitionSplitterItem::null(); + m_itemToResizeNext = PartitionSplitterItem::null(); m_itemToResizePath.clear(); m_items.clear(); @@ -128,46 +127,46 @@ PartitionSplitterWidget::setSplitPartition( const QString& path, // We need to remove the itemToResizeNext from wherever it is for ( int i = 0; i < m_items.count(); ++i ) { - if ( m_items[ i ].itemPath == m_itemToResize->itemPath && + if ( m_items[ i ].itemPath == m_itemToResize.itemPath && i + 1 < m_items.count() ) { - m_items[ i ].size = m_items[ i ].size + m_itemToResizeNext->size; + m_items[ i ].size = m_items[ i ].size + m_itemToResizeNext.size; m_items.removeAt( i + 1 ); - m_itemToResizeNext = nullptr; + m_itemToResizeNext = PartitionSplitterItem::null(); break; } else if ( !m_items[ i ].children.isEmpty() ) { for ( int j = 0; j < m_items[ i ].children.count(); ++j ) { - if ( m_items[ i ].children[ j ].itemPath == m_itemToResize->itemPath && + if ( m_items[ i ].children[ j ].itemPath == m_itemToResize.itemPath && j + 1 < m_items[ i ].children.count() ) { m_items[ i ].children[ j ].size = - m_items[ i ].children[ j ].size + m_itemToResizeNext->size; + m_items[ i ].children[ j ].size + m_itemToResizeNext.size; m_items[ i ].children.removeAt( j + 1 ); - m_itemToResizeNext = nullptr; + m_itemToResizeNext = PartitionSplitterItem::null(); break; } } - if ( !m_itemToResizeNext ) + if ( m_itemToResizeNext.isNull() ) break; } } - m_itemToResize = nullptr; + m_itemToResize = PartitionSplitterItem::null(); m_itemToResizePath.clear(); } - PartitionSplitterItem* itemToResize = _findItem( m_items, - [ path ]( PartitionSplitterItem& item ) -> bool + PartitionSplitterItem itemToResize = _findItem( m_items, + [ path ]( PartitionSplitterItem& item ) -> bool { return path == item.itemPath; } ); - if ( !itemToResize ) + if ( itemToResize.isNull() ) return; - cDebug() << "itemToResize:" << itemToResize->itemPath; + cDebug() << "itemToResize:" << itemToResize.itemPath; m_itemToResize = itemToResize; m_itemToResizePath = path; @@ -175,48 +174,48 @@ PartitionSplitterWidget::setSplitPartition( const QString& path, if ( preferredSize > maxSize ) preferredSize = maxSize; - qint64 newSize = m_itemToResize->size - preferredSize; - m_itemToResize->size = preferredSize; + qint64 newSize = m_itemToResize.size - preferredSize; + m_itemToResize.size = preferredSize; m_itemMinSize = minSize; m_itemMaxSize = maxSize; m_itemPrefSize = preferredSize; for ( int i = 0; i < m_items.count(); ++i ) { - if ( m_items[ i ].itemPath == itemToResize->itemPath ) + if ( m_items[ i ].itemPath == itemToResize.itemPath ) { m_items.insert( i+1, { "", QColor( "#c0392b" ), false, newSize, {} } ); - m_itemToResizeNext = &( m_items[ i+1 ] ); + m_itemToResizeNext = m_items[ i+1 ]; break; } else if ( !m_items[ i ].children.isEmpty() ) { for ( int j = 0; j < m_items[ i ].children.count(); ++j ) { - if ( m_items[ i ].children[ j ].itemPath == itemToResize->itemPath ) + if ( m_items[ i ].children[ j ].itemPath == itemToResize.itemPath ) { m_items[ i ].children.insert( j+1, { "", QColor( "#c0392b" ), false, newSize, {} } ); - m_itemToResizeNext = &( m_items[ i ].children[ j+1 ] ); + m_itemToResizeNext = m_items[ i ].children[ j+1 ]; break; } } - if ( m_itemToResizeNext ) + if ( !m_itemToResizeNext.isNull() ) break; } } - emit partitionResized( m_itemToResize->itemPath, - m_itemToResize->size, - m_itemToResizeNext->size ); + emit partitionResized( m_itemToResize.itemPath, + m_itemToResize.size, + m_itemToResizeNext.size ); cDebug() << "Items updated. Status:"; foreach ( const PartitionSplitterItem& item, m_items ) cDebug() << "item" << item.itemPath << "size" << item.size; - cDebug() << "m_itemToResize: " << m_itemToResize << m_itemToResize->itemPath; - cDebug() << "m_itemToResizeNext:" << m_itemToResizeNext << m_itemToResizeNext->itemPath; + cDebug() << "m_itemToResize: " << !m_itemToResize.isNull() << m_itemToResize.itemPath; + cDebug() << "m_itemToResizeNext:" << !m_itemToResizeNext.isNull() << m_itemToResizeNext.itemPath; repaint(); } @@ -227,7 +226,7 @@ PartitionSplitterWidget::splitPartitionSize() const { if ( !m_itemToResize ) return -1; - return m_itemToResize->size; + return m_itemToResize.size; } @@ -236,7 +235,7 @@ PartitionSplitterWidget::newPartitionSize() const { if ( !m_itemToResizeNext ) return -1; - return m_itemToResizeNext->size; + return m_itemToResizeNext.size; } @@ -284,7 +283,7 @@ PartitionSplitterWidget::mouseMoveEvent( QMouseEvent* event ) if ( m_resizing ) { qint64 start = 0; - QString itemPath = m_itemToResize->itemPath; + QString itemPath = m_itemToResize.itemPath; for ( auto it = m_items.constBegin(); it != m_items.constEnd(); ++it ) { @@ -328,16 +327,16 @@ PartitionSplitterWidget::mouseMoveEvent( QMouseEvent* event ) qint64 span = m_itemPrefSize; qreal percent = mx / span; - qint64 oldsize = m_itemToResize->size; + qint64 oldsize = m_itemToResize.size; - m_itemToResize->size = qRound64( span * percent ); - m_itemToResizeNext->size -= m_itemToResize->size - oldsize; + m_itemToResize.size = qRound64( span * percent ); + m_itemToResizeNext.size -= m_itemToResize.size - oldsize; repaint(); emit partitionResized( itemPath, - m_itemToResize->size, - m_itemToResizeNext->size ); + m_itemToResize.size, + m_itemToResizeNext.size ); } else { @@ -428,7 +427,7 @@ PartitionSplitterWidget::drawResizeHandle( QPainter* painter, } auto p1 = arrow_offsets[ 0 ]; - if ( m_itemToResize->size > m_itemMinSize ) + if ( m_itemToResize.size > m_itemMinSize ) { auto arrow = QPainterPath( QPointF( x + -1 * p1.first, p1.second ) ); for ( auto p : arrow_offsets ) @@ -436,7 +435,7 @@ PartitionSplitterWidget::drawResizeHandle( QPainter* painter, painter->drawPath( arrow ); } - if ( m_itemToResize->size < m_itemMaxSize ) + if ( m_itemToResize.size < m_itemMaxSize ) { auto arrow = QPainterPath( QPointF( x + p1.first, p1.second ) ); for ( auto p : arrow_offsets ) @@ -493,7 +492,7 @@ PartitionSplitterWidget::drawPartitions( QPainter* painter, row > 0 && !items[ row - 1 ].isFreeSpace && !items[ row - 1 ].itemPath.isEmpty() && - items[ row - 1 ].itemPath == m_itemToResize->itemPath ) + items[ row - 1 ].itemPath == m_itemToResize.itemPath ) { m_resizeHandleX = x; drawResizeHandle( painter, rect, m_resizeHandleX ); @@ -505,20 +504,20 @@ PartitionSplitterWidget::drawPartitions( QPainter* painter, template < typename F > -PartitionSplitterItem* +PartitionSplitterItem PartitionSplitterWidget::_findItem( QVector< PartitionSplitterItem >& items, F condition ) { for ( auto it = items.begin(); it != items.end(); ++it) { if ( condition( *it ) ) - return &*it; + return *it; - PartitionSplitterItem* candidate = _findItem( it->children, condition ); - if ( candidate ) + PartitionSplitterItem candidate = _findItem( it->children, condition ); + if ( !candidate.isNull() ) return candidate; } - return nullptr; + return PartitionSplitterItem::null(); } diff --git a/src/modules/partition/gui/PartitionSplitterWidget.h b/src/modules/partition/gui/PartitionSplitterWidget.h index fe039fd27..71756dd37 100644 --- a/src/modules/partition/gui/PartitionSplitterWidget.h +++ b/src/modules/partition/gui/PartitionSplitterWidget.h @@ -31,6 +31,11 @@ struct PartitionSplitterItem qint64 size; QVector< PartitionSplitterItem > children; + + static PartitionSplitterItem null() { return { QString(), QColor(), false, 0 }; } + + bool isNull() const { return itemPath.isEmpty() && size == 0; } + operator bool() const { return !isNull(); } }; class PartitionSplitterWidget : public QWidget @@ -75,16 +80,15 @@ private: int x ); template < typename F > - PartitionSplitterItem* _findItem( QVector< PartitionSplitterItem >& items, - F condition ); + PartitionSplitterItem _findItem( QVector< PartitionSplitterItem >& items, F condition ); QPair< QVector< PartitionSplitterItem >, qreal > computeItemsVector( const QVector< PartitionSplitterItem >& originalItems ) const; QVector< PartitionSplitterItem > m_items; QString m_itemToResizePath; - PartitionSplitterItem* m_itemToResize; - PartitionSplitterItem* m_itemToResizeNext; + PartitionSplitterItem m_itemToResize; + PartitionSplitterItem m_itemToResizeNext; qint64 m_itemMinSize; qint64 m_itemMaxSize;