From 5c98d409012adba8d5cd991b488da590e550f68e Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 4 Jan 2022 16:01:24 +0100 Subject: [PATCH] QmlDesigner: Improve ownership for ViewManager additionalViews Change-Id: I0fc72336ea612324ae900cbffae10721ab3863c8 Reviewed-by: Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../assetexporterplugin.cpp | 5 +- .../designercore/include/viewmanager.h | 14 ++++- .../designercore/model/viewmanager.cpp | 58 +++++++++---------- src/plugins/qmldesigner/qmldesignerplugin.cpp | 16 +++-- 4 files changed, 46 insertions(+), 47 deletions(-) diff --git a/src/plugins/qmldesigner/assetexporterplugin/assetexporterplugin.cpp b/src/plugins/qmldesigner/assetexporterplugin/assetexporterplugin.cpp index 1c6e6d65df6..7809b57e71b 100644 --- a/src/plugins/qmldesigner/assetexporterplugin/assetexporterplugin.cpp +++ b/src/plugins/qmldesigner/assetexporterplugin/assetexporterplugin.cpp @@ -58,15 +58,14 @@ namespace QmlDesigner { -AssetExporterPlugin::AssetExporterPlugin() : - m_view(new AssetExporterView) +AssetExporterPlugin::AssetExporterPlugin() { ProjectExplorer::TaskHub::addCategory( Constants::TASK_CATEGORY_ASSET_EXPORT, tr("Asset Export"), false); auto *designerPlugin = QmlDesigner::QmlDesignerPlugin::instance(); auto &viewManager = designerPlugin->viewManager(); - viewManager.registerViewTakingOwnership(m_view); + m_view = viewManager.registerView(std::make_unique()); // Add dumper templates for factory instantiation. Component::addNodeDumper(); diff --git a/src/plugins/qmldesigner/designercore/include/viewmanager.h b/src/plugins/qmldesigner/designercore/include/viewmanager.h index af4bf8bb24f..901edee71ea 100644 --- a/src/plugins/qmldesigner/designercore/include/viewmanager.h +++ b/src/plugins/qmldesigner/designercore/include/viewmanager.h @@ -72,7 +72,13 @@ public: void resetPropertyEditorView(); void registerFormEditorToolTakingOwnership(AbstractCustomTool *tool); - void registerViewTakingOwnership(AbstractView *view); + template + View *registerView(std::unique_ptr &&view) + { + auto notOwningPointer = view.get(); + addView(std::move(view)); + return notOwningPointer; + } QList widgetInfos() const; QWidget *widget(const QString & uniqueId) const; @@ -109,6 +115,8 @@ public: private: // functions Q_DISABLE_COPY(ViewManager) + void addView(std::unique_ptr &&view); + void attachNodeInstanceView(); void attachItemLibraryView(); void attachAdditionalViews(); @@ -121,8 +129,8 @@ private: // functions void switchStateEditorViewToBaseState(); void switchStateEditorViewToSavedState(); - QList> views() const; - const QList > standardViews() const; + QList views() const; + QList standardViews() const; private: // variables std::unique_ptr d; diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp index c20ecf4b61d..3a00435d6b6 100644 --- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp @@ -76,7 +76,7 @@ public: PropertyEditorView propertyEditorView; StatesEditorView statesEditorView; - QList > additionalViews; + std::vector> additionalViews; bool disableStandardViews = false; }; @@ -94,12 +94,7 @@ ViewManager::ViewManager() }); } -ViewManager::~ViewManager() -{ - for (const QPointer &view : qAsConst(d->additionalViews)) - delete view.data(); - -} +ViewManager::~ViewManager() = default; DesignDocument *ViewManager::currentDesignDocument() const { @@ -169,25 +164,24 @@ void ViewManager::switchStateEditorViewToSavedState() d->statesEditorView.setCurrentState(d->savedState); } -QList > ViewManager::views() const +QList ViewManager::views() const { - auto list = d->additionalViews; + auto list = Utils::transform>(d->additionalViews, + [](auto &&view) { return view.get(); }); list.append(standardViews()); return list; } -const QList > ViewManager::standardViews() const +QList ViewManager::standardViews() const { - QList> list = { - &d->edit3DView, - &d->formEditorView, - &d->textEditorView, - &d->itemLibraryView, - &d->navigatorView, - &d->propertyEditorView, - &d->statesEditorView, - &d->designerActionManagerView - }; + QList list = {&d->edit3DView, + &d->formEditorView, + &d->textEditorView, + &d->itemLibraryView, + &d->navigatorView, + &d->propertyEditorView, + &d->statesEditorView, + &d->designerActionManagerView}; if (QmlDesignerPlugin::instance()->settings().value( DesignerSettingsKey::ENABLE_DEBUGVIEW).toBool()) @@ -206,11 +200,6 @@ void ViewManager::registerFormEditorToolTakingOwnership(AbstractCustomTool *tool d->formEditorView.registerTool(tool); } -void ViewManager::registerViewTakingOwnership(AbstractView *view) -{ - d->additionalViews.append(view); -} - void ViewManager::detachViewsExceptRewriterAndComponetView() { switchStateEditorViewToBaseState(); @@ -228,14 +217,14 @@ void ViewManager::attachItemLibraryView() void ViewManager::attachAdditionalViews() { - foreach (const QPointer &view, d->additionalViews) - currentModel()->attachView(view.data()); + for (auto &view : d->additionalViews) + currentModel()->attachView(view.get()); } void ViewManager::detachAdditionalViews() { - foreach (const QPointer &view, d->additionalViews) - currentModel()->detachView(view.data()); + for (auto &view : d->additionalViews) + currentModel()->detachView(view.get()); } void ViewManager::detachStandardViews() @@ -337,9 +326,9 @@ QList ViewManager::widgetInfos() const if (d->debugView.hasWidget()) widgetInfoList.append(d->debugView.widgetInfo()); - foreach (const QPointer &abstractView, d->additionalViews) { - if (abstractView && abstractView->hasWidget()) - widgetInfoList.append(abstractView->widgetInfo()); + for (auto &view : d->additionalViews) { + if (view->hasWidget()) + widgetInfoList.append(view->widgetInfo()); } Utils::sort(widgetInfoList, [](const WidgetInfo &firstWidgetInfo, const WidgetInfo &secondWidgetInfo) { @@ -457,6 +446,11 @@ AsynchronousImageCache &ViewManager::imageCache() return d->itemLibraryView.imageCache(); } +void ViewManager::addView(std::unique_ptr &&view) +{ + d->additionalViews.push_back(std::move(view)); +} + } // namespace QmlDesigner #endif //QMLDESIGNER_TEST diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 33e276f0046..9dbfd5eb52d 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -249,22 +249,20 @@ bool QmlDesignerPlugin::delayedInitialize() d->settings.fromSettings(Core::ICore::settings()); - d->viewManager.registerViewTakingOwnership(new QmlDesigner::Internal::ConnectionView); + d->viewManager.registerView(std::make_unique()); if (DesignerSettings::getValue(DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool()) { - auto timelineView = new QmlDesigner::TimelineView; - d->viewManager.registerViewTakingOwnership(timelineView); + auto timelineView = d->viewManager.registerView(std::make_unique()); timelineView->registerActions(); - auto curveEditorView = new QmlDesigner::CurveEditorView; - d->viewManager.registerViewTakingOwnership(curveEditorView); + d->viewManager.registerView(std::make_unique()); - auto eventlistView = new QmlDesigner::EventListPluginView; - d->viewManager.registerViewTakingOwnership(eventlistView); + auto eventlistView = d->viewManager.registerView( + std::make_unique()); eventlistView->registerActions(); } - auto transitionEditorView = new QmlDesigner::TransitionEditorView; - d->viewManager.registerViewTakingOwnership(transitionEditorView); + auto transitionEditorView = d->viewManager.registerView( + std::make_unique()); transitionEditorView->registerActions(); d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::SourceTool);