diff --git a/src/libcalamaresui/viewpages/ViewStep.cpp b/src/libcalamaresui/viewpages/ViewStep.cpp index b5525d365..2629560d4 100644 --- a/src/libcalamaresui/viewpages/ViewStep.cpp +++ b/src/libcalamaresui/viewpages/ViewStep.cpp @@ -36,6 +36,11 @@ ViewStep::prettyStatus() const return QString(); } +QWidget* +ViewStep::createSummaryWidget() const +{ + return nullptr; +} void ViewStep::onActivate() diff --git a/src/libcalamaresui/viewpages/ViewStep.h b/src/libcalamaresui/viewpages/ViewStep.h index 1bdf78e0b..8da845ee0 100644 --- a/src/libcalamaresui/viewpages/ViewStep.h +++ b/src/libcalamaresui/viewpages/ViewStep.h @@ -37,6 +37,12 @@ public: virtual QString prettyName() const = 0; virtual QString prettyStatus() const; + /** + * Optional. Should return a widget which will be inserted in the summary + * page. The caller takes ownership of the widget. + */ + virtual QWidget* createSummaryWidget() const; + //TODO: we might want to make this a QSharedPointer virtual QWidget* widget() = 0; diff --git a/src/modules/partition/PartitionCoreModule.cpp b/src/modules/partition/PartitionCoreModule.cpp index aa34a2e01..a32961d6e 100644 --- a/src/modules/partition/PartitionCoreModule.cpp +++ b/src/modules/partition/PartitionCoreModule.cpp @@ -349,3 +349,30 @@ PartitionCoreModule::revert() init(); updateIsDirty(); } + +QList< PartitionCoreModule::SummaryInfo > +PartitionCoreModule::createSummaryInfo() const +{ + QList< SummaryInfo > lst; + CoreBackend* backend = CoreBackendManager::self()->backend(); + for ( auto deviceInfo : m_deviceInfos ) + { + if ( !deviceInfo->isDirty() ) + continue; + SummaryInfo summaryInfo; + summaryInfo.deviceName = deviceInfo->device->name(); + + Device* deviceBefore = backend->scanDevice( deviceInfo->device->deviceNode() ); + summaryInfo.partitionModelBefore = new PartitionModel; + summaryInfo.partitionModelBefore->init( deviceBefore ); + // Make deviceBefore a child of partitionModelBefore so that it is not + // leaked (as long as partitionModelBefore is deleted) + deviceBefore->setParent( summaryInfo.partitionModelBefore ); + + summaryInfo.partitionModelAfter = new PartitionModel; + summaryInfo.partitionModelAfter->init( deviceInfo->device.data() ); + + lst << summaryInfo; + } + return lst; +} diff --git a/src/modules/partition/PartitionCoreModule.h b/src/modules/partition/PartitionCoreModule.h index 79d54e5cc..4a29f0994 100644 --- a/src/modules/partition/PartitionCoreModule.h +++ b/src/modules/partition/PartitionCoreModule.h @@ -45,6 +45,13 @@ class PartitionCoreModule : public QObject { Q_OBJECT public: + struct SummaryInfo + { + QString deviceName; + PartitionModel* partitionModelBefore; + PartitionModel* partitionModelAfter; + }; + PartitionCoreModule( QObject* parent = nullptr ); ~PartitionCoreModule(); @@ -80,6 +87,12 @@ public: */ void refreshPartition( Device* device, Partition* partition ); + /** + * Returns a list of SummaryInfo for devices which have pending changes. + * Caller is responsible for deleting the partition models + */ + QList< SummaryInfo > createSummaryInfo() const; + Q_SIGNALS: void hasRootMountPointChanged( bool value ); void isDirtyChanged( bool value ); diff --git a/src/modules/partition/PartitionViewStep.cpp b/src/modules/partition/PartitionViewStep.cpp index 9e16a5e50..f9ebabbe5 100644 --- a/src/modules/partition/PartitionViewStep.cpp +++ b/src/modules/partition/PartitionViewStep.cpp @@ -18,8 +18,15 @@ #include -#include +#include #include +#include +#include +#include + +// Qt +#include +#include PartitionViewStep::PartitionViewStep( QObject* parent ) : Calamares::ViewStep( parent ) @@ -45,6 +52,33 @@ PartitionViewStep::widget() } +QWidget* +PartitionViewStep::createSummaryWidget() const +{ + QWidget* widget = new QWidget; + QFormLayout* layout = new QFormLayout( widget ); + layout->setMargin( 0 ); + + QList< PartitionCoreModule::SummaryInfo > list = m_core->createSummaryInfo(); + for ( const auto& info : list ) + { + PartitionPreview* preview; + + layout->addRow( new QLabel( info.deviceName ) ); + + preview = new PartitionPreview; + preview->setModel( info.partitionModelBefore ); + info.partitionModelBefore->setParent( widget ); + layout->addRow( tr( "Before:" ), preview ); + + preview = new PartitionPreview; + preview->setModel( info.partitionModelAfter ); + info.partitionModelAfter->setParent( widget ); + layout->addRow( tr( "After:" ), preview ); + } + return widget; +} + void PartitionViewStep::next() { diff --git a/src/modules/partition/PartitionViewStep.h b/src/modules/partition/PartitionViewStep.h index 6a3055564..eb2a8e5a4 100644 --- a/src/modules/partition/PartitionViewStep.h +++ b/src/modules/partition/PartitionViewStep.h @@ -37,6 +37,7 @@ public: explicit PartitionViewStep( QObject* parent = 0 ); QString prettyName() const override; + QWidget* createSummaryWidget() const override; QWidget* widget() override; diff --git a/src/modules/summary/SummaryPage.cpp b/src/modules/summary/SummaryPage.cpp index 8ef08e40b..d803a3d61 100644 --- a/src/modules/summary/SummaryPage.cpp +++ b/src/modules/summary/SummaryPage.cpp @@ -24,40 +24,67 @@ #include #include +static const int SECTION_SPACING = 12; SummaryPage::SummaryPage( QWidget* parent ) : QWidget() { - QBoxLayout *mainLayout = new QVBoxLayout; - setLayout( mainLayout ); - - mainLayout->addStretch(); - - m_label = new QLabel( this ); - mainLayout->addWidget( m_label ); - m_label->setWordWrap( true ); - - mainLayout->addStretch(); + QVBoxLayout* layout = new QVBoxLayout( this ); + layout->setContentsMargins( 0, 0, 0, 0 ); } void SummaryPage::onActivate() { + createContentWidget(); + QString text; + bool first = true; foreach ( Calamares::ViewStep* step, Calamares::ViewManager::instance()->prepareSteps() ) { - //TODO: make it nice! - if ( !step->prettyStatus().isEmpty() ) - { - if ( !text.isEmpty() ) - text += "

"; + QString text = step->prettyStatus(); + QWidget* widget = step->createSummaryWidget(); - text += "

" + step->prettyName() + - "


" + step->prettyStatus(); - } + if ( text.isEmpty() && !widget ) + continue; + + if ( first ) + first = false; + else + m_layout->addSpacing( SECTION_SPACING ); + + m_layout->addWidget( createTitleLabel( step->prettyName() ) ); + if ( !text.isEmpty() ) + m_layout->addWidget( createBodyLabel( text ) ); + if ( widget ) + m_layout->addWidget( widget ); } - - m_label->setText( text ); + m_layout->addStretch(); +} + +void +SummaryPage::createContentWidget() +{ + delete m_contentWidget; + m_contentWidget = new QWidget; + m_layout = new QVBoxLayout( m_contentWidget ); + layout()->addWidget( m_contentWidget ); +} + +QLabel* +SummaryPage::createTitleLabel( const QString& text ) const +{ + QLabel* label = new QLabel( text ); + QFont fnt = font(); + fnt.setBold( true ); + label->setFont( fnt ); + return label; +} + +QLabel* +SummaryPage::createBodyLabel( const QString& text ) const +{ + return new QLabel( text ); } diff --git a/src/modules/summary/SummaryPage.h b/src/modules/summary/SummaryPage.h index 86afe6958..6e4fa395f 100644 --- a/src/modules/summary/SummaryPage.h +++ b/src/modules/summary/SummaryPage.h @@ -22,6 +22,7 @@ #include class QLabel; +class QVBoxLayout; class SummaryPage : public QWidget { @@ -32,7 +33,12 @@ public: void onActivate(); private: - QLabel* m_label; + QVBoxLayout* m_layout = nullptr; + QWidget* m_contentWidget = nullptr; + + void createContentWidget(); + QLabel* createTitleLabel( const QString& text ) const; + QLabel* createBodyLabel( const QString& text ) const; }; #endif // SUMMARYPAGE_H