diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2018-03-20 17:05:05 +0100 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2018-04-10 11:24:02 +0000 |
commit | bfe3bdd890c87095b3633357f921d2b4f2250a71 (patch) | |
tree | af6b0585854feeb2a57efda5810d87d477a655c3 /src/plugins/projectexplorer/targetsetuppage.h | |
parent | 990d26deba2889d70bed7287520e3cf006af45ae (diff) |
TargetSetupPage: Try to prevent a crash
Try to prevent a crash that I can not reproduce:
* Use a std::vector of TargetSetupWidgets instead of a map.
* Double-check that no nullptr will end up in that vector.
* Make sure widgets are removed from the vector before their kits
become invalid.
* Unify removal of widgets.
Change-Id: Ie57c7689033914458ca4d4f3ae11998480008ff3
Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'src/plugins/projectexplorer/targetsetuppage.h')
-rw-r--r-- | src/plugins/projectexplorer/targetsetuppage.h | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/src/plugins/projectexplorer/targetsetuppage.h b/src/plugins/projectexplorer/targetsetuppage.h index 122872cd36..cc2c96037f 100644 --- a/src/plugins/projectexplorer/targetsetuppage.h +++ b/src/plugins/projectexplorer/targetsetuppage.h @@ -68,6 +68,8 @@ public: // Call these before initializePage! void setRequiredKitPredicate(const ProjectExplorer::Kit::Predicate &predicate); void setPreferredKitPredicate(const ProjectExplorer::Kit::Predicate &predicate); + void setProjectPath(const QString &dir); + void setProjectImporter(ProjectImporter *importer); /// Sets whether the targetsetupage uses a scrollarea /// to host the widgets from the factories @@ -76,11 +78,7 @@ public: bool isComplete() const override; bool setupProject(Project *project); - bool isKitSelected(Core::Id id) const; - void setKitSelected(Core::Id id, bool selected); QList<Core::Id> selectedKits() const; - void setProjectPath(const QString &dir); - void setProjectImporter(ProjectImporter *importer); /// Overrides the summary text of the targetsetuppage void setNoteText(const QString &text); @@ -102,22 +100,28 @@ private: bool isUpdating() const; void selectAtLeastOneKit(); - void removeWidget(Kit *k); + void removeWidget(Kit *k) { removeWidget(widget(k)); } + void removeWidget(Internal::TargetSetupWidget *w); Internal::TargetSetupWidget *addWidget(Kit *k); void setupImports(); void import(const Utils::FileName &path, bool silent = false); - void setupWidgets(); + void setupWidgets(const QString &filterText = QString()); void reset(); + Internal::TargetSetupWidget *widget(Kit *k, Internal::TargetSetupWidget *fallback = nullptr) const + { return widget(k->id(), fallback); } + Internal::TargetSetupWidget *widget(const Core::Id kitId, + Internal::TargetSetupWidget *fallback = nullptr) const; + ProjectExplorer::Kit::Predicate m_requiredPredicate; ProjectExplorer::Kit::Predicate m_preferredPredicate; QPointer<ProjectImporter> m_importer = nullptr; QLayout *m_baseLayout = nullptr; QString m_projectPath; QString m_defaultShadowBuildLocation; - QMap<Core::Id, Internal::TargetSetupWidget *> m_widgets; + std::vector<Internal::TargetSetupWidget *> m_widgets; Internal::TargetSetupWidget *m_firstWidget = nullptr; Internal::TargetSetupPageUi *m_ui; @@ -127,6 +131,7 @@ private: QList<QWidget *> m_potentialWidgets; bool m_forceOptionHint = false; + bool m_widgetsWereSetUp = false; }; } // namespace ProjectExplorer |