From 906019facc1a8032114397c986b2d9bb69133c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20G=C3=A2teau?= Date: Tue, 22 Jul 2014 10:42:50 +0200 Subject: [PATCH] Add combo box to pick boot loader installation destination --- src/modules/partition/CreatePartitionJob.cpp | 6 +- src/modules/partition/PartitionCoreModule.cpp | 62 +++++++++++++++++++ src/modules/partition/PartitionCoreModule.h | 14 +++++ src/modules/partition/PartitionPage.cpp | 1 + src/modules/partition/PartitionPage.ui | 50 +++++++++++++++ 5 files changed, 130 insertions(+), 3 deletions(-) diff --git a/src/modules/partition/CreatePartitionJob.cpp b/src/modules/partition/CreatePartitionJob.cpp index e5073cb07..02a0950c3 100644 --- a/src/modules/partition/CreatePartitionJob.cpp +++ b/src/modules/partition/CreatePartitionJob.cpp @@ -45,9 +45,9 @@ QString CreatePartitionJob::prettyName() const { return tr( "Create partition (file system: %1, size: %2 MB) on %3." ) - .arg( m_partition->fileSystem().name() ) - .arg( m_partition->capacity() / 1024 / 1024 ) - .arg( m_device->name() ); + .arg( m_partition->fileSystem().name() ) + .arg( m_partition->capacity() / 1024 / 1024 ) + .arg( m_device->name() ); } Calamares::JobResult diff --git a/src/modules/partition/PartitionCoreModule.cpp b/src/modules/partition/PartitionCoreModule.cpp index 474a4f807..04e6d0e31 100644 --- a/src/modules/partition/PartitionCoreModule.cpp +++ b/src/modules/partition/PartitionCoreModule.cpp @@ -36,6 +36,9 @@ #include #include +// Qt +#include + class PartitionIterator { public: @@ -149,6 +152,7 @@ PartitionCoreModule::DeviceInfo::forgetChanges() PartitionCoreModule::PartitionCoreModule( QObject* parent ) : QObject( parent ) , m_deviceModel( new DeviceModel( this ) ) + , m_bootLoaderModel( new QStandardItemModel( this ) ) { // FIXME: Should be done at startup if ( !CalaPM::init() ) @@ -178,6 +182,12 @@ PartitionCoreModule::deviceModel() const return m_deviceModel; } +QAbstractItemModel* +PartitionCoreModule::bootLoaderModel() const +{ + return m_bootLoaderModel; +} + PartitionModel* PartitionCoreModule::partitionModelForDevice( Device* device ) const { @@ -322,6 +332,7 @@ PartitionCoreModule::refresh( Device* device ) Q_ASSERT( model ); model->reload(); updateHasRootMountPoint(); + updateBootLoaderModel(); } void PartitionCoreModule::updateHasRootMountPoint() @@ -352,3 +363,54 @@ PartitionCoreModule::infoForDevice( Device* device ) const } return nullptr; } + +static QStandardItem* +createBootLoaderItem( const QString& description, const QString& path ) +{ + QString text = PartitionCoreModule::tr( "%1 (%2)" ) + .arg( description ) + .arg( path ); + QStandardItem* item = new QStandardItem( text ); + item->setData( path, PartitionCoreModule::BootLoaderPathRole ); + return item; +} + +void +PartitionCoreModule::updateBootLoaderModel() +{ + m_bootLoaderModel->clear(); + // Can contain up to 2 entries: + // - MBR of disk which contains /boot or / + // - /boot or / partition + QString partitionText; + Partition* partition = findPartitionByMountPoint( "/boot" ); + if ( partition ) + partitionText = tr( "Boot Partition" ); + else + { + partition = findPartitionByMountPoint( "/" ); + if ( partition ) + partitionText = tr( "System Partition" ); + else + return; + } + m_bootLoaderModel->appendRow( + createBootLoaderItem( tr( "Master Boot Record" ), partition->devicePath() ) + ); + m_bootLoaderModel->appendRow( + createBootLoaderItem( partitionText, partition->partitionPath() ) + ); +} + +Partition* +PartitionCoreModule::findPartitionByMountPoint( const QString& mountPoint ) const +{ + for ( auto deviceInfo : m_deviceInfos ) + { + Device* device = deviceInfo->device.data(); + for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it ) + if ( PartitionInfo::mountPoint( *it ) == mountPoint ) + return *it; + } + return nullptr; +} diff --git a/src/modules/partition/PartitionCoreModule.h b/src/modules/partition/PartitionCoreModule.h index b589d1003..a1db8c57f 100644 --- a/src/modules/partition/PartitionCoreModule.h +++ b/src/modules/partition/PartitionCoreModule.h @@ -35,6 +35,8 @@ class DeviceModel; class FileSystem; class Partition; +class QStandardItemModel; + /** * Owns the Qt models and the PM devices */ @@ -42,6 +44,11 @@ class PartitionCoreModule : public QObject { Q_OBJECT public: + enum + { + BootLoaderPathRole = Qt::UserRole + 1 + }; + PartitionCoreModule( QObject* parent = nullptr ); ~PartitionCoreModule(); @@ -49,6 +56,8 @@ public: PartitionModel* partitionModelForDevice( Device* device ) const; + QAbstractItemModel* bootLoaderModel() const; + void createPartitionTable( Device* device, PartitionTable::TableType type ); void createPartition( Device* device, Partition* partition ); @@ -88,6 +97,7 @@ private: QList< DeviceInfo* > m_deviceInfos; DeviceModel* m_deviceModel; + QStandardItemModel* m_bootLoaderModel; bool m_hasRootMountPoint = false; void listDevices(); @@ -96,6 +106,10 @@ private: void dumpQueue() const; DeviceInfo* infoForDevice( Device* ) const; + + void updateBootLoaderModel(); + + Partition* findPartitionByMountPoint( const QString& mountPoint ) const; }; #endif /* PARTITIONCOREMODULE_H */ diff --git a/src/modules/partition/PartitionPage.cpp b/src/modules/partition/PartitionPage.cpp index 5f53b6872..cc28c1e01 100644 --- a/src/modules/partition/PartitionPage.cpp +++ b/src/modules/partition/PartitionPage.cpp @@ -46,6 +46,7 @@ PartitionPage::PartitionPage( PartitionCoreModule* core, QWidget* parent ) { m_ui->setupUi( this ); m_ui->deviceComboBox->setModel( m_core->deviceModel() ); + m_ui->bootLoaderComboBox->setModel( m_core->bootLoaderModel() ); updateButtons(); connect( m_ui->deviceComboBox, &QComboBox::currentTextChanged, diff --git a/src/modules/partition/PartitionPage.ui b/src/modules/partition/PartitionPage.ui index bcb43a7ed..7d99314d8 100644 --- a/src/modules/partition/PartitionPage.ui +++ b/src/modules/partition/PartitionPage.ui @@ -112,6 +112,56 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 24 + + + + + + + + + + Install boot loader on: + + + bootLoaderComboBox + + + + + + + QComboBox::AdjustToContents + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + +