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
+
+ 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 */