[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_stack->setCurrentIndex( m_currentStep );
m_stack->setCurrentIndex( m_currentStep ); // Does nothing if out of range
step->onLeave();
m_steps.at( m_currentStep )->onActivate();
executing = qobject_cast< ExecutionViewStep* >( m_steps.at( m_currentStep ) ) != nullptr;
emit currentStepChanged();
if ( m_currentStep < m_steps.count() )
{
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() ) );
}
else
{
step->next();
}
m_next->setEnabled( !executing && m_steps.at( m_currentStep )->isNextEnabled() );
m_back->setEnabled( !executing && m_steps.at( m_currentStep )->isBackEnabled() );
if ( m_currentStep < m_steps.count() )
{
m_next->setEnabled( !executing && m_steps.at( m_currentStep )->isNextEnabled() );
m_back->setEnabled( !executing && m_steps.at( m_currentStep )->isBackEnabled() );
}
updateButtonLabels();
}
@ -320,7 +337,7 @@ ViewManager::updateButtonLabels()
else
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->setToolTip( complete );
@ -368,7 +385,7 @@ bool ViewManager::confirmCancelInstallation()
const auto* const settings = Calamares::Settings::instance();
// 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;
// Not at the very end, cancel/quit might be disabled

View File

@ -131,6 +131,11 @@ private:
void updateButtonLabels();
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;
ViewStepList m_steps;