diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt index c5f211eef..ca00c8c44 100644 --- a/src/modules/partition/CMakeLists.txt +++ b/src/modules/partition/CMakeLists.txt @@ -25,6 +25,7 @@ calamares_add_plugin( partition core/ColorUtils.cpp core/DeviceModel.cpp core/KPMHelpers.cpp + core/PartitionActions.cpp core/PartitionCoreModule.cpp core/PartitionInfo.cpp core/PartitionIterator.cpp @@ -34,7 +35,6 @@ calamares_add_plugin( partition gui/CreatePartitionDialog.cpp gui/EditExistingPartitionDialog.cpp gui/AlongsidePage.cpp - gui/EraseDiskPage.cpp gui/PartitionPage.cpp gui/PartitionPreview.cpp gui/PartitionSizeController.cpp diff --git a/src/modules/partition/gui/EraseDiskPage.cpp b/src/modules/partition/core/PartitionActions.cpp similarity index 56% rename from src/modules/partition/gui/EraseDiskPage.cpp rename to src/modules/partition/core/PartitionActions.cpp index 3a9d6aa00..160dbefef 100644 --- a/src/modules/partition/gui/EraseDiskPage.cpp +++ b/src/modules/partition/core/PartitionActions.cpp @@ -16,266 +16,27 @@ * along with Calamares. If not, see . */ -#include "EraseDiskPage.h" +#include "PartitionActions.h" -#include "core/DeviceModel.h" -#include "core/PartitionCoreModule.h" #include "core/KPMHelpers.h" #include "core/PartitionInfo.h" -#include "gui/PartitionPreview.h" +#include "core/PartitionCoreModule.h" -#include "utils/CalamaresUtilsGui.h" -#include "utils/Logger.h" -#include "utils/Retranslator.h" #include "utils/CalamaresUtilsSystem.h" -#include "GlobalStorage.h" #include "JobQueue.h" +#include "utils/Logger.h" +#include "GlobalStorage.h" -// KPMcore #include -#include -#include -#include #include -#include -#include -#include -#include -EraseDiskPage::EraseDiskPage( QWidget* parent ) - : QWidget( parent ) - , m_nextEnabled( false ) - , m_core( nullptr ) +namespace PartitionActions { - QVBoxLayout* mainLayout = new QVBoxLayout; - setLayout( mainLayout ); - - QLabel* driveLabel = new QLabel( this ); - mainLayout->addWidget( driveLabel ); - CALAMARES_RETRANSLATE( driveLabel->setText( tr( "Select drive:" ) ); ) - - m_drivesView = new QListView; - mainLayout->addWidget( m_drivesView ); - m_drivesView->setViewMode( QListView::IconMode ); - m_drivesView->setWrapping( false ); - m_drivesView->setFlow( QListView::LeftToRight ); - m_drivesView->setSelectionRectVisible( false ); - m_drivesView->setWordWrap( true ); - m_drivesView->setUniformItemSizes( true ); - m_drivesView->setSelectionMode( QAbstractItemView::SingleSelection ); - - m_drivesView->setIconSize( CalamaresUtils::defaultIconSize() * 3 ); - m_drivesView->setGridSize( QSize( CalamaresUtils::defaultFontHeight() * 8, - m_drivesView->iconSize().height() + - CalamaresUtils::defaultFontHeight() * 4 ) ); - m_drivesView->setMinimumHeight( m_drivesView->gridSize().height() + - CalamaresUtils::defaultFontHeight() / 2 ); - m_drivesView->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); - - m_previewFrame = new QWidget; - m_previewFrame->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Expanding ); - mainLayout->addWidget( m_previewFrame ); - - setNextEnabled( false ); -} - - -void -EraseDiskPage::init( PartitionCoreModule* core ) -{ - if ( m_core ) //this should probably never happen - { - m_core->revert(); - return; - } - - m_core = core; - m_drivesView->setModel( core->deviceModel() ); - - connect( m_drivesView->selectionModel(), &QItemSelectionModel::currentChanged, - this, [ this ]( const QModelIndex& index, - const QModelIndex& oldIndex ) - { - setNextEnabled( m_drivesView->selectionModel()->hasSelection() ); - - if ( m_core->isDirty() ) - m_core->clearJobs(); - - Device* dev = m_core->deviceModel()->deviceForIndex( index ); - - if ( dev ) - doAutopartition( dev ); - } ); - - connect( m_core, &PartitionCoreModule::isDirtyChanged, - this, &EraseDiskPage::updatePreviews ); -} - - -bool -EraseDiskPage::isNextEnabled() const -{ - return m_nextEnabled; -} - - -void -EraseDiskPage::setNextEnabled( bool enabled ) -{ - if ( enabled == m_nextEnabled ) - return; - - m_nextEnabled = enabled; - emit nextStatusChanged( enabled ); -} - - -void -EraseDiskPage::doAutopartition( Device* dev ) -{ - bool isEfi = false; - if ( QDir( "/sys/firmware/efi/efivars" ).exists() ) - isEfi = true; - -#define MiB * static_cast< qint64 >( 1024 ) * 1024 -#define GiB * static_cast< qint64 >( 1024 ) * 1024 * 1024 - - // Partition sizes are expressed in MiB, should be multiples of - // the logical sector size (usually 512B). - int uefisys_part_size = 0; - int empty_space_size = 0; - if ( isEfi ) - { - uefisys_part_size = 300; - empty_space_size = 2; - } - else - { - // we start with a 1MiB offset before the first partition - empty_space_size = 1; - } - - qint64 firstFreeSector = empty_space_size MiB / dev->logicalSectorSize() + 1; - - if ( isEfi ) - { - qint64 lastSector = firstFreeSector + ( uefisys_part_size MiB / dev->logicalSectorSize() ); - m_core->createPartitionTable( dev, PartitionTable::gpt ); - Partition* efiPartition = KPMHelpers::createNewPartition( - dev->partitionTable(), - *dev, - PartitionRole( PartitionRole::Primary ), - FileSystem::Fat32, - firstFreeSector, - lastSector - ); - PartitionInfo::setFormat( efiPartition, true ); - PartitionInfo::setMountPoint( efiPartition, Calamares::JobQueue::instance() - ->globalStorage() - ->value( "efiSystemPartition" ) - .toString() ); - m_core->createPartition( dev, efiPartition ); - firstFreeSector = lastSector + 1; - } - else - { - m_core->createPartitionTable( dev, PartitionTable::msdos ); - } - - bool shouldCreateSwap = false; - qint64 availableSpaceB = ( dev->totalSectors() - firstFreeSector ) * dev->logicalSectorSize(); - qint64 suggestedSwapSizeB = swapSuggestion( availableSpaceB ); - qint64 requiredSpaceB = - ( Calamares::JobQueue::instance()-> - globalStorage()-> - value( "requiredStorageGB" ).toDouble() + 0.1 + 2.0 ) GiB + - suggestedSwapSizeB; - - // If there is enough room for ESP + root + swap, create swap, otherwise don't. - shouldCreateSwap = availableSpaceB > requiredSpaceB; - - qint64 lastSectorForRoot = dev->totalSectors() - 1; //last sector of the device - if ( shouldCreateSwap ) - { - lastSectorForRoot -= suggestedSwapSizeB / dev->logicalSectorSize() + 1; - } - - Partition* rootPartition = KPMHelpers::createNewPartition( - dev->partitionTable(), - *dev, - PartitionRole( PartitionRole::Primary ), - FileSystem::Ext4, - firstFreeSector, - lastSectorForRoot - ); - PartitionInfo::setFormat( rootPartition, true ); - PartitionInfo::setMountPoint( rootPartition, "/" ); - m_core->createPartition( dev, rootPartition ); - - if ( shouldCreateSwap ) - { - Partition* swapPartition = KPMHelpers::createNewPartition( - dev->partitionTable(), - *dev, - PartitionRole( PartitionRole::Primary ), - FileSystem::LinuxSwap, - lastSectorForRoot + 1, - dev->totalSectors() - 1 - ); - PartitionInfo::setFormat( swapPartition, true ); - m_core->createPartition( dev, swapPartition ); - } - - updatePreviews(); - - m_core->dumpQueue(); -} - - -void -EraseDiskPage::updatePreviews() -{ - QMutexLocker locker( &m_previewsMutex ); - - cDebug() << "Updating partitioning preview widgets."; - qDeleteAll( m_previewFrame->children() ); - m_previewFrame->layout()->deleteLater(); - - if ( m_drivesView->selectionModel()->currentIndex() == QModelIndex() ) - { - cDebug() << "No disk selected, bailing out."; - return; - } - - QFormLayout* layout = new QFormLayout; - m_previewFrame->setLayout( layout ); - 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->setLabelsVisible( true ); - preview->setModel( info.partitionModelBefore ); - info.partitionModelBefore->setParent( m_previewFrame ); - layout->addRow( tr( "Before:" ), preview ); - - preview = new PartitionPreview; - preview->setLabelsVisible( true ); - preview->setModel( info.partitionModelAfter ); - info.partitionModelAfter->setParent( m_previewFrame ); - layout->addRow( tr( "After:" ), preview ); - } -} - qint64 -EraseDiskPage::swapSuggestion( const qint64 availableSpaceB ) const { +swapSuggestion( const qint64 availableSpaceB ) +{ #define MiB * static_cast< qint64 >( 1024 ) * 1024 #define GiB * static_cast< qint64 >( 1024 ) * 1024 * 1024 @@ -333,3 +94,105 @@ EraseDiskPage::swapSuggestion( const qint64 availableSpaceB ) const { return suggestedSwapSizeB; } + + +void +doAutopartition( PartitionCoreModule* core, Device* dev ) +{ + bool isEfi = false; + if ( QDir( "/sys/firmware/efi/efivars" ).exists() ) + isEfi = true; + +#define MiB * static_cast< qint64 >( 1024 ) * 1024 +#define GiB * static_cast< qint64 >( 1024 ) * 1024 * 1024 + + // Partition sizes are expressed in MiB, should be multiples of + // the logical sector size (usually 512B). + int uefisys_part_size = 0; + int empty_space_size = 0; + if ( isEfi ) + { + uefisys_part_size = 300; + empty_space_size = 2; + } + else + { + // we start with a 1MiB offset before the first partition + empty_space_size = 1; + } + + qint64 firstFreeSector = empty_space_size MiB / dev->logicalSectorSize() + 1; + + if ( isEfi ) + { + qint64 lastSector = firstFreeSector + ( uefisys_part_size MiB / dev->logicalSectorSize() ); + core->createPartitionTable( dev, PartitionTable::gpt ); + Partition* efiPartition = KPMHelpers::createNewPartition( + dev->partitionTable(), + *dev, + PartitionRole( PartitionRole::Primary ), + FileSystem::Fat32, + firstFreeSector, + lastSector + ); + PartitionInfo::setFormat( efiPartition, true ); + PartitionInfo::setMountPoint( efiPartition, Calamares::JobQueue::instance() + ->globalStorage() + ->value( "efiSystemPartition" ) + .toString() ); + core->createPartition( dev, efiPartition ); + firstFreeSector = lastSector + 1; + } + else + { + core->createPartitionTable( dev, PartitionTable::msdos ); + } + + bool shouldCreateSwap = false; + qint64 availableSpaceB = ( dev->totalSectors() - firstFreeSector ) * dev->logicalSectorSize(); + qint64 suggestedSwapSizeB = swapSuggestion( availableSpaceB ); + qint64 requiredSpaceB = + ( Calamares::JobQueue::instance()-> + globalStorage()-> + value( "requiredStorageGB" ).toDouble() + 0.1 + 2.0 ) GiB + + suggestedSwapSizeB; + + // If there is enough room for ESP + root + swap, create swap, otherwise don't. + shouldCreateSwap = availableSpaceB > requiredSpaceB; + + qint64 lastSectorForRoot = dev->totalSectors() - 1; //last sector of the device + if ( shouldCreateSwap ) + { + lastSectorForRoot -= suggestedSwapSizeB / dev->logicalSectorSize() + 1; + } + + Partition* rootPartition = KPMHelpers::createNewPartition( + dev->partitionTable(), + *dev, + PartitionRole( PartitionRole::Primary ), + FileSystem::Ext4, + firstFreeSector, + lastSectorForRoot + ); + PartitionInfo::setFormat( rootPartition, true ); + PartitionInfo::setMountPoint( rootPartition, "/" ); + core->createPartition( dev, rootPartition ); + + if ( shouldCreateSwap ) + { + Partition* swapPartition = KPMHelpers::createNewPartition( + dev->partitionTable(), + *dev, + PartitionRole( PartitionRole::Primary ), + FileSystem::LinuxSwap, + lastSectorForRoot + 1, + dev->totalSectors() - 1 + ); + PartitionInfo::setFormat( swapPartition, true ); + core->createPartition( dev, swapPartition ); + } + + core->dumpQueue(); +} + +} diff --git a/src/modules/partition/gui/EraseDiskPage.h b/src/modules/partition/core/PartitionActions.h similarity index 54% rename from src/modules/partition/gui/EraseDiskPage.h rename to src/modules/partition/core/PartitionActions.h index 227d2e113..4c6a0562c 100644 --- a/src/modules/partition/gui/EraseDiskPage.h +++ b/src/modules/partition/core/PartitionActions.h @@ -16,42 +16,15 @@ * along with Calamares. If not, see . */ -#ifndef ERASEDISKPAGE_H -#define ERASEDISKPAGE_H - -#include -#include +#ifndef PARTITIONACTIONS_H +#define PARTITIONACTIONS_H class PartitionCoreModule; -class QListView; class Device; -class EraseDiskPage : public QWidget +namespace PartitionActions { - Q_OBJECT -public: - explicit EraseDiskPage( QWidget* parent = nullptr ); +void doAutopartition( PartitionCoreModule* core, Device* dev ); +} - void init( PartitionCoreModule* core ); - - bool isNextEnabled() const; - -signals: - void nextStatusChanged( bool ); - -private: - void setNextEnabled( bool enabled ); - void doAutopartition( Device* dev ); - void updatePreviews(); - qint64 swapSuggestion( const qint64 availableSpaceB ) const; - - QListView* m_drivesView; - PartitionCoreModule* m_core; - QWidget* m_previewFrame; - - QMutex m_previewsMutex; - - bool m_nextEnabled; -}; - -#endif // ERASEDISKPAGE_H +#endif // PARTITIONACTIONS_H