From c233bbb23df6464634e9a5ecf307b9729995f158 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 7 Jun 2019 21:54:07 +0200 Subject: [PATCH] [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). --- src/libcalamaresui/ViewManager.cpp | 33 ++++++++++++++++++++++-------- src/libcalamaresui/ViewManager.h | 7 ++++++- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 508581b4e..3a5d24feb 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -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 diff --git a/src/libcalamaresui/ViewManager.h b/src/libcalamaresui/ViewManager.h index 50e8d1dc4..c9f554ee8 100644 --- a/src/libcalamaresui/ViewManager.h +++ b/src/libcalamaresui/ViewManager.h @@ -130,7 +130,12 @@ private: void insertViewStep( int before, ViewStep* step ); 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;