From a17f369ceee9ba0d41219a20e8ffc3e4e68f571f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Jul 2016 11:25:47 +0200 Subject: [PATCH] React to reuse home checkbox by setting /home mount point. Rearranged Replace workflow a bit: onPartitionReplaceSelected is now the on choice slot, which in turn calls doReplaceSelectedPartition. onHomeCheckBoxStateChanged also calls doReplaceSelectedPartition if we need to redo the Replace task with/without a separate home to keep. m_reuseHomeCheckBox is hidden by default. --- src/modules/partition/gui/ChoicePage.cpp | 78 ++++++++++++++++++++---- src/modules/partition/gui/ChoicePage.h | 4 +- 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index b740c23c9..95bcb2c51 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -128,7 +128,7 @@ ChoicePage::ChoicePage( QWidget* parent ) m_previewAfterLabel->hide(); m_previewAfterFrame->hide(); m_encryptWidget->hide(); - // end + m_reuseHomeCheckBox->hide(); } @@ -166,6 +166,8 @@ ChoicePage::init( PartitionCoreModule* core ) connect( m_encryptWidget, &EncryptWidget::stateChanged, this, &ChoicePage::onEncryptWidgetStateChanged ); + connect( m_reuseHomeCheckBox, &QCheckBox::stateChanged, + this, &ChoicePage::onHomeCheckBoxStateChanged ); ChoicePage::applyDeviceChoice(); } @@ -374,14 +376,18 @@ ChoicePage::applyActionChoice( ChoicePage::Choice choice ) } ), [ = ] { - PartitionActions::doAutopartition( m_core, selectedDevice(), m_encryptWidget->passphrase() ); + PartitionActions::doAutopartition( m_core, + selectedDevice(), + m_encryptWidget->passphrase() ); emit deviceChosen(); }, this ); } else { - PartitionActions::doAutopartition( m_core, selectedDevice(), m_encryptWidget->passphrase() ); + PartitionActions::doAutopartition( m_core, + selectedDevice(), + m_encryptWidget->passphrase() ); emit deviceChosen(); } @@ -400,7 +406,7 @@ ChoicePage::applyActionChoice( ChoicePage::Choice choice ) updateNextEnabled(); connect( m_beforePartitionBarsView->selectionModel(), SIGNAL( currentRowChanged( QModelIndex, QModelIndex ) ), - this, SLOT( doReplaceSelectedPartition( QModelIndex, QModelIndex ) ), + this, SLOT( onPartitionToReplaceSelected( QModelIndex, QModelIndex ) ), Qt::UniqueConnection ); break; @@ -500,14 +506,26 @@ ChoicePage::onEncryptWidgetStateChanged() { doReplaceSelectedPartition( m_beforePartitionBarsView-> selectionModel()-> - currentIndex(), - QModelIndex() ); + currentIndex() ); } } updateNextEnabled(); } +void +ChoicePage::onHomeCheckBoxStateChanged() +{ + if ( currentChoice() == Replace && + m_beforePartitionBarsView->selectionModel()->currentIndex().isValid() ) + { + doReplaceSelectedPartition( m_beforePartitionBarsView-> + selectionModel()-> + currentIndex() ); + } +} + + void ChoicePage::onLeave() { @@ -616,14 +634,33 @@ ChoicePage::doAlongsideApply() void -ChoicePage::doReplaceSelectedPartition( const QModelIndex& current, - const QModelIndex& previous ) +ChoicePage::onPartitionToReplaceSelected( const QModelIndex& current, + const QModelIndex& previous ) { Q_UNUSED( previous ); if ( !current.isValid() ) return; - ScanningDialog::run( QtConcurrent::run( [ = ] + // Reset state on selection regardless of whether this will be used. + m_reuseHomeCheckBox->setChecked( false ); + + doReplaceSelectedPartition( current ); +} + + +void +ChoicePage::doReplaceSelectedPartition( const QModelIndex& current ) +{ + if ( !current.isValid() ) + return; + + QString homePartitionPath; + bool doReuseHomePartition = m_reuseHomeCheckBox->isChecked(); + + // NOTE: using by-ref captures because we need to write homePartitionPath and + // doReuseHomePartition *after* the device revert, for later use. + ScanningDialog::run( QtConcurrent::run( + [ this, ¤t, &homePartitionPath, &doReuseHomePartition ] { QMutexLocker locker( &m_coreMutex ); @@ -632,11 +669,20 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current, m_core->revertDevice( selectedDevice() ); } + // Find out is the selected partition has a rootfs. If yes, then make the + // m_reuseHomeCheckBox visible and set its text to something meaningful. + homePartitionPath = current.data( PartitionModel::OsproberHomePartitionPathRole ).toString(); + if ( homePartitionPath.isEmpty() ) + doReuseHomePartition = false; + // if the partition is unallocated(free space), we don't replace it but create new one // with the same first and last sector Partition* selectedPartition = (Partition *)( current.data( PartitionModel::PartitionPtrRole ).value< void* >() ); if ( KPMHelpers::isPartitionFreeSpace( selectedPartition ) ) { + //NOTE: if the selected partition is free space, we don't deal with + // a separate /home partition at all because there's no existing + // rootfs to read it from. PartitionRole newRoles = PartitionRole( PartitionRole::Primary ); PartitionNode* newParent = selectedDevice()->partitionTable(); @@ -684,16 +730,26 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current, // main DeviceModel, not the immutable copy. QString partPath = current.data( PartitionModel::PartitionPathRole ).toString(); selectedPartition = KPMHelpers::findPartitionByPath( { selectedDevice() }, - partPath ); + partPath ); if ( selectedPartition ) + { PartitionActions::doReplacePartition( m_core, selectedDevice(), selectedPartition, m_encryptWidget->passphrase() ); + Partition* homePartition = KPMHelpers::findPartitionByPath( { selectedDevice() }, + homePartitionPath ); + if ( homePartition ) + { + PartitionInfo::setMountPoint( homePartition, "/home" ); + } + } } } ), - [=] + [&] { + m_reuseHomeCheckBox->setVisible( !homePartitionPath.isEmpty() ); + if ( m_isEfi ) setupEfiSystemPartitionSelector(); diff --git a/src/modules/partition/gui/ChoicePage.h b/src/modules/partition/gui/ChoicePage.h index 4b2753cc7..92f9c14a0 100644 --- a/src/modules/partition/gui/ChoicePage.h +++ b/src/modules/partition/gui/ChoicePage.h @@ -73,9 +73,11 @@ signals: void deviceChosen(); private slots: - void doReplaceSelectedPartition( const QModelIndex& current, const QModelIndex& previous ); + void onPartitionToReplaceSelected( const QModelIndex& current, const QModelIndex& previous ); + void doReplaceSelectedPartition( const QModelIndex& current ); void doAlongsideSetupSplitter( const QModelIndex& current, const QModelIndex& previous ); void onEncryptWidgetStateChanged(); + void onHomeCheckBoxStateChanged(); private: void updateNextEnabled();