From fda2e54e0f1cec9cbb95cb71327971ca712c1ad7 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 15 May 2018 05:40:52 -0400 Subject: [PATCH 01/17] [partition] Refactor filling combobox with moint points - Move to one place which handles the standard mount points - While here, introduce explicit "(no mount point)" string into the combo box. This is prep-work for issue #951. --- src/modules/partition/CMakeLists.txt | 1 + .../partition/gui/CreatePartitionDialog.cpp | 8 +--- .../gui/EditExistingPartitionDialog.cpp | 9 +--- src/modules/partition/gui/MountPoints.cpp | 48 +++++++++++++++++++ src/modules/partition/gui/MountPoints.h | 41 ++++++++++++++++ 5 files changed, 94 insertions(+), 13 deletions(-) create mode 100644 src/modules/partition/gui/MountPoints.cpp create mode 100644 src/modules/partition/gui/MountPoints.h diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt index 156ff86f5..dc6735f28 100644 --- a/src/modules/partition/CMakeLists.txt +++ b/src/modules/partition/CMakeLists.txt @@ -38,6 +38,7 @@ if ( KPMcore_FOUND ) gui/DeviceInfoWidget.cpp gui/EditExistingPartitionDialog.cpp gui/EncryptWidget.cpp + gui/MountPoints.cpp gui/PartitionPage.cpp gui/PartitionBarsView.cpp gui/PartitionLabelsView.cpp diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp index 5952a61a1..f790f4d38 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.cpp +++ b/src/modules/partition/gui/CreatePartitionDialog.cpp @@ -23,6 +23,7 @@ #include "core/PartitionInfo.h" #include "core/PartUtils.h" #include "core/KPMHelpers.h" +#include "gui/MountPoints.h" #include "gui/PartitionSizeController.h" #include "ui_CreatePartitionDialog.h" @@ -81,12 +82,7 @@ CreatePartitionDialog::CreatePartitionDialog( Device* device, PartitionNode* par m_ui->lvNameLineEdit->setValidator(validator); } - QStringList mountPoints = { "/", "/boot", "/home", "/opt", "/usr", "/var" }; - if ( PartUtils::isEfiSystem() ) - mountPoints << Calamares::JobQueue::instance()->globalStorage()->value( "efiSystemPartition" ).toString(); - mountPoints.removeDuplicates(); - mountPoints.sort(); - m_ui->mountPointComboBox->addItems( mountPoints ); + standardMountPoints( *(m_ui->mountPointComboBox) ); if ( device->partitionTable()->type() == PartitionTable::msdos || device->partitionTable()->type() == PartitionTable::msdos_sectorbased ) diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp index 2212c104c..e52627fec 100644 --- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp +++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp @@ -28,6 +28,7 @@ #include #include "core/PartUtils.h" #include +#include "gui/MountPoints.h" #include #include @@ -55,13 +56,7 @@ EditExistingPartitionDialog::EditExistingPartitionDialog( Device* device, Partit , m_usedMountPoints( usedMountPoints ) { m_ui->setupUi( this ); - - QStringList mountPoints = { "/", "/boot", "/home", "/opt", "/usr", "/var" }; - if ( PartUtils::isEfiSystem() ) - mountPoints << Calamares::JobQueue::instance()->globalStorage()->value( "efiSystemPartition" ).toString(); - mountPoints.removeDuplicates(); - mountPoints.sort(); - m_ui->mountPointComboBox->addItems( mountPoints ); + standardMountPoints( *(m_ui->mountPointComboBox) ); QColor color = ColorUtils::colorForPartition( m_partition ); m_partitionSizeController->init( m_device, m_partition, color ); diff --git a/src/modules/partition/gui/MountPoints.cpp b/src/modules/partition/gui/MountPoints.cpp new file mode 100644 index 000000000..03de34207 --- /dev/null +++ b/src/modules/partition/gui/MountPoints.cpp @@ -0,0 +1,48 @@ +/* === This file is part of Calamares - === + * + * Copyright 2014, Aurélien Gâteau + * Copyright 2016, Teo Mrnjavac + * Copyright 2018, Adriaan de Groot + * + * 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 "MountPoints.h" + +#include "core/PartUtils.h" + +#include "GlobalStorage.h" +#include "JobQueue.h" + +#include + +QStringList +standardMountPoints() +{ + QStringList mountPoints{ "/", "/boot", "/home", "/opt", "/usr", "/var" }; + if ( PartUtils::isEfiSystem() ) + mountPoints << Calamares::JobQueue::instance()->globalStorage()->value( "efiSystemPartition" ).toString(); + mountPoints.removeDuplicates(); + mountPoints.sort(); + return mountPoints; +} + +void +standardMountPoints(QComboBox& combo) +{ + combo.clear(); + combo.addItem( combo.tr( "(no mount point)" ) ); + combo.addItems( standardMountPoints() ); +} + diff --git a/src/modules/partition/gui/MountPoints.h b/src/modules/partition/gui/MountPoints.h new file mode 100644 index 000000000..d9edd9db4 --- /dev/null +++ b/src/modules/partition/gui/MountPoints.h @@ -0,0 +1,41 @@ +/* === This file is part of Calamares - === + * + * Copyright 2014, Aurélien Gâteau + * Copyright 2016, Teo Mrnjavac + * Copyright 2018, Adriaan de Groot + * + * 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 PARTITION_GUI_MOUNTPOINTS +#define PARTITION_GUI_MOUNTPOINTS + +#include + +class QComboBox; + +/** + * Returns a list of standard mount points (e.g. /, /usr, ...). + * This also includes the EFI mount point if that is necessary + * on the target system. + */ +QStringList standardMountPoints(); + +/** + * Clears the combobox and fills it with "(no mount point)" + * and the elements of standardMountPoints(), above. + */ +void standardMountPoints( QComboBox& ); + +#endif From a4997c4be8798b22b7f41a72694d292fff857624 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 15 May 2018 06:13:19 -0400 Subject: [PATCH 02/17] [partition] Convenience for selecting default mount point - map blank to the "(no mount point)" string for UI purposes --- .../partition/gui/EditExistingPartitionDialog.cpp | 3 +-- src/modules/partition/gui/MountPoints.cpp | 9 +++++++++ src/modules/partition/gui/MountPoints.h | 6 ++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp index e52627fec..51b5a33d7 100644 --- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp +++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp @@ -56,13 +56,12 @@ EditExistingPartitionDialog::EditExistingPartitionDialog( Device* device, Partit , m_usedMountPoints( usedMountPoints ) { m_ui->setupUi( this ); - standardMountPoints( *(m_ui->mountPointComboBox) ); + standardMountPoints( *(m_ui->mountPointComboBox), PartitionInfo::mountPoint( partition ) ); QColor color = ColorUtils::colorForPartition( m_partition ); m_partitionSizeController->init( m_device, m_partition, color ); m_partitionSizeController->setSpinBox( m_ui->sizeSpinBox ); - m_ui->mountPointComboBox->setCurrentText( PartitionInfo::mountPoint( partition ) ); connect( m_ui->mountPointComboBox, &QComboBox::currentTextChanged, this, &EditExistingPartitionDialog::checkMountPointSelection ); diff --git a/src/modules/partition/gui/MountPoints.cpp b/src/modules/partition/gui/MountPoints.cpp index 03de34207..6d8dc6e04 100644 --- a/src/modules/partition/gui/MountPoints.cpp +++ b/src/modules/partition/gui/MountPoints.cpp @@ -46,3 +46,12 @@ standardMountPoints(QComboBox& combo) combo.addItems( standardMountPoints() ); } +void +standardMountPoints(QComboBox& combo, const QString& selected) +{ + standardMountPoints( combo ); + if ( selected.isEmpty() ) + combo.setCurrentIndex( 0 ); + else + combo.setCurrentText( selected ); +} diff --git a/src/modules/partition/gui/MountPoints.h b/src/modules/partition/gui/MountPoints.h index d9edd9db4..c91f24e6d 100644 --- a/src/modules/partition/gui/MountPoints.h +++ b/src/modules/partition/gui/MountPoints.h @@ -38,4 +38,10 @@ QStringList standardMountPoints(); */ void standardMountPoints( QComboBox& ); +/** + * As above, but also sets the displayed mount point to @p selected, + * unless it is empty, in which case "(no mount point)" is chosen. + */ +void standardMountPoints( QComboBox&, const QString& selected ); + #endif From a49c39bb534e9cef0789107cadb27d7e92c4b06c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 15 May 2018 06:30:18 -0400 Subject: [PATCH 03/17] [partition] Unmap mount-point special strings - Reverse "(no mount point)" to the empty string - Provide convenience pointer-taking function --- src/modules/partition/gui/CreatePartitionDialog.cpp | 6 ++---- .../partition/gui/EditExistingPartitionDialog.cpp | 6 ++---- src/modules/partition/gui/MountPoints.cpp | 10 ++++++++++ src/modules/partition/gui/MountPoints.h | 10 ++++++++++ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp index f790f4d38..ee2db315f 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.cpp +++ b/src/modules/partition/gui/CreatePartitionDialog.cpp @@ -242,7 +242,7 @@ CreatePartitionDialog::createPartition() partition->setPartitionPath(m_device->deviceNode() + QStringLiteral("/") + m_ui->lvNameLineEdit->text().trimmed()); } - PartitionInfo::setMountPoint( partition, m_ui->mountPointComboBox->currentText() ); + PartitionInfo::setMountPoint( partition, selectedMountPoint( m_ui->mountPointComboBox ) ); PartitionInfo::setFormat( partition, true ); return partition; @@ -279,9 +279,7 @@ CreatePartitionDialog::updateMountPointUi() void CreatePartitionDialog::checkMountPointSelection() { - const QString& selection = m_ui->mountPointComboBox->currentText(); - - if ( m_usedMountPoints.contains( selection ) ) + if ( m_usedMountPoints.contains( selectedMountPoint( m_ui->mountPointComboBox ) ) ) { m_ui->labelMountPoint->setText( tr( "Mountpoint already in use. Please select another one." ) ); m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( false ); diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp index 51b5a33d7..aa066cac2 100644 --- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp +++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp @@ -154,7 +154,7 @@ EditExistingPartitionDialog::setupFlagsList() void EditExistingPartitionDialog::applyChanges( PartitionCoreModule* core ) { - PartitionInfo::setMountPoint( m_partition, m_ui->mountPointComboBox->currentText() ); + PartitionInfo::setMountPoint( m_partition, selectedMountPoint(m_ui->mountPointComboBox) ); qint64 newFirstSector = m_partitionSizeController->firstSector(); qint64 newLastSector = m_partitionSizeController->lastSector(); @@ -294,9 +294,7 @@ EditExistingPartitionDialog::updateMountPointPicker() void EditExistingPartitionDialog::checkMountPointSelection() { - const QString& selection = m_ui->mountPointComboBox->currentText(); - - if ( m_usedMountPoints.contains( selection ) ) + if ( m_usedMountPoints.contains( selectedMountPoint( m_ui->mountPointComboBox ) ) ) { m_ui->labelMountPoint->setText( tr( "Mountpoint already in use. Please select another one." ) ); m_ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( false ); diff --git a/src/modules/partition/gui/MountPoints.cpp b/src/modules/partition/gui/MountPoints.cpp index 6d8dc6e04..301773957 100644 --- a/src/modules/partition/gui/MountPoints.cpp +++ b/src/modules/partition/gui/MountPoints.cpp @@ -24,6 +24,7 @@ #include "GlobalStorage.h" #include "JobQueue.h" +#include "utils/Logger.h" #include @@ -55,3 +56,12 @@ standardMountPoints(QComboBox& combo, const QString& selected) else combo.setCurrentText( selected ); } + +QString +selectedMountPoint(QComboBox& combo) +{ + cDebug() << "Selected mount point" << combo.currentIndex() << combo.currentText(); + if ( combo.currentIndex() == 0 ) + return QString(); + return combo.currentText(); +} diff --git a/src/modules/partition/gui/MountPoints.h b/src/modules/partition/gui/MountPoints.h index c91f24e6d..68390da0b 100644 --- a/src/modules/partition/gui/MountPoints.h +++ b/src/modules/partition/gui/MountPoints.h @@ -44,4 +44,14 @@ void standardMountPoints( QComboBox& ); */ void standardMountPoints( QComboBox&, const QString& selected ); +/** + * Get the mount point selected in the combo box (which should + * have been set up with standardMountPoints(), above); this + * will map the topmost item (i.e. "(no mount point)") back + * to blank, to allow easy detection of no-mount-selected. + */ +QString selectedMountPoint( QComboBox& combo ); +static inline QString selectedMountPoint(QComboBox* combo) { return selectedMountPoint(*combo); } + + #endif From 4402198b375a31e65460aafd886b9f032173c4d3 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 15 May 2018 08:01:18 -0400 Subject: [PATCH 04/17] [partition] Centralize setting-of-mountpoint - map empty to the 0'th index - add new entries as needed This avoids having selected index 0, but a different text. --- .../partition/gui/CreatePartitionDialog.cpp | 2 +- src/modules/partition/gui/MountPoints.cpp | 21 +++++++++++++++++++ src/modules/partition/gui/MountPoints.h | 2 ++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp index ee2db315f..8338e8913 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.cpp +++ b/src/modules/partition/gui/CreatePartitionDialog.cpp @@ -328,7 +328,7 @@ CreatePartitionDialog::initFromPartitionToCreate( Partition* partition ) m_ui->fsComboBox->setCurrentText( FileSystem::nameForType( fsType ) ); // Mount point - m_ui->mountPointComboBox->setCurrentText( PartitionInfo::mountPoint( partition ) ); + setSelectedMountPoint( m_ui->mountPointComboBox, PartitionInfo::mountPoint( partition ) ); updateMountPointUi(); } diff --git a/src/modules/partition/gui/MountPoints.cpp b/src/modules/partition/gui/MountPoints.cpp index 301773957..18a89fca0 100644 --- a/src/modules/partition/gui/MountPoints.cpp +++ b/src/modules/partition/gui/MountPoints.cpp @@ -65,3 +65,24 @@ selectedMountPoint(QComboBox& combo) return QString(); return combo.currentText(); } + +void +setSelectedMountPoint(QComboBox& combo, const QString& selected) +{ + cDebug() << "Setting mount point" << selected; + if ( selected.isEmpty() ) + combo.setCurrentIndex( 0 ); // (no mount point) + else + { + for ( int i = 0; i < combo.count(); ++i ) + if ( selected == combo.itemText( i ) ) + { + cDebug() << " .. found at index" << i; + combo.setCurrentIndex( i ); + return; + } + cDebug() << " .. new item"; + combo.addItem( selected ); + combo.setCurrentIndex( combo.count() - 1); + } +} diff --git a/src/modules/partition/gui/MountPoints.h b/src/modules/partition/gui/MountPoints.h index 68390da0b..23bb9b0f1 100644 --- a/src/modules/partition/gui/MountPoints.h +++ b/src/modules/partition/gui/MountPoints.h @@ -53,5 +53,7 @@ void standardMountPoints( QComboBox&, const QString& selected ); QString selectedMountPoint( QComboBox& combo ); static inline QString selectedMountPoint(QComboBox* combo) { return selectedMountPoint(*combo); } +void setSelectedMountPoint( QComboBox& combo, const QString& selected ); +static inline void setSelectedMountPoint(QComboBox* combo, const QString& selected) { setSelectedMountPoint( *combo, selected); } #endif From 310555f16be0c87f52f2a153b7562aeb7571ba75 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 15 May 2018 08:06:45 -0400 Subject: [PATCH 05/17] [partition] Add /srv to standard mount-points list. --- src/modules/partition/gui/MountPoints.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/partition/gui/MountPoints.cpp b/src/modules/partition/gui/MountPoints.cpp index 18a89fca0..b11d8ef7c 100644 --- a/src/modules/partition/gui/MountPoints.cpp +++ b/src/modules/partition/gui/MountPoints.cpp @@ -31,7 +31,7 @@ QStringList standardMountPoints() { - QStringList mountPoints{ "/", "/boot", "/home", "/opt", "/usr", "/var" }; + QStringList mountPoints{ "/", "/boot", "/home", "/opt", "/srv", "/usr", "/var" }; if ( PartUtils::isEfiSystem() ) mountPoints << Calamares::JobQueue::instance()->globalStorage()->value( "efiSystemPartition" ).toString(); mountPoints.removeDuplicates(); From 255a99d714f1515a9d370d46dd4aae96bd93fe3d Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 15 May 2018 08:13:15 -0400 Subject: [PATCH 06/17] [partition] Drop now-unneeded debugging --- src/modules/partition/gui/MountPoints.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/modules/partition/gui/MountPoints.cpp b/src/modules/partition/gui/MountPoints.cpp index b11d8ef7c..4e6a762bc 100644 --- a/src/modules/partition/gui/MountPoints.cpp +++ b/src/modules/partition/gui/MountPoints.cpp @@ -60,7 +60,6 @@ standardMountPoints(QComboBox& combo, const QString& selected) QString selectedMountPoint(QComboBox& combo) { - cDebug() << "Selected mount point" << combo.currentIndex() << combo.currentText(); if ( combo.currentIndex() == 0 ) return QString(); return combo.currentText(); @@ -69,7 +68,6 @@ selectedMountPoint(QComboBox& combo) void setSelectedMountPoint(QComboBox& combo, const QString& selected) { - cDebug() << "Setting mount point" << selected; if ( selected.isEmpty() ) combo.setCurrentIndex( 0 ); // (no mount point) else @@ -77,11 +75,9 @@ setSelectedMountPoint(QComboBox& combo, const QString& selected) for ( int i = 0; i < combo.count(); ++i ) if ( selected == combo.itemText( i ) ) { - cDebug() << " .. found at index" << i; combo.setCurrentIndex( i ); return; } - cDebug() << " .. new item"; combo.addItem( selected ); combo.setCurrentIndex( combo.count() - 1); } From 323d20d1a56551156de29227eea3f2c5690e36e7 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 15 May 2018 08:26:01 -0400 Subject: [PATCH 07/17] [partition] Avoid sneaking an empty string into the mount points combo --- src/modules/partition/gui/EditExistingPartitionDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp index aa066cac2..29dad951c 100644 --- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp +++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp @@ -288,7 +288,7 @@ EditExistingPartitionDialog::updateMountPointPicker() m_ui->mountPointLabel->setEnabled( canMount ); m_ui->mountPointComboBox->setEnabled( canMount ); if ( !canMount ) - m_ui->mountPointComboBox->setCurrentText( QString() ); + setSelectedMountPoint( m_ui->mountPointComboBox, QString() ); } void From 5b4668822d451f8209157709e146cf9dd120bf04 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 16 May 2018 06:15:33 -0400 Subject: [PATCH 08/17] [partition] Also update combo box index when setting up - Avoids case where you edit a partition with a mountpoint set; previously, calling setText() would update the text but leave the selected index unchanged (usually 0), so that later calling selectedMountPoint() would return empty. --- src/modules/partition/gui/MountPoints.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/modules/partition/gui/MountPoints.cpp b/src/modules/partition/gui/MountPoints.cpp index 4e6a762bc..612be3177 100644 --- a/src/modules/partition/gui/MountPoints.cpp +++ b/src/modules/partition/gui/MountPoints.cpp @@ -51,10 +51,7 @@ void standardMountPoints(QComboBox& combo, const QString& selected) { standardMountPoints( combo ); - if ( selected.isEmpty() ) - combo.setCurrentIndex( 0 ); - else - combo.setCurrentText( selected ); + setSelectedMountPoint( combo, selected ); } QString From 7df143f64a88048ba9a87c28063a69197f761d0e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 16 May 2018 06:53:35 -0400 Subject: [PATCH 09/17] [partition] Add flags to PartitionInfo - PartitionInfo maintains information on "what is desired" for a given Partition. Now we can set desired flags, alongside the flags already supported by Partition (where activeFlags() gives you the flags currently set on that partition). --- src/modules/partition/core/PartitionInfo.cpp | 22 +++++++++++++++++--- src/modules/partition/core/PartitionInfo.h | 5 +++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/modules/partition/core/PartitionInfo.cpp b/src/modules/partition/core/PartitionInfo.cpp index 72cca8976..dcd49d2e9 100644 --- a/src/modules/partition/core/PartitionInfo.cpp +++ b/src/modules/partition/core/PartitionInfo.cpp @@ -27,8 +27,9 @@ namespace PartitionInfo { -static const char* MOUNT_POINT_PROPERTY = "_calamares_mountPoint"; -static const char* FORMAT_PROPERTY = "_calamares_format"; +static const char MOUNT_POINT_PROPERTY[] = "_calamares_mountPoint"; +static const char FORMAT_PROPERTY[] = "_calamares_format"; +static const char FLAGS_PROPERTY[] = "_calamares_flags"; QString mountPoint( Partition* partition ) @@ -54,18 +55,33 @@ setFormat( Partition* partition, bool value ) partition->setProperty( FORMAT_PROPERTY, value ); } +PartitionTable::Flags flags(const Partition* partition) +{ + auto v = partition->property( FLAGS_PROPERTY ); + if (v.type() == QVariant::Int ) + return static_cast( v.toInt() ); + return partition->activeFlags(); +} + +void setFlags(Partition* partition, PartitionTable::Flags f) +{ + partition->setProperty( FLAGS_PROPERTY, PartitionTable::Flags::Int( f ) ); +} + void reset( Partition* partition ) { partition->setProperty( MOUNT_POINT_PROPERTY, QVariant() ); partition->setProperty( FORMAT_PROPERTY, QVariant() ); + partition->setProperty( FLAGS_PROPERTY, QVariant() ); } bool isDirty( Partition* partition ) { return !mountPoint( partition ).isEmpty() - || format( partition ); + || format( partition ) + || flags( partition ) != partition->activeFlags(); } } // namespace diff --git a/src/modules/partition/core/PartitionInfo.h b/src/modules/partition/core/PartitionInfo.h index 2474a3a2d..9003bf997 100644 --- a/src/modules/partition/core/PartitionInfo.h +++ b/src/modules/partition/core/PartitionInfo.h @@ -21,6 +21,8 @@ #include #include +#include + class Partition; /** @@ -45,6 +47,9 @@ void setMountPoint( Partition* partition, const QString& value ); bool format( Partition* partition ); void setFormat( Partition* partition, bool value ); +PartitionTable::Flags flags( const Partition* partition ); +void setFlags( Partition* partition, PartitionTable::Flags f ); + void reset( Partition* partition ); /** From 6739b81c2ac119636f816b2b917dc4e372bfb0df Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 16 May 2018 07:13:35 -0400 Subject: [PATCH 10/17] [partition] Tell PartitionInfo about desired flags - When creating a partition, or changing flags, tell the PartitionInfo about those desired flags. --- src/modules/partition/core/PartitionCoreModule.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp index 43ba33d7b..f636d15bb 100644 --- a/src/modules/partition/core/PartitionCoreModule.cpp +++ b/src/modules/partition/core/PartitionCoreModule.cpp @@ -258,6 +258,7 @@ PartitionCoreModule::createPartition( Device* device, { SetPartFlagsJob* fJob = new SetPartFlagsJob( device, partition, flags ); deviceInfo->jobs << Calamares::job_ptr( fJob ); + PartitionInfo::setFlags( partition, flags ); } refresh(); @@ -381,8 +382,8 @@ PartitionCoreModule::setPartitionFlags( Device* device, PartitionModel::ResetHelper( partitionModelForDevice( device ) ); SetPartFlagsJob* job = new SetPartFlagsJob( device, partition, flags ); - deviceInfo->jobs << Calamares::job_ptr( job ); + PartitionInfo::setFlags( partition, flags ); refresh(); } From 0df304b206d71ed3f8d3e3c170ccd39dfccb1165 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 16 May 2018 07:19:34 -0400 Subject: [PATCH 11/17] [partition] Preserve desired partition flags - Use the desired (future) flags, if set, to initialize the flags checkboxes. If there are no future flags set, this returns active flags as before. - This fixes the situation where editing a partition, changing flags, then editing it *again* re-starts with the original flags instead of the modified flags. --- src/modules/partition/gui/EditExistingPartitionDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp index 29dad951c..6ce23cdfd 100644 --- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp +++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp @@ -141,7 +141,7 @@ EditExistingPartitionDialog::setupFlagsList() m_ui->m_listFlags->addItem( item ); item->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled ); item->setData( Qt::UserRole, f ); - item->setCheckState( ( m_partition->activeFlags() & f ) ? + item->setCheckState( ( PartitionInfo::flags( m_partition ) & f ) ? Qt::Checked : Qt::Unchecked ); } From 336b8c758aa6974fcccde3a2d93a14a6c86746b3 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 16 May 2018 07:28:30 -0400 Subject: [PATCH 12/17] [partition] Consider the future flags when checking EFI bootability - If we're changing the flags to enable EFI boot, then that's enough to satisfy the (future) EFI bootability check. This is for issue #622 as well. Fixes #884. --- src/modules/partition/core/PartUtils.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp index 775fcee66..2c2944997 100644 --- a/src/modules/partition/core/PartUtils.cpp +++ b/src/modules/partition/core/PartUtils.cpp @@ -22,6 +22,7 @@ #include "core/DeviceModel.h" #include "core/KPMHelpers.h" +#include "core/PartitionInfo.h" #include "core/PartitionIterator.h" #include @@ -343,8 +344,10 @@ isEfiSystem() bool isEfiBootable( const Partition* candidate ) { + auto flags = PartitionInfo::flags( candidate ); + /* If bit 17 is set, old-style Esp flag, it's OK */ - if ( candidate->activeFlags().testFlag( PartitionTable::FlagEsp ) ) + if ( flags.testFlag( PartitionTable::FlagEsp ) ) return true; @@ -359,7 +362,7 @@ isEfiBootable( const Partition* candidate ) const PartitionTable* table = dynamic_cast( root ); return table && ( table->type() == PartitionTable::TableType::gpt ) && - candidate->activeFlags().testFlag( PartitionTable::FlagBoot ); + flags.testFlag( PartitionTable::FlagBoot ); } } // nmamespace PartUtils From 950cc9070d0082008551d213bbf1817b8ead036a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 16 May 2018 08:34:33 -0400 Subject: [PATCH 13/17] [partition] Rename MountPoints to PartitionDialogHelpers This file is full of helper functions for the partition-editing dialogs. At first it was just mount-point helper functions, but there is other functionality that can be refactored. --- src/modules/partition/CMakeLists.txt | 2 +- src/modules/partition/gui/CreatePartitionDialog.cpp | 2 +- src/modules/partition/gui/EditExistingPartitionDialog.cpp | 2 +- .../gui/{MountPoints.cpp => PartitionDialogHelpers.cpp} | 2 +- .../partition/gui/{MountPoints.h => PartitionDialogHelpers.h} | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) rename src/modules/partition/gui/{MountPoints.cpp => PartitionDialogHelpers.cpp} (98%) rename src/modules/partition/gui/{MountPoints.h => PartitionDialogHelpers.h} (95%) diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt index dc6735f28..cfc5e567e 100644 --- a/src/modules/partition/CMakeLists.txt +++ b/src/modules/partition/CMakeLists.txt @@ -38,9 +38,9 @@ if ( KPMcore_FOUND ) gui/DeviceInfoWidget.cpp gui/EditExistingPartitionDialog.cpp gui/EncryptWidget.cpp - gui/MountPoints.cpp gui/PartitionPage.cpp gui/PartitionBarsView.cpp + gui/PartitionDialogHelpers.cpp gui/PartitionLabelsView.cpp gui/PartitionSizeController.cpp gui/PartitionSplitterWidget.cpp diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp index 8338e8913..310987f93 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.cpp +++ b/src/modules/partition/gui/CreatePartitionDialog.cpp @@ -23,7 +23,7 @@ #include "core/PartitionInfo.h" #include "core/PartUtils.h" #include "core/KPMHelpers.h" -#include "gui/MountPoints.h" +#include "gui/PartitionDialogHelpers.h" #include "gui/PartitionSizeController.h" #include "ui_CreatePartitionDialog.h" diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp index 6ce23cdfd..8a64cb27c 100644 --- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp +++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp @@ -28,7 +28,7 @@ #include #include "core/PartUtils.h" #include -#include "gui/MountPoints.h" +#include "gui/PartitionDialogHelpers.h" #include #include diff --git a/src/modules/partition/gui/MountPoints.cpp b/src/modules/partition/gui/PartitionDialogHelpers.cpp similarity index 98% rename from src/modules/partition/gui/MountPoints.cpp rename to src/modules/partition/gui/PartitionDialogHelpers.cpp index 612be3177..b3bb0d33a 100644 --- a/src/modules/partition/gui/MountPoints.cpp +++ b/src/modules/partition/gui/PartitionDialogHelpers.cpp @@ -18,7 +18,7 @@ * along with Calamares. If not, see . */ -#include "MountPoints.h" +#include "PartitionDialogHelpers.h" #include "core/PartUtils.h" diff --git a/src/modules/partition/gui/MountPoints.h b/src/modules/partition/gui/PartitionDialogHelpers.h similarity index 95% rename from src/modules/partition/gui/MountPoints.h rename to src/modules/partition/gui/PartitionDialogHelpers.h index 23bb9b0f1..3c497a62d 100644 --- a/src/modules/partition/gui/MountPoints.h +++ b/src/modules/partition/gui/PartitionDialogHelpers.h @@ -18,8 +18,8 @@ * along with Calamares. If not, see . */ -#ifndef PARTITION_GUI_MOUNTPOINTS -#define PARTITION_GUI_MOUNTPOINTS +#ifndef PARTITION_GUI_PARTITIONDIALOGHELPERS +#define PARTITION_GUI_PARTITIONDIALOGHELPERS #include From 4f451eece52be1160aa1600b30a702b379cd74c6 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 16 May 2018 08:41:47 -0400 Subject: [PATCH 14/17] [partition] Refactor getting the checked flags --- .../partition/gui/CreatePartitionDialog.cpp | 9 +-------- .../gui/EditExistingPartitionDialog.cpp | 9 +-------- .../partition/gui/PartitionDialogHelpers.cpp | 16 ++++++++++++++++ .../partition/gui/PartitionDialogHelpers.h | 8 ++++++++ 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp index 310987f93..a2bd3fa66 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.cpp +++ b/src/modules/partition/gui/CreatePartitionDialog.cpp @@ -133,14 +133,7 @@ CreatePartitionDialog::~CreatePartitionDialog() PartitionTable::Flags CreatePartitionDialog::newFlags() const { - PartitionTable::Flags flags; - - for ( int i = 0; i < m_ui->m_listFlags->count(); i++ ) - if ( m_ui->m_listFlags->item( i )->checkState() == Qt::Checked ) - flags |= static_cast< PartitionTable::Flag >( - m_ui->m_listFlags->item( i )->data( Qt::UserRole ).toInt() ); - - return flags; + return flagsFromList( *(m_ui->m_listFlags) ); } diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp index 8a64cb27c..c930cdf74 100644 --- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp +++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp @@ -117,14 +117,7 @@ EditExistingPartitionDialog::~EditExistingPartitionDialog() PartitionTable::Flags EditExistingPartitionDialog::newFlags() const { - PartitionTable::Flags flags; - - for ( int i = 0; i < m_ui->m_listFlags->count(); i++ ) - if ( m_ui->m_listFlags->item( i )->checkState() == Qt::Checked ) - flags |= static_cast< PartitionTable::Flag >( - m_ui->m_listFlags->item( i )->data( Qt::UserRole ).toInt() ); - - return flags; + return flagsFromList( *(m_ui->m_listFlags) ); } diff --git a/src/modules/partition/gui/PartitionDialogHelpers.cpp b/src/modules/partition/gui/PartitionDialogHelpers.cpp index b3bb0d33a..ee08412c7 100644 --- a/src/modules/partition/gui/PartitionDialogHelpers.cpp +++ b/src/modules/partition/gui/PartitionDialogHelpers.cpp @@ -27,6 +27,7 @@ #include "utils/Logger.h" #include +#include QStringList standardMountPoints() @@ -79,3 +80,18 @@ setSelectedMountPoint(QComboBox& combo, const QString& selected) combo.setCurrentIndex( combo.count() - 1); } } + + +PartitionTable::Flags +flagsFromList( const QListWidget& list ) +{ + PartitionTable::Flags flags; + + for ( int i = 0; i < list.count(); i++ ) + if ( list.item( i )->checkState() == Qt::Checked ) + flags |= static_cast< PartitionTable::Flag >( + list.item( i )->data( Qt::UserRole ).toInt() ); + + return flags; +} + diff --git a/src/modules/partition/gui/PartitionDialogHelpers.h b/src/modules/partition/gui/PartitionDialogHelpers.h index 3c497a62d..124c10463 100644 --- a/src/modules/partition/gui/PartitionDialogHelpers.h +++ b/src/modules/partition/gui/PartitionDialogHelpers.h @@ -21,9 +21,12 @@ #ifndef PARTITION_GUI_PARTITIONDIALOGHELPERS #define PARTITION_GUI_PARTITIONDIALOGHELPERS +#include + #include class QComboBox; +class QListWidget; /** * Returns a list of standard mount points (e.g. /, /usr, ...). @@ -56,4 +59,9 @@ static inline QString selectedMountPoint(QComboBox* combo) { return selectedMoun void setSelectedMountPoint( QComboBox& combo, const QString& selected ); static inline void setSelectedMountPoint(QComboBox* combo, const QString& selected) { setSelectedMountPoint( *combo, selected); } +/** + * Get the flags that have been checked in the list widget. + */ +PartitionTable::Flags flagsFromList( const QListWidget& list ); + #endif From ca03dad67beddfb59be1434cc4ce9451712fa4ba Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 16 May 2018 09:04:47 -0400 Subject: [PATCH 15/17] [partition] Refactor setting the flags UI - Setup the lsit of flags consistently, by providing the available and to-be-checked flags. - In CreatePartitionDialog, assume that ~0 is all the flags. --- .../partition/gui/CreatePartitionDialog.cpp | 22 ++-------------- .../partition/gui/CreatePartitionDialog.h | 1 - .../gui/EditExistingPartitionDialog.cpp | 26 +------------------ .../gui/EditExistingPartitionDialog.h | 1 - .../partition/gui/PartitionDialogHelpers.cpp | 21 +++++++++++++++ .../partition/gui/PartitionDialogHelpers.h | 1 + 6 files changed, 25 insertions(+), 47 deletions(-) diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp index a2bd3fa66..7c1f98c0b 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.cpp +++ b/src/modules/partition/gui/CreatePartitionDialog.cpp @@ -121,7 +121,8 @@ CreatePartitionDialog::CreatePartitionDialog( Device* device, PartitionNode* par m_ui->fsComboBox->setCurrentIndex( defaultFsIndex ); updateMountPointUi(); - setupFlagsList(); + setFlagList( *(m_ui->m_listFlags), static_cast< PartitionTable::Flags >( ~PartitionTable::Flags::Int(0) ), PartitionTable::Flags() ); + // Checks the initial selection. checkMountPointSelection(); } @@ -136,25 +137,6 @@ CreatePartitionDialog::newFlags() const return flagsFromList( *(m_ui->m_listFlags) ); } - -void -CreatePartitionDialog::setupFlagsList() -{ - int f = 1; - QString s; - while ( !( s = PartitionTable::flagName( static_cast< PartitionTable::Flag >( f ) ) ).isEmpty() ) - { - QListWidgetItem* item = new QListWidgetItem( s ); - m_ui->m_listFlags->addItem( item ); - item->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled ); - item->setData( Qt::UserRole, f ); - item->setCheckState( Qt::Unchecked ); - - f <<= 1; - } -} - - void CreatePartitionDialog::initMbrPartitionTypeUi() { diff --git a/src/modules/partition/gui/CreatePartitionDialog.h b/src/modules/partition/gui/CreatePartitionDialog.h index 6e8e9b6fd..174d91c88 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.h +++ b/src/modules/partition/gui/CreatePartitionDialog.h @@ -64,7 +64,6 @@ private Q_SLOTS: void checkMountPointSelection(); private: - void setupFlagsList(); QScopedPointer< Ui_CreatePartitionDialog > m_ui; PartitionSizeController* m_partitionSizeController; Device* m_device; diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp index c930cdf74..c0fff50a8 100644 --- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp +++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp @@ -106,7 +106,7 @@ EditExistingPartitionDialog::EditExistingPartitionDialog( Device* device, Partit m_ui->fileSystemLabel->setEnabled( m_ui->formatRadioButton->isChecked() ); m_ui->fileSystemComboBox->setEnabled( m_ui->formatRadioButton->isChecked() ); - setupFlagsList(); + setFlagList( *(m_ui->m_listFlags), m_partition->availableFlags(), PartitionInfo::flags( m_partition ) ); } @@ -120,30 +120,6 @@ EditExistingPartitionDialog::newFlags() const return flagsFromList( *(m_ui->m_listFlags) ); } - -void -EditExistingPartitionDialog::setupFlagsList() -{ - int f = 1; - QString s; - while ( !( s = PartitionTable::flagName( static_cast< PartitionTable::Flag >( f ) ) ).isEmpty() ) - { - if ( m_partition->availableFlags() & f ) - { - QListWidgetItem* item = new QListWidgetItem( s ); - m_ui->m_listFlags->addItem( item ); - item->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled ); - item->setData( Qt::UserRole, f ); - item->setCheckState( ( PartitionInfo::flags( m_partition ) & f ) ? - Qt::Checked : - Qt::Unchecked ); - } - - f <<= 1; - } -} - - void EditExistingPartitionDialog::applyChanges( PartitionCoreModule* core ) { diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.h b/src/modules/partition/gui/EditExistingPartitionDialog.h index b933e90ce..106ba6639 100644 --- a/src/modules/partition/gui/EditExistingPartitionDialog.h +++ b/src/modules/partition/gui/EditExistingPartitionDialog.h @@ -56,7 +56,6 @@ private: QStringList m_usedMountPoints; PartitionTable::Flags newFlags() const; - void setupFlagsList(); void replacePartResizerWidget(); void updateMountPointPicker(); }; diff --git a/src/modules/partition/gui/PartitionDialogHelpers.cpp b/src/modules/partition/gui/PartitionDialogHelpers.cpp index ee08412c7..3dcf41f58 100644 --- a/src/modules/partition/gui/PartitionDialogHelpers.cpp +++ b/src/modules/partition/gui/PartitionDialogHelpers.cpp @@ -95,3 +95,24 @@ flagsFromList( const QListWidget& list ) return flags; } +void +setFlagList( QListWidget& list, PartitionTable::Flags available, PartitionTable::Flags checked ) +{ + int f = 1; + QString s; + while ( !( s = PartitionTable::flagName( static_cast< PartitionTable::Flag >( f ) ) ).isEmpty() ) + { + if ( available & f ) + { + QListWidgetItem* item = new QListWidgetItem( s ); + list.addItem( item ); + item->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled ); + item->setData( Qt::UserRole, f ); + item->setCheckState( ( checked & f ) ? + Qt::Checked : + Qt::Unchecked ); + } + + f <<= 1; + } +} diff --git a/src/modules/partition/gui/PartitionDialogHelpers.h b/src/modules/partition/gui/PartitionDialogHelpers.h index 124c10463..594142993 100644 --- a/src/modules/partition/gui/PartitionDialogHelpers.h +++ b/src/modules/partition/gui/PartitionDialogHelpers.h @@ -63,5 +63,6 @@ static inline void setSelectedMountPoint(QComboBox* combo, const QString& select * Get the flags that have been checked in the list widget. */ PartitionTable::Flags flagsFromList( const QListWidget& list ); +void setFlagList( QListWidget& list, PartitionTable::Flags available, PartitionTable::Flags checked ); #endif From bd57f1f2f14f1e2da76c6a67836b8ede071b0fb8 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 16 May 2018 09:14:50 -0400 Subject: [PATCH 16/17] [partition] Fix re-editing a newly created partition - If there is a partition already (newly) created, then pass that to the dialog so that it can use the setings previously applied (e.g. mount point and flags). - This avoids the case where you create or format a partition, then click on it again to edit it and the previous settings are lost. --- src/modules/partition/gui/CreatePartitionDialog.cpp | 6 +++--- src/modules/partition/gui/CreatePartitionDialog.h | 8 +++++++- src/modules/partition/gui/PartitionPage.cpp | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp index 7c1f98c0b..439583be9 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.cpp +++ b/src/modules/partition/gui/CreatePartitionDialog.cpp @@ -57,7 +57,7 @@ static QSet< FileSystem::Type > s_unmountableFS( FileSystem::Lvm2_PV } ); -CreatePartitionDialog::CreatePartitionDialog( Device* device, PartitionNode* parentPartition, const QStringList& usedMountPoints, QWidget* parentWidget ) +CreatePartitionDialog::CreatePartitionDialog( Device* device, PartitionNode* parentPartition, Partition* partition, const QStringList& usedMountPoints, QWidget* parentWidget ) : QDialog( parentWidget ) , m_ui( new Ui_CreatePartitionDialog ) , m_partitionSizeController( new PartitionSizeController( this ) ) @@ -82,7 +82,7 @@ CreatePartitionDialog::CreatePartitionDialog( Device* device, PartitionNode* par m_ui->lvNameLineEdit->setValidator(validator); } - standardMountPoints( *(m_ui->mountPointComboBox) ); + standardMountPoints( *(m_ui->mountPointComboBox), partition ? PartitionInfo::mountPoint( partition ) : QString() ); if ( device->partitionTable()->type() == PartitionTable::msdos || device->partitionTable()->type() == PartitionTable::msdos_sectorbased ) @@ -121,7 +121,7 @@ CreatePartitionDialog::CreatePartitionDialog( Device* device, PartitionNode* par m_ui->fsComboBox->setCurrentIndex( defaultFsIndex ); updateMountPointUi(); - setFlagList( *(m_ui->m_listFlags), static_cast< PartitionTable::Flags >( ~PartitionTable::Flags::Int(0) ), PartitionTable::Flags() ); + setFlagList( *(m_ui->m_listFlags), static_cast< PartitionTable::Flags >( ~PartitionTable::Flags::Int(0) ), partition ? PartitionInfo::flags( partition ) : PartitionTable::Flags() ); // Checks the initial selection. checkMountPointSelection(); diff --git a/src/modules/partition/gui/CreatePartitionDialog.h b/src/modules/partition/gui/CreatePartitionDialog.h index 174d91c88..769edb5de 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.h +++ b/src/modules/partition/gui/CreatePartitionDialog.h @@ -42,7 +42,13 @@ class CreatePartitionDialog : public QDialog { Q_OBJECT public: - CreatePartitionDialog( Device* device, PartitionNode* parentPartition, const QStringList& usedMountPoints, QWidget* parentWidget = nullptr ); + /** + * @brief Dialog for editing a new partition. + * + * For the (unlikely) case that a newly created partition is being re-edited, + * pass a pointer to that @p partition, otherwise pass nullptr. + */ + CreatePartitionDialog( Device* device, PartitionNode* parentPartition, Partition* partition, const QStringList& usedMountPoints, QWidget* parentWidget = nullptr ); ~CreatePartitionDialog(); /** diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp index c521604fb..62f82a108 100644 --- a/src/modules/partition/gui/PartitionPage.cpp +++ b/src/modules/partition/gui/PartitionPage.cpp @@ -190,6 +190,7 @@ PartitionPage::onCreateClicked() QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog( model->device(), partition->parent(), + nullptr, getCurrentUsedMountpoints(), this ); dlg->initFromFreeSpace( partition ); @@ -285,6 +286,7 @@ PartitionPage::updatePartitionToCreate( Device* device, Partition* partition ) QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog( device, partition->parent(), + partition, mountPoints, this ); dlg->initFromPartitionToCreate( partition ); From 90a2e482be76862add04577de6fc9fdbd2d30b4d Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 16 May 2018 10:56:06 -0400 Subject: [PATCH 17/17] [partition] Check for available partition type before creating - Avoid situation where you make 5 or more primaries in an MSDOS partition table. FIXES #953 --- src/modules/partition/gui/PartitionPage.cpp | 27 +++++++++++++++++++++ src/modules/partition/gui/PartitionPage.h | 8 ++++++ 2 files changed, 35 insertions(+) diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp index 62f82a108..426667a08 100644 --- a/src/modules/partition/gui/PartitionPage.cpp +++ b/src/modules/partition/gui/PartitionPage.cpp @@ -34,6 +34,7 @@ #include "ui_PartitionPage.h" #include "ui_CreatePartitionTableDialog.h" +#include "utils/Logger.h" #include "utils/Retranslator.h" #include "Branding.h" #include "JobQueue.h" @@ -178,6 +179,29 @@ PartitionPage::onNewPartitionTableClicked() updateBootLoaderIndex(); } +bool +PartitionPage::checkCanCreate( Device* device ) +{ + auto table = device->partitionTable(); + + if ( table->type() == PartitionTable::msdos ||table->type() == PartitionTable::msdos_sectorbased ) + { + cDebug() << "Checking MSDOS partition" << table->numPrimaries() << "primaries, max" << table->maxPrimaries(); + + if ( ( table->numPrimaries() >= table->maxPrimaries() ) && !table->hasExtended() ) + { + QMessageBox::warning( this, tr( "Can not create new partition" ), + tr( "The partition table on %1 already has %2 primary partitions, and no more can be added. " + "Please remove one primary partition and add an extended partition, instead." ).arg( device->name() ).arg( table->numPrimaries() ) + ); + return false; + } + return true; + } + else + return true; // GPT is fine +} + void PartitionPage::onCreateClicked() { @@ -188,6 +212,9 @@ PartitionPage::onCreateClicked() Partition* partition = model->partitionForIndex( index ); Q_ASSERT( partition ); + if ( !checkCanCreate( model->device() ) ) + return; + QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog( model->device(), partition->parent(), nullptr, diff --git a/src/modules/partition/gui/PartitionPage.h b/src/modules/partition/gui/PartitionPage.h index 24cf65675..d7c823a61 100644 --- a/src/modules/partition/gui/PartitionPage.h +++ b/src/modules/partition/gui/PartitionPage.h @@ -62,6 +62,14 @@ private: void updateFromCurrentDevice(); void updateBootLoaderIndex(); + /** + * @brief Check if a new partition can be created (as primary) on the device. + * + * Returns true if a new partition can be created on the device. Provides + * a warning popup and returns false if it cannot. + */ + bool checkCanCreate( Device* ); + QStringList getCurrentUsedMountpoints(); QMutex m_revertMutex;