[libcalamaresui] Handle no-finished-page scenarios

- From an exec section, next() is called automatically when
   all the jobs in that section are done.
 - If there **is** no next section (e.g. there's no finished
   page to show after the exec), then m_steps.at() would assert
   on an out-of-range index.
 - Introdcuce a helper predicate isAtVeryEnd() which handles both
   out-of-range and normal at-the-end scenarios.
 - If there's no page following the exec section, stay with the
   slideshow but update buttons to match the normal last-page
   behavior, and don't ask about cancel (since we're done).
This commit is contained in:
Adriaan de Groot 2019-06-07 21:54:07 +02:00
parent b23f4f3bb0
commit c233bbb23d
2 changed files with 31 additions and 9 deletions

View File

@ -283,18 +283,35 @@ ViewManager::next()
} }
m_currentStep++; m_currentStep++;
m_stack->setCurrentIndex( m_currentStep );
m_stack->setCurrentIndex( m_currentStep ); // Does nothing if out of range
step->onLeave(); step->onLeave();
m_steps.at( m_currentStep )->onActivate();
executing = qobject_cast< ExecutionViewStep* >( m_steps.at( m_currentStep ) ) != nullptr; if ( m_currentStep < m_steps.count() )
emit currentStepChanged(); {
m_steps.at( m_currentStep )->onActivate();
executing = qobject_cast< ExecutionViewStep* >( m_steps.at( m_currentStep ) ) != nullptr;
emit currentStepChanged();
}
else
{
// Reached the end in a weird state (e.g. no finished step after an exec)
executing = false;
m_next->setEnabled( false );
m_back->setEnabled( false );
}
updateCancelEnabled( !settings->disableCancel() && !(executing && settings->disableCancelDuringExec() ) ); updateCancelEnabled( !settings->disableCancel() && !(executing && settings->disableCancelDuringExec() ) );
} }
else else
{
step->next(); step->next();
}
m_next->setEnabled( !executing && m_steps.at( m_currentStep )->isNextEnabled() ); if ( m_currentStep < m_steps.count() )
m_back->setEnabled( !executing && m_steps.at( m_currentStep )->isBackEnabled() ); {
m_next->setEnabled( !executing && m_steps.at( m_currentStep )->isNextEnabled() );
m_back->setEnabled( !executing && m_steps.at( m_currentStep )->isBackEnabled() );
}
updateButtonLabels(); updateButtonLabels();
} }
@ -320,7 +337,7 @@ ViewManager::updateButtonLabels()
else else
m_next->setText( tr( "&Next" ) ); m_next->setText( tr( "&Next" ) );
if ( m_currentStep == m_steps.count() -1 && m_steps.last()->isAtEnd() ) if ( isAtVeryEnd() )
{ {
m_quit->setText( tr( "&Done" ) ); m_quit->setText( tr( "&Done" ) );
m_quit->setToolTip( complete ); m_quit->setToolTip( complete );
@ -368,7 +385,7 @@ bool ViewManager::confirmCancelInstallation()
const auto* const settings = Calamares::Settings::instance(); const auto* const settings = Calamares::Settings::instance();
// When we're at the very end, then it's always OK to exit. // When we're at the very end, then it's always OK to exit.
if ( m_currentStep == m_steps.count() -1 && m_steps.last()->isAtEnd() ) if ( isAtVeryEnd() )
return true; return true;
// Not at the very end, cancel/quit might be disabled // Not at the very end, cancel/quit might be disabled

View File

@ -130,7 +130,12 @@ private:
void insertViewStep( int before, ViewStep* step ); void insertViewStep( int before, ViewStep* step );
void updateButtonLabels(); void updateButtonLabels();
void updateCancelEnabled( bool enabled ); void updateCancelEnabled( bool enabled );
bool isAtVeryEnd() const
{
return ( m_currentStep >= m_steps.count() ) || ( m_currentStep == m_steps.count() - 1 && m_steps.last()->isAtEnd() );
}
static ViewManager* s_instance; static ViewManager* s_instance;
ViewStepList m_steps; ViewStepList m_steps;