From 0ea6f1698bc5e3cce2b21b9ca6dfd80b011a0964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20G=C3=A2teau?= Date: Tue, 29 Jul 2014 13:37:32 +0200 Subject: [PATCH] First version of PartitionPreview --- src/modules/partition/CMakeLists.txt | 1 + src/modules/partition/PartitionPage.cpp | 1 + src/modules/partition/PartitionPage.ui | 14 +- src/modules/partition/PartitionPreview.cpp | 157 +++++++++++++++++++++ src/modules/partition/PartitionPreview.h | 56 ++++++++ 5 files changed, 224 insertions(+), 5 deletions(-) create mode 100644 src/modules/partition/PartitionPreview.cpp create mode 100644 src/modules/partition/PartitionPreview.h diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt index 984e23ce3..92072b520 100644 --- a/src/modules/partition/CMakeLists.txt +++ b/src/modules/partition/CMakeLists.txt @@ -38,6 +38,7 @@ calamares_add_plugin( partition PartitionModel.cpp PartitionPage.cpp PartitionViewStep.cpp + PartitionPreview.cpp PMUtils.cpp UI CreatePartitionDialog.ui diff --git a/src/modules/partition/PartitionPage.cpp b/src/modules/partition/PartitionPage.cpp index 393cb7561..88eb247b0 100644 --- a/src/modules/partition/PartitionPage.cpp +++ b/src/modules/partition/PartitionPage.cpp @@ -254,6 +254,7 @@ PartitionPage::updateFromCurrentDevice() disconnect( oldModel, 0, this, 0 ); PartitionModel* model = m_core->partitionModelForDevice( device ); + m_ui->partitionPreview->setModel( model ); m_ui->partitionTreeView->setModel( model ); m_ui->partitionTreeView->expandAll(); diff --git a/src/modules/partition/PartitionPage.ui b/src/modules/partition/PartitionPage.ui index 40ca567b4..777b6f939 100644 --- a/src/modules/partition/PartitionPage.ui +++ b/src/modules/partition/PartitionPage.ui @@ -55,11 +55,7 @@ - - - [Disk preview goes here] - - + @@ -177,6 +173,14 @@ + + + PartitionPreview + QFrame +
PartitionPreview.h
+ 1 +
+
deviceComboBox revertButton diff --git a/src/modules/partition/PartitionPreview.cpp b/src/modules/partition/PartitionPreview.cpp new file mode 100644 index 000000000..05b01f8c8 --- /dev/null +++ b/src/modules/partition/PartitionPreview.cpp @@ -0,0 +1,157 @@ +/* === This file is part of Calamares - === + * + * Copyright 2014, Aurélien Gâteau + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ +#include + +#include + +// Qt +#include +#include + + +static const int VIEW_HEIGHT = 40; +static const int EXTENDED_PARTITION_MARGIN = 4; + + +PartitionPreview::PartitionPreview( QWidget* parent ) + : QAbstractItemView( parent ) +{ + setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); + setFrameStyle( QFrame::NoFrame ); +} + +PartitionPreview::~PartitionPreview() +{ +} + +QSize +PartitionPreview::sizeHint() const +{ + return QSize( -1, VIEW_HEIGHT ); +} + +void +PartitionPreview::paintEvent( QPaintEvent* event ) +{ + QPainter painter( viewport() ); + painter.fillRect( rect(), Qt::red ); + drawPartitions( &painter, rect(), QModelIndex() ); +} + +void +PartitionPreview::drawPartitions( QPainter* painter, const QRect& rect, const QModelIndex& parent ) +{ + QAbstractItemModel* modl = model(); + if ( !modl ) + return; + const int count = modl->rowCount( parent ); + const int totalWidth = rect.width(); + struct Item { + qreal size; + QColor color; + QModelIndex index; + }; + QVector< Item > items( count ); + qreal total = 0; + for ( int row = 0; row < count; ++row ) + { + QModelIndex index = modl->index( row, 0, parent ); + qreal size = index.data( PartitionModel::SizeRole ).toLongLong(); + QColor color = index.data( Qt::DecorationRole ).value< QColor >(); + total += size; + items[ row ] = { size, color, index }; + } + + int x = rect.x(); + for ( int row = 0; row < count; ++row ) + { + const auto& item = items[ row ]; + int width; + if ( row < count - 1 ) + width = totalWidth * ( item.size / total ); + else + // Make sure we fill the last pixel column + width = rect.right() - x + 1; + + painter->fillRect( x, rect.y(), width, rect.height(), item.color ); + if ( modl->hasChildren( item.index ) ) + { + QRect subRect( + x + EXTENDED_PARTITION_MARGIN, + rect.y() + EXTENDED_PARTITION_MARGIN, + width - 2 * EXTENDED_PARTITION_MARGIN, + rect.height() - 2 * EXTENDED_PARTITION_MARGIN + ); + drawPartitions( painter, subRect, item.index ); + } + x += width; + } +} + +QModelIndex +PartitionPreview::indexAt( const QPoint& point ) const +{ + return QModelIndex(); +} + +QRect +PartitionPreview::visualRect( const QModelIndex& index ) const +{ + return QRect(); +} + +QRegion +PartitionPreview::visualRegionForSelection( const QItemSelection& selection ) const +{ + return QRegion(); +} + +int +PartitionPreview::horizontalOffset() const +{ + return 0; +} + +int +PartitionPreview::verticalOffset() const +{ + return 0; +} + +void +PartitionPreview::scrollTo( const QModelIndex& index, ScrollHint hint ) +{ +} + +QModelIndex +PartitionPreview::moveCursor( CursorAction cursorAction, Qt::KeyboardModifiers modifiers ) +{ + return QModelIndex(); +} + +bool +PartitionPreview::isIndexHidden( const QModelIndex& index ) const +{ + return false; +} + +void +PartitionPreview::setSelection( const QRect& rect, QItemSelectionModel::SelectionFlags flags ) +{ +} + diff --git a/src/modules/partition/PartitionPreview.h b/src/modules/partition/PartitionPreview.h new file mode 100644 index 000000000..39d00bada --- /dev/null +++ b/src/modules/partition/PartitionPreview.h @@ -0,0 +1,56 @@ +/* === This file is part of Calamares - === + * + * Copyright 2014, Aurélien Gâteau + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ +#ifndef PARTITIONPREVIEW_H +#define PARTITIONPREVIEW_H + +#include + +class PartitionPreview : public QAbstractItemView +{ +public: + explicit PartitionPreview( QWidget* parent = 0 ); + ~PartitionPreview(); + + QSize minimumSizeHint() const override + { + return sizeHint(); + } + + QSize sizeHint() const override; + + void paintEvent( QPaintEvent* event ) override; + + // QAbstractItemView API + QModelIndex indexAt( const QPoint& point ) const override; + QRect visualRect( const QModelIndex& index ) const override; + void scrollTo( const QModelIndex& index, ScrollHint hint = EnsureVisible ) override; + +protected: + // QAbstractItemView API + QRegion visualRegionForSelection( const QItemSelection& selection ) const override; + int horizontalOffset() const override; + int verticalOffset() const override; + bool isIndexHidden( const QModelIndex& index ) const override; + QModelIndex moveCursor( CursorAction cursorAction, Qt::KeyboardModifiers modifiers ) override; + void setSelection( const QRect& rect, QItemSelectionModel::SelectionFlags flags ) override; + +private: + void drawPartitions( QPainter* painter, const QRect& rect, const QModelIndex& parent ); +}; + +#endif /* PARTITIONPREVIEW_H */