[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:
parent
b23f4f3bb0
commit
c233bbb23d
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user