From e0b1290b8cb5633714574fc5ae38db912e7425f8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Sun, 8 Nov 2015 18:30:26 +0100 Subject: [PATCH] Update the bootloader picker when the chosen device changes. --- src/modules/partition/gui/ChoicePage.cpp | 45 +++++++++++++++++++++--- src/modules/partition/gui/ChoicePage.h | 1 + 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index a5623bcdd..eb6cfbdf3 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -210,22 +210,56 @@ ChoicePage::setupChoices() { QWidget* eraseWidget = new QWidget; { - eraseWidget->setLayout( new QHBoxLayout ); + QHBoxLayout* eraseLayout = new QHBoxLayout; + eraseWidget->setLayout( eraseLayout ); + eraseLayout->setContentsMargins( 0, 0, 0, 0 ); QLabel* eraseBootloaderLabel = new QLabel( eraseWidget ); - eraseWidget->layout()->addWidget( eraseBootloaderLabel ); + eraseLayout->addWidget( eraseBootloaderLabel ); eraseBootloaderLabel->setText( tr( "Boot loader location:" ) ); QComboBox* eraseBootloaderCombo = new QComboBox; - eraseWidget->layout()->addWidget( eraseBootloaderCombo ); + eraseLayout->addWidget( eraseBootloaderCombo ); eraseBootloaderLabel->setBuddy( eraseBootloaderCombo ); eraseBootloaderCombo->setModel( m_core->bootLoaderModel() ); + eraseLayout->addStretch(); + + // When the chosen bootloader device changes, we update the choice in the PCM connect( eraseBootloaderCombo, static_cast< void (QComboBox::*)(int) >( &QComboBox::currentIndexChanged ), - [=]( int /* index */ ) + [=]( int newIndex ) { - QVariant var = eraseBootloaderCombo->currentData( BootLoaderModel::BootLoaderPathRole ); + QVariant var = eraseBootloaderCombo->itemData( newIndex, BootLoaderModel::BootLoaderPathRole ); if ( !var.isValid() ) return; m_core->setBootLoaderInstallPath( var.toString() ); } ); + + // If the user picks a new device, we update the bootloader choice to that + // same device automatically. + auto updateBootloaderDevice = [eraseBootloaderCombo]( Device* currd ) + { + if ( !currd ) + return; + QString devPath = currd->deviceNode(); + for ( int i = 0; i < eraseBootloaderCombo->count(); ++i ) + { + QVariant var = eraseBootloaderCombo->itemData( i , BootLoaderModel::BootLoaderPathRole ); + if ( !var.isValid() ) + continue; + if ( var.toString() == devPath ) + { + eraseBootloaderCombo->setCurrentIndex( i ); + return; + } + } + }; + connect( this, &ChoicePage::deviceChosen, + this, updateBootloaderDevice ); + connect( m_eraseButton, &ExpandableRadioButton::expanded, + this, [=]( bool expanded ) + { + if ( expanded ) + updateBootloaderDevice( selectedDevice() ); + }, Qt::QueuedConnection ); + // ^ Must be Queued so it's sure to run when the widget is already visible. } m_eraseButton->setExpandableWidget( eraseWidget ); } @@ -394,6 +428,7 @@ ChoicePage::applyDeviceChoice() m_lastSelectedDeviceIndex = drivesList->selectionModel()->currentIndex().row(); emit actionChosen(); + emit deviceChosen( currd ); } diff --git a/src/modules/partition/gui/ChoicePage.h b/src/modules/partition/gui/ChoicePage.h index 12d3fc945..e261bb63d 100644 --- a/src/modules/partition/gui/ChoicePage.h +++ b/src/modules/partition/gui/ChoicePage.h @@ -63,6 +63,7 @@ public: signals: void nextStatusChanged( bool ); void actionChosen(); + void deviceChosen( Device* ); private: bool compact();