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.
This commit is contained in:
Teo Mrnjavac 2016-07-15 11:25:47 +02:00
parent bc345b3ddc
commit a17f369cee
2 changed files with 70 additions and 12 deletions

View File

@ -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,
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, &current, &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();
@ -686,14 +732,24 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current,
selectedPartition = KPMHelpers::findPartitionByPath( { selectedDevice() },
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();

View File

@ -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();