From 9302ad14682d4aaf274835a73b6e7d929d39237d Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Wed, 31 Mar 2021 20:15:02 +0400 Subject: [PATCH] [partition] Erase disk FS choice --- src/modules/partition/core/Config.cpp | 20 +++++++++++++++++++ src/modules/partition/core/Config.h | 10 ++++++++++ .../partition/core/PartitionActions.cpp | 4 ++++ .../partition/core/PartitionCoreModule.cpp | 1 + src/modules/partition/gui/ChoicePage.cpp | 11 ++++++++-- src/modules/partition/gui/ChoicePage.h | 2 ++ src/modules/partition/partition.conf | 2 +- 7 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/modules/partition/core/Config.cpp b/src/modules/partition/core/Config.cpp index 0afcee83d6..a603cedd0f 100644 --- a/src/modules/partition/core/Config.cpp +++ b/src/modules/partition/core/Config.cpp @@ -207,6 +207,15 @@ Config::setSwapChoice( Config::SwapChoice c ) } } +void +Config::setEraseFsTypeChoice(const QString& choice) +{ + if(choice != m_eraseFsTypeChoice){ + m_eraseFsTypeChoice = choice; + } +} + + bool Config::allowManualPartitioning() const { @@ -240,6 +249,17 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) gs->insert( "allowManualPartitioning", CalamaresUtils::getBool( configurationMap, "allowManualPartitioning", true ) ); + if ( configurationMap.contains( "availableFileSystemTypes" ) ) { + if(configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::List ){ + m_eraseFsTypes.clear(); + m_eraseFsTypes.append(configurationMap.value( "availableFileSystemTypes" ).toStringList()); + m_eraseFsTypeChoice = m_eraseFsTypes[0]; + } else if ( configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::String ){ + m_eraseFsTypes.append(configurationMap.value( "availableFileSystemTypes" ).toString()); + m_eraseFsTypeChoice = m_eraseFsTypes[0]; + } + } + if ( configurationMap.contains( "requiredPartitionTableType" ) && configurationMap.value( "requiredPartitionTableType" ).type() == QVariant::List ) { diff --git a/src/modules/partition/core/Config.h b/src/modules/partition/core/Config.h index 57230b6e85..5cdd14c9d7 100644 --- a/src/modules/partition/core/Config.h +++ b/src/modules/partition/core/Config.h @@ -54,6 +54,8 @@ class Config : public QObject static const NamedEnumTable< SwapChoice >& swapChoiceNames(); using SwapChoiceSet = QSet< SwapChoice >; + using EraseFsTypesSet = QStringList; + void setConfigurationMap( const QVariantMap& ); void updateGlobalStorage() const; @@ -94,6 +96,11 @@ class Config : public QObject */ SwapChoice swapChoice() const { return m_swapChoice; } + EraseFsTypesSet eraseFsTypes() const {return m_eraseFsTypes; } + + QString eraseFsType() const {return m_eraseFsTypeChoice; } + + ///@brief Is manual partitioning allowed (not explicitly disnabled in the config file)? bool allowManualPartitioning() const; @@ -102,6 +109,7 @@ public Q_SLOTS: void setInstallChoice( InstallChoice ); void setSwapChoice( int ); ///< Translates a button ID or so to SwapChoice void setSwapChoice( SwapChoice ); + void setEraseFsTypeChoice( const QString& ); Q_SIGNALS: void installChoiceChanged( InstallChoice ); @@ -109,6 +117,8 @@ public Q_SLOTS: private: SwapChoiceSet m_swapChoices; + EraseFsTypesSet m_eraseFsTypes; + QString m_eraseFsTypeChoice; SwapChoice m_initialSwapChoice = NoSwap; SwapChoice m_swapChoice = NoSwap; InstallChoice m_initialInstallChoice = NoChoice; diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp index 1a3f6246be..0dab5747fc 100644 --- a/src/modules/partition/core/PartitionActions.cpp +++ b/src/modules/partition/core/PartitionActions.cpp @@ -109,6 +109,10 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO partType = isEfi ? PartitionTable::gpt : PartitionTable::msdos; } + FileSystem::Type type; + PartUtils::findFS(o.defaultFsType, &type); + core->initLayout( type == FileSystem::Unknown ? FileSystem::Ext4 : type); + core->createPartitionTable( dev, partType ); if ( isEfi ) diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp index 058c10d181..4370ffa0d5 100644 --- a/src/modules/partition/core/PartitionCoreModule.cpp +++ b/src/modules/partition/core/PartitionCoreModule.cpp @@ -381,6 +381,7 @@ PartitionCoreModule::createPartitionTable( Device* device, PartitionTable::Table OperationHelper helper( partitionModelForDevice( device ), this ); deviceInfo->makeJob< CreatePartitionTableJob >( type ); + } } diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index f6b49cb2f5..a8f31d416d 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -246,6 +246,14 @@ ChoicePage::setupChoices() m_eraseButton->addOptionsComboBox( m_eraseSwapChoiceComboBox ); } + if ( m_config->eraseFsTypes().count() > 1) + { + m_eraseFsTypesChoiceComboBox = new QComboBox; + m_eraseFsTypesChoiceComboBox->addItems(m_config->eraseFsTypes()); + connect(m_eraseFsTypesChoiceComboBox, &QComboBox::currentTextChanged, [this](const auto& currentString){m_config->setEraseFsTypeChoice(currentString); onActionChanged();}); + m_eraseButton->addOptionsComboBox( m_eraseFsTypesChoiceComboBox ); + } + m_itemsLayout->addWidget( m_alongsideButton ); m_itemsLayout->addWidget( m_replaceButton ); m_itemsLayout->addWidget( m_eraseButton ); @@ -442,9 +450,8 @@ ChoicePage::applyActionChoice( InstallChoice choice ) case InstallChoice::Erase: { auto gs = Calamares::JobQueue::instance()->globalStorage(); - PartitionActions::Choices::AutoPartitionOptions options { gs->value( "defaultPartitionTableType" ).toString(), - gs->value( "defaultFileSystemType" ).toString(), + m_config->eraseFsType(), m_encryptWidget->passphrase(), gs->value( "efiSystemPartition" ).toString(), CalamaresUtils::GiBtoBytes( diff --git a/src/modules/partition/gui/ChoicePage.h b/src/modules/partition/gui/ChoicePage.h index 89bd775d74..f43578ba5e 100644 --- a/src/modules/partition/gui/ChoicePage.h +++ b/src/modules/partition/gui/ChoicePage.h @@ -139,6 +139,8 @@ private slots: Calamares::PrettyRadioButton* m_replaceButton; Calamares::PrettyRadioButton* m_somethingElseButton; QComboBox* m_eraseSwapChoiceComboBox; // UI, see also m_eraseSwapChoice + QComboBox* m_eraseFsTypesChoiceComboBox; // UI, see also m_eraseSwapChoice + DeviceInfoWidget* m_deviceInfoWidget; diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index e5de696591..19d3e17453 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -137,7 +137,7 @@ initialSwapChoice: none # If nothing is specified, Calamares defaults to "ext4". # # Names are case-sensitive and defined by KPMCore. -defaultFileSystemType: "ext4" +availableFileSystemTypes: ["ext4", "btrfs", "f2fs"] # Show/hide LUKS related functionality in automated partitioning modes. # Disable this if you choose not to deploy early unlocking support in GRUB2