From e0cc2a3ebe9478873921e665520857cef37e9174 Mon Sep 17 00:00:00 2001 From: Andrzej Biniek Date: Wed, 2 Apr 2025 07:32:22 +0200 Subject: [PATCH] QMLDesigner: Create widget registration interface Task-number: QDS-14898 Change-Id: I19936f19e0158808bc736ed04b4d8fd12562c508 Reviewed-by: Thomas Hartmann --- .../components/componentcore/viewmanager.cpp | 47 ++++++++----------- .../components/componentcore/viewmanager.h | 17 ++++--- .../contentlibrary/contentlibraryview.cpp | 7 +++ .../contentlibrary/contentlibraryview.h | 2 +- src/plugins/qmldesigner/designmodewidget.cpp | 2 + .../libs/designercore/include/abstractview.h | 31 +++--------- .../libs/designercore/include/widgetinfo.h | 32 +++++++++++++ .../designercore/include/widgetregistration.h | 17 +++++++ .../libs/designercore/model/abstractview.cpp | 10 ++++ 9 files changed, 105 insertions(+), 60 deletions(-) create mode 100644 src/plugins/qmldesigner/libs/designercore/include/widgetinfo.h create mode 100644 src/plugins/qmldesigner/libs/designercore/include/widgetregistration.h diff --git a/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp b/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp index 379ff6d423c..63fea75f1ae 100644 --- a/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp @@ -438,36 +438,19 @@ void ViewManager::setNodeInstanceViewTarget(ProjectExplorer::Target *target) d->nodeInstanceView.setTarget(target); } -QList ViewManager::widgetInfos() const +void ViewManager::initializeWidgetInfos() { - QList widgetInfoList; - -#ifndef QTC_USE_QML_DESIGNER_LITE - widgetInfoList.append(d->edit3DView.widgetInfo()); -#endif - widgetInfoList.append(d->formEditorView.widgetInfo()); - widgetInfoList.append(d->textEditorView.widgetInfo()); - widgetInfoList.append(d->assetsLibraryView.widgetInfo()); - widgetInfoList.append(d->itemLibraryView.widgetInfo()); - widgetInfoList.append(d->navigatorView.widgetInfo()); - widgetInfoList.append(d->propertyEditorView.widgetInfo()); -#ifndef QTC_USE_QML_DESIGNER_LITE - widgetInfoList.append(d->materialBrowserView.widgetInfo()); -#endif - widgetInfoList.append(d->statesEditorView.widgetInfo()); - - if (checkEnterpriseLicense()) - widgetInfoList.append(d->contentLibraryView.widgetInfo()); - - if (d->debugView.hasWidget()) - widgetInfoList.append(d->debugView.widgetInfo()); - - for (auto &view : d->additionalViews) { - if (view->hasWidget()) - widgetInfoList.append(view->widgetInfo()); + for (const auto &view : views()) { + if (view->hasWidget()) { + view->setWidgetRegistration(this); + view->registerWidgetInfo(); + } } +} - return widgetInfoList; +QList ViewManager::widgetInfos() +{ + return m_widgetInfo; } void ViewManager::disableWidgets() @@ -599,4 +582,14 @@ void ViewManager::addView(std::unique_ptr &&view) registerViewAction(*d->additionalViews.back()); } +void ViewManager::registerWidgetInfo(WidgetInfo info) +{ + m_widgetInfo.append(info); +} + +void ViewManager::deregisterWidgetInfo(WidgetInfo info) +{ + m_widgetInfo.removeIf(Utils::equal(&WidgetInfo::uniqueId, info.uniqueId)); +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/viewmanager.h b/src/plugins/qmldesigner/components/componentcore/viewmanager.h index 1ca067f213d..76d214981c7 100644 --- a/src/plugins/qmldesigner/components/componentcore/viewmanager.h +++ b/src/plugins/qmldesigner/components/componentcore/viewmanager.h @@ -5,10 +5,11 @@ #include -#include - #include +#include +#include + #include #include @@ -31,13 +32,12 @@ namespace Internal { class DesignModeWidget; } class ViewManagerData; -class QMLDESIGNERCOMPONENTS_EXPORT ViewManager +class QMLDESIGNERCOMPONENTS_EXPORT ViewManager : private WidgetRegistrationInterface { public: ViewManager(class AsynchronousImageCache &imageCache, class ExternalDependenciesInterface &externalDependencies); ~ViewManager(); - void attachRewriterView(); void detachRewriterView(); @@ -50,7 +50,6 @@ public: void setComponentNode(const ModelNode &componentNode); void setComponentViewToMaster(); void setNodeInstanceViewTarget(ProjectExplorer::Target *target); - void resetPropertyEditorView(); void registerFormEditorTool(std::unique_ptr &&tool); @@ -61,8 +60,7 @@ public: addView(std::move(view)); return notOwningPointer; } - - QList widgetInfos() const; + QList widgetInfos(); void disableWidgets(); void enableWidgets(); @@ -99,6 +97,9 @@ public: void hideView(AbstractView &view); void showView(AbstractView &view); + void registerWidgetInfo(WidgetInfo info) override; + void deregisterWidgetInfo(WidgetInfo info) override; + void initializeWidgetInfos(); private: // functions Q_DISABLE_COPY(ViewManager) @@ -123,10 +124,12 @@ private: // functions void registerViewActions(); void registerViewAction(AbstractView &view); void enableView(AbstractView &view); + void disableView(AbstractView &view); private: // variables std::unique_ptr d; + QList m_widgetInfo; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp index 2a181dfbc54..95c60def4ad 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -67,6 +68,12 @@ bool ContentLibraryView::hasWidget() const return true; } +void ContentLibraryView::registerWidgetInfo() +{ + if (QmlDesigner::checkEnterpriseLicense()) + AbstractView::registerWidgetInfo(); +} + WidgetInfo ContentLibraryView::widgetInfo() { if (m_widget.isNull()) { diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h index 0872d51a1bd..4fd21fafc2a 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h @@ -37,7 +37,7 @@ public: bool hasWidget() const override; WidgetInfo widgetInfo() override; - + void registerWidgetInfo() override; // AbstractView void modelAttached(Model *model) override; void modelAboutToBeDetached(Model *model) override; diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index b46ab8e161b..0778347ab2f 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -331,6 +331,8 @@ void DesignModeWidget::setup() viewCommands.append(command); } + viewManager().initializeWidgetInfos(); + // Afterwards get all the other widgets for (const auto &view : viewManager().views()) { if (!view->hasWidget()) diff --git a/src/plugins/qmldesigner/libs/designercore/include/abstractview.h b/src/plugins/qmldesigner/libs/designercore/include/abstractview.h index 79f6267162a..aace9320aa1 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/libs/designercore/include/abstractview.h @@ -6,6 +6,8 @@ #include "model.h" #include "modelnode.h" #include "qmldesignercorelib_global.h" +#include "widgetregistration.h" + #include #include @@ -37,30 +39,6 @@ class InternalNode; using InternalNodePointer = std::shared_ptr; } -enum DesignerWidgetFlags { - DisableOnError, - IgnoreErrors -}; - -class WidgetInfo { -public: - enum PlacementHint { - NoPane, - LeftPane, - RightPane, - BottomPane, - TopPane, // not used - CentralPane - }; - - QString uniqueId; - QString tabName; - QString feedbackDisplayName; - QWidget *widget = nullptr; - PlacementHint placementHint; - DesignerWidgetFlags widgetFlags = DesignerWidgetFlags::DisableOnError; -}; - class QMLDESIGNERCORE_EXPORT AbstractViewAction : public QAction { Q_OBJECT @@ -94,6 +72,8 @@ public: , m_action{Utils::makeUniqueObjectPtr(*this)} {} + void setWidgetRegistration(WidgetRegistrationInterface *interface); + virtual void registerWidgetInfo(); ~AbstractView() override; Model *model() const { return m_model.data(); } @@ -310,6 +290,7 @@ public: protected: void setModel(Model *model); void removeModel(); + static WidgetInfo createWidgetInfo( QWidget *widget = nullptr, const QString &uniqueId = QString(), @@ -319,7 +300,6 @@ protected: DesignerWidgetFlags widgetFlags = DesignerWidgetFlags::DisableOnError); void setKind(Kind kind) { m_kind = kind; } - private: QList toModelNodeList(Utils::span nodeList) const; @@ -329,6 +309,7 @@ private: bool m_visible = true; bool m_isBlockingNotifications = false; Kind m_kind = Kind::Other; + WidgetRegistrationInterface *m_widgetRegistration = nullptr; }; QMLDESIGNERCORE_EXPORT QList toModelNodeList( diff --git a/src/plugins/qmldesigner/libs/designercore/include/widgetinfo.h b/src/plugins/qmldesigner/libs/designercore/include/widgetinfo.h new file mode 100644 index 00000000000..a73fbc6ee29 --- /dev/null +++ b/src/plugins/qmldesigner/libs/designercore/include/widgetinfo.h @@ -0,0 +1,32 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +namespace QmlDesigner { + +enum DesignerWidgetFlags { DisableOnError, IgnoreErrors }; + +class WidgetInfo +{ +public: + enum PlacementHint { + NoPane, + LeftPane, + RightPane, + BottomPane, + TopPane, // not used + CentralPane + }; + + QString uniqueId; + QString tabName; + QString feedbackDisplayName; + QWidget *widget = nullptr; + PlacementHint placementHint = PlacementHint::NoPane; + DesignerWidgetFlags widgetFlags = DesignerWidgetFlags::DisableOnError; +}; + +} // namespace QmlDesigner + +Q_DECLARE_METATYPE(QmlDesigner::WidgetInfo) diff --git a/src/plugins/qmldesigner/libs/designercore/include/widgetregistration.h b/src/plugins/qmldesigner/libs/designercore/include/widgetregistration.h new file mode 100644 index 00000000000..c741831e12d --- /dev/null +++ b/src/plugins/qmldesigner/libs/designercore/include/widgetregistration.h @@ -0,0 +1,17 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include "widgetinfo.h" + +namespace QmlDesigner { + +class WidgetRegistrationInterface +{ +public: + virtual void registerWidgetInfo(WidgetInfo) = 0; + virtual void deregisterWidgetInfo(WidgetInfo) = 0; +}; + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/libs/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/libs/designercore/model/abstractview.cpp index c19ff88219e..c0a39e5879c 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/abstractview.cpp @@ -59,6 +59,16 @@ void AbstractView::setModel(Model *model) m_model = model; } +void AbstractView::setWidgetRegistration(WidgetRegistrationInterface *interface) +{ + m_widgetRegistration = interface; +} + +void AbstractView::registerWidgetInfo() +{ + if (m_widgetRegistration) + m_widgetRegistration->registerWidgetInfo(widgetInfo()); +} RewriterTransaction AbstractView::beginRewriterTransaction(const QByteArray &identifier) { return RewriterTransaction(this, identifier);