From fcadc9a2b23f65cfebb0c7f60c4f9e7d963ed4ec Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 29 May 2024 12:08:04 +0200 Subject: [PATCH] Wizards: Provide mechanism to skip pages Our wizard infrastructure makes it hard to dynamically remove or add wizard pages on the fly while using the wizard. So, instead of removing pages and re-adding them on need just provide a way to skip pages. Skipping pages is provided with this patch limited to wizards which are known to be sub projects. For now this is just a preparation as no wizard actively sets the property for being a sub project or makes use of this mechanism. Change-Id: I3efd079ccb5be2203d2b17b3765d9f178998d5f4 Reviewed-by: Eike Ziller --- src/libs/utils/wizard.cpp | 27 +++++++++++++++++++++++++++ src/libs/utils/wizard.h | 4 ++++ src/libs/utils/wizardpage.h | 4 ++++ 3 files changed, 35 insertions(+) diff --git a/src/libs/utils/wizard.cpp b/src/libs/utils/wizard.cpp index f611d512319..71069e60f66 100644 --- a/src/libs/utils/wizard.cpp +++ b/src/libs/utils/wizard.cpp @@ -276,6 +276,7 @@ public: bool m_automaticProgressCreation = true; WizardProgress *m_wizardProgress = nullptr; QSet m_fieldNames; + bool m_skipForSubproject = false; }; Wizard::Wizard(QWidget *parent, Qt::WindowFlags flags) : @@ -525,6 +526,32 @@ void Wizard::_q_pageRemoved(int pageId) d->m_wizardProgress->removeItem(item); } +void Wizard::setSkipForSubprojects(bool skip) +{ + Q_D(Wizard); + d->m_skipForSubproject = skip; +} + +int Wizard::nextId() const +{ + Q_D(const Wizard); + if (!d->m_skipForSubproject) + return QWizard::nextId(); + + const QList allIds = pageIds(); + int index = allIds.indexOf(currentId()); + QTC_ASSERT(index > -1, return QWizard::nextId()); + + while (++index < allIds.size()) { + if (auto wp = qobject_cast(page(index))) { + if (!wp->skipForSubprojects()) + return index; + } + } + QTC_CHECK(false); // should not happen + return QWizard::nextId(); +} + class WizardProgressPrivate { WizardProgress *q_ptr; diff --git a/src/libs/utils/wizard.h b/src/libs/utils/wizard.h index 35abff2f6d7..ac3ad795bf6 100644 --- a/src/libs/utils/wizard.h +++ b/src/libs/utils/wizard.h @@ -50,6 +50,10 @@ public: void showVariables(); + // allows to skip pages + void setSkipForSubprojects(bool skip); + int nextId() const override; + protected: virtual QString stringify(const QVariant &v) const; virtual QString evaluate(const QVariant &v) const; diff --git a/src/libs/utils/wizardpage.h b/src/libs/utils/wizardpage.h index 76d3039a673..1ab23f92b5a 100644 --- a/src/libs/utils/wizardpage.h +++ b/src/libs/utils/wizardpage.h @@ -74,6 +74,9 @@ public: void registerFieldWithName(const QString &name, QWidget *widget, const char *property = nullptr, const char *changedSignal = nullptr); + void setSkipForSubprojects(bool skip) { m_skipForSubproject = skip; } + bool skipForSubprojects() const { return m_skipForSubproject; } + virtual bool handleReject(); virtual bool handleAccept(); @@ -85,6 +88,7 @@ private: void registerFieldName(const QString &name); QSet m_toRegister; + bool m_skipForSubproject = false; }; } // namespace Utils