QmlDesigner: Improve ownership for ViewManager additionalViews

Change-Id: I0fc72336ea612324ae900cbffae10721ab3863c8
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2022-01-04 16:01:24 +01:00
parent 9d8a419d10
commit 5c98d40901
4 changed files with 46 additions and 47 deletions

View File

@@ -58,15 +58,14 @@
namespace QmlDesigner { namespace QmlDesigner {
AssetExporterPlugin::AssetExporterPlugin() : AssetExporterPlugin::AssetExporterPlugin()
m_view(new AssetExporterView)
{ {
ProjectExplorer::TaskHub::addCategory( Constants::TASK_CATEGORY_ASSET_EXPORT, ProjectExplorer::TaskHub::addCategory( Constants::TASK_CATEGORY_ASSET_EXPORT,
tr("Asset Export"), false); tr("Asset Export"), false);
auto *designerPlugin = QmlDesigner::QmlDesignerPlugin::instance(); auto *designerPlugin = QmlDesigner::QmlDesignerPlugin::instance();
auto &viewManager = designerPlugin->viewManager(); auto &viewManager = designerPlugin->viewManager();
viewManager.registerViewTakingOwnership(m_view); m_view = viewManager.registerView(std::make_unique<AssetExporterView>());
// Add dumper templates for factory instantiation. // Add dumper templates for factory instantiation.
Component::addNodeDumper<ItemNodeDumper>(); Component::addNodeDumper<ItemNodeDumper>();

View File

@@ -72,7 +72,13 @@ public:
void resetPropertyEditorView(); void resetPropertyEditorView();
void registerFormEditorToolTakingOwnership(AbstractCustomTool *tool); void registerFormEditorToolTakingOwnership(AbstractCustomTool *tool);
void registerViewTakingOwnership(AbstractView *view); template<typename View>
View *registerView(std::unique_ptr<View> &&view)
{
auto notOwningPointer = view.get();
addView(std::move(view));
return notOwningPointer;
}
QList<WidgetInfo> widgetInfos() const; QList<WidgetInfo> widgetInfos() const;
QWidget *widget(const QString & uniqueId) const; QWidget *widget(const QString & uniqueId) const;
@@ -109,6 +115,8 @@ public:
private: // functions private: // functions
Q_DISABLE_COPY(ViewManager) Q_DISABLE_COPY(ViewManager)
void addView(std::unique_ptr<AbstractView> &&view);
void attachNodeInstanceView(); void attachNodeInstanceView();
void attachItemLibraryView(); void attachItemLibraryView();
void attachAdditionalViews(); void attachAdditionalViews();
@@ -121,8 +129,8 @@ private: // functions
void switchStateEditorViewToBaseState(); void switchStateEditorViewToBaseState();
void switchStateEditorViewToSavedState(); void switchStateEditorViewToSavedState();
QList<QPointer<AbstractView>> views() const; QList<AbstractView *> views() const;
const QList<QPointer<AbstractView> > standardViews() const; QList<AbstractView *> standardViews() const;
private: // variables private: // variables
std::unique_ptr<ViewManagerData> d; std::unique_ptr<ViewManagerData> d;

View File

@@ -76,7 +76,7 @@ public:
PropertyEditorView propertyEditorView; PropertyEditorView propertyEditorView;
StatesEditorView statesEditorView; StatesEditorView statesEditorView;
QList<QPointer<AbstractView> > additionalViews; std::vector<std::unique_ptr<AbstractView>> additionalViews;
bool disableStandardViews = false; bool disableStandardViews = false;
}; };
@@ -94,12 +94,7 @@ ViewManager::ViewManager()
}); });
} }
ViewManager::~ViewManager() ViewManager::~ViewManager() = default;
{
for (const QPointer<AbstractView> &view : qAsConst(d->additionalViews))
delete view.data();
}
DesignDocument *ViewManager::currentDesignDocument() const DesignDocument *ViewManager::currentDesignDocument() const
{ {
@@ -169,25 +164,24 @@ void ViewManager::switchStateEditorViewToSavedState()
d->statesEditorView.setCurrentState(d->savedState); d->statesEditorView.setCurrentState(d->savedState);
} }
QList<QPointer<AbstractView> > ViewManager::views() const QList<AbstractView *> ViewManager::views() const
{ {
auto list = d->additionalViews; auto list = Utils::transform<QList<AbstractView *>>(d->additionalViews,
[](auto &&view) { return view.get(); });
list.append(standardViews()); list.append(standardViews());
return list; return list;
} }
const QList<QPointer<AbstractView> > ViewManager::standardViews() const QList<AbstractView *> ViewManager::standardViews() const
{ {
QList<QPointer<AbstractView>> list = { QList<AbstractView *> list = {&d->edit3DView,
&d->edit3DView, &d->formEditorView,
&d->formEditorView, &d->textEditorView,
&d->textEditorView, &d->itemLibraryView,
&d->itemLibraryView, &d->navigatorView,
&d->navigatorView, &d->propertyEditorView,
&d->propertyEditorView, &d->statesEditorView,
&d->statesEditorView, &d->designerActionManagerView};
&d->designerActionManagerView
};
if (QmlDesignerPlugin::instance()->settings().value( if (QmlDesignerPlugin::instance()->settings().value(
DesignerSettingsKey::ENABLE_DEBUGVIEW).toBool()) DesignerSettingsKey::ENABLE_DEBUGVIEW).toBool())
@@ -206,11 +200,6 @@ void ViewManager::registerFormEditorToolTakingOwnership(AbstractCustomTool *tool
d->formEditorView.registerTool(tool); d->formEditorView.registerTool(tool);
} }
void ViewManager::registerViewTakingOwnership(AbstractView *view)
{
d->additionalViews.append(view);
}
void ViewManager::detachViewsExceptRewriterAndComponetView() void ViewManager::detachViewsExceptRewriterAndComponetView()
{ {
switchStateEditorViewToBaseState(); switchStateEditorViewToBaseState();
@@ -228,14 +217,14 @@ void ViewManager::attachItemLibraryView()
void ViewManager::attachAdditionalViews() void ViewManager::attachAdditionalViews()
{ {
foreach (const QPointer<AbstractView> &view, d->additionalViews) for (auto &view : d->additionalViews)
currentModel()->attachView(view.data()); currentModel()->attachView(view.get());
} }
void ViewManager::detachAdditionalViews() void ViewManager::detachAdditionalViews()
{ {
foreach (const QPointer<AbstractView> &view, d->additionalViews) for (auto &view : d->additionalViews)
currentModel()->detachView(view.data()); currentModel()->detachView(view.get());
} }
void ViewManager::detachStandardViews() void ViewManager::detachStandardViews()
@@ -337,9 +326,9 @@ QList<WidgetInfo> ViewManager::widgetInfos() const
if (d->debugView.hasWidget()) if (d->debugView.hasWidget())
widgetInfoList.append(d->debugView.widgetInfo()); widgetInfoList.append(d->debugView.widgetInfo());
foreach (const QPointer<AbstractView> &abstractView, d->additionalViews) { for (auto &view : d->additionalViews) {
if (abstractView && abstractView->hasWidget()) if (view->hasWidget())
widgetInfoList.append(abstractView->widgetInfo()); widgetInfoList.append(view->widgetInfo());
} }
Utils::sort(widgetInfoList, [](const WidgetInfo &firstWidgetInfo, const WidgetInfo &secondWidgetInfo) { Utils::sort(widgetInfoList, [](const WidgetInfo &firstWidgetInfo, const WidgetInfo &secondWidgetInfo) {
@@ -457,6 +446,11 @@ AsynchronousImageCache &ViewManager::imageCache()
return d->itemLibraryView.imageCache(); return d->itemLibraryView.imageCache();
} }
void ViewManager::addView(std::unique_ptr<AbstractView> &&view)
{
d->additionalViews.push_back(std::move(view));
}
} // namespace QmlDesigner } // namespace QmlDesigner
#endif //QMLDESIGNER_TEST #endif //QMLDESIGNER_TEST

View File

@@ -249,22 +249,20 @@ bool QmlDesignerPlugin::delayedInitialize()
d->settings.fromSettings(Core::ICore::settings()); d->settings.fromSettings(Core::ICore::settings());
d->viewManager.registerViewTakingOwnership(new QmlDesigner::Internal::ConnectionView); d->viewManager.registerView(std::make_unique<QmlDesigner::Internal::ConnectionView>());
if (DesignerSettings::getValue(DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool()) { if (DesignerSettings::getValue(DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool()) {
auto timelineView = new QmlDesigner::TimelineView; auto timelineView = d->viewManager.registerView(std::make_unique<QmlDesigner::TimelineView>());
d->viewManager.registerViewTakingOwnership(timelineView);
timelineView->registerActions(); timelineView->registerActions();
auto curveEditorView = new QmlDesigner::CurveEditorView; d->viewManager.registerView(std::make_unique<QmlDesigner::CurveEditorView>());
d->viewManager.registerViewTakingOwnership(curveEditorView);
auto eventlistView = new QmlDesigner::EventListPluginView; auto eventlistView = d->viewManager.registerView(
d->viewManager.registerViewTakingOwnership(eventlistView); std::make_unique<QmlDesigner::EventListPluginView>());
eventlistView->registerActions(); eventlistView->registerActions();
} }
auto transitionEditorView = new QmlDesigner::TransitionEditorView; auto transitionEditorView = d->viewManager.registerView(
d->viewManager.registerViewTakingOwnership(transitionEditorView); std::make_unique<QmlDesigner::TransitionEditorView>());
transitionEditorView->registerActions(); transitionEditorView->registerActions();
d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::SourceTool); d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::SourceTool);