QMLDesigner: Create widget registration interface

Task-number: QDS-14898
Change-Id: I19936f19e0158808bc736ed04b4d8fd12562c508
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Andrzej Biniek
2025-04-02 07:32:22 +02:00
committed by spyro-adb
parent 9b6198b11c
commit e0cc2a3ebe
9 changed files with 105 additions and 60 deletions

View File

@@ -438,36 +438,19 @@ void ViewManager::setNodeInstanceViewTarget(ProjectExplorer::Target *target)
d->nodeInstanceView.setTarget(target); d->nodeInstanceView.setTarget(target);
} }
QList<WidgetInfo> ViewManager::widgetInfos() const void ViewManager::initializeWidgetInfos()
{ {
QList<WidgetInfo> widgetInfoList; for (const auto &view : views()) {
if (view->hasWidget()) {
#ifndef QTC_USE_QML_DESIGNER_LITE view->setWidgetRegistration(this);
widgetInfoList.append(d->edit3DView.widgetInfo()); view->registerWidgetInfo();
#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());
} }
}
return widgetInfoList; QList<WidgetInfo> ViewManager::widgetInfos()
{
return m_widgetInfo;
} }
void ViewManager::disableWidgets() void ViewManager::disableWidgets()
@@ -599,4 +582,14 @@ void ViewManager::addView(std::unique_ptr<AbstractView> &&view)
registerViewAction(*d->additionalViews.back()); 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 } // namespace QmlDesigner

View File

@@ -5,10 +5,11 @@
#include <qmldesignercomponents_global.h> #include <qmldesignercomponents_global.h>
#include <abstractview.h>
#include <coreplugin/icontext.h> #include <coreplugin/icontext.h>
#include <abstractview.h>
#include <widgetregistration.h>
#include <utils/filepath.h> #include <utils/filepath.h>
#include <QWidgetAction> #include <QWidgetAction>
@@ -31,13 +32,12 @@ namespace Internal { class DesignModeWidget; }
class ViewManagerData; class ViewManagerData;
class QMLDESIGNERCOMPONENTS_EXPORT ViewManager class QMLDESIGNERCOMPONENTS_EXPORT ViewManager : private WidgetRegistrationInterface
{ {
public: public:
ViewManager(class AsynchronousImageCache &imageCache, ViewManager(class AsynchronousImageCache &imageCache,
class ExternalDependenciesInterface &externalDependencies); class ExternalDependenciesInterface &externalDependencies);
~ViewManager(); ~ViewManager();
void attachRewriterView(); void attachRewriterView();
void detachRewriterView(); void detachRewriterView();
@@ -50,7 +50,6 @@ public:
void setComponentNode(const ModelNode &componentNode); void setComponentNode(const ModelNode &componentNode);
void setComponentViewToMaster(); void setComponentViewToMaster();
void setNodeInstanceViewTarget(ProjectExplorer::Target *target); void setNodeInstanceViewTarget(ProjectExplorer::Target *target);
void resetPropertyEditorView(); void resetPropertyEditorView();
void registerFormEditorTool(std::unique_ptr<AbstractCustomTool> &&tool); void registerFormEditorTool(std::unique_ptr<AbstractCustomTool> &&tool);
@@ -61,8 +60,7 @@ public:
addView(std::move(view)); addView(std::move(view));
return notOwningPointer; return notOwningPointer;
} }
QList<WidgetInfo> widgetInfos();
QList<WidgetInfo> widgetInfos() const;
void disableWidgets(); void disableWidgets();
void enableWidgets(); void enableWidgets();
@@ -99,6 +97,9 @@ public:
void hideView(AbstractView &view); void hideView(AbstractView &view);
void showView(AbstractView &view); void showView(AbstractView &view);
void registerWidgetInfo(WidgetInfo info) override;
void deregisterWidgetInfo(WidgetInfo info) override;
void initializeWidgetInfos();
private: // functions private: // functions
Q_DISABLE_COPY(ViewManager) Q_DISABLE_COPY(ViewManager)
@@ -123,10 +124,12 @@ private: // functions
void registerViewActions(); void registerViewActions();
void registerViewAction(AbstractView &view); void registerViewAction(AbstractView &view);
void enableView(AbstractView &view); void enableView(AbstractView &view);
void disableView(AbstractView &view); void disableView(AbstractView &view);
private: // variables private: // variables
std::unique_ptr<ViewManagerData> d; std::unique_ptr<ViewManagerData> d;
QList<WidgetInfo> m_widgetInfo;
}; };
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -19,6 +19,7 @@
#include <bundleimporter.h> #include <bundleimporter.h>
#include <designerpaths.h> #include <designerpaths.h>
#include <documentmanager.h> #include <documentmanager.h>
#include <dynamiclicensecheck.h>
#include <enumeration.h> #include <enumeration.h>
#include <externaldependenciesinterface.h> #include <externaldependenciesinterface.h>
#include <modelutils.h> #include <modelutils.h>
@@ -67,6 +68,12 @@ bool ContentLibraryView::hasWidget() const
return true; return true;
} }
void ContentLibraryView::registerWidgetInfo()
{
if (QmlDesigner::checkEnterpriseLicense())
AbstractView::registerWidgetInfo();
}
WidgetInfo ContentLibraryView::widgetInfo() WidgetInfo ContentLibraryView::widgetInfo()
{ {
if (m_widget.isNull()) { if (m_widget.isNull()) {

View File

@@ -37,7 +37,7 @@ public:
bool hasWidget() const override; bool hasWidget() const override;
WidgetInfo widgetInfo() override; WidgetInfo widgetInfo() override;
void registerWidgetInfo() override;
// AbstractView // AbstractView
void modelAttached(Model *model) override; void modelAttached(Model *model) override;
void modelAboutToBeDetached(Model *model) override; void modelAboutToBeDetached(Model *model) override;

View File

@@ -331,6 +331,8 @@ void DesignModeWidget::setup()
viewCommands.append(command); viewCommands.append(command);
} }
viewManager().initializeWidgetInfos();
// Afterwards get all the other widgets // Afterwards get all the other widgets
for (const auto &view : viewManager().views()) { for (const auto &view : viewManager().views()) {
if (!view->hasWidget()) if (!view->hasWidget())

View File

@@ -6,6 +6,8 @@
#include "model.h" #include "model.h"
#include "modelnode.h" #include "modelnode.h"
#include "qmldesignercorelib_global.h" #include "qmldesignercorelib_global.h"
#include "widgetregistration.h"
#include <commondefines.h> #include <commondefines.h>
#include <utils/span.h> #include <utils/span.h>
@@ -37,30 +39,6 @@ class InternalNode;
using InternalNodePointer = std::shared_ptr<InternalNode>; using InternalNodePointer = std::shared_ptr<InternalNode>;
} }
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 class QMLDESIGNERCORE_EXPORT AbstractViewAction : public QAction
{ {
Q_OBJECT Q_OBJECT
@@ -94,6 +72,8 @@ public:
, m_action{Utils::makeUniqueObjectPtr<AbstractViewAction>(*this)} , m_action{Utils::makeUniqueObjectPtr<AbstractViewAction>(*this)}
{} {}
void setWidgetRegistration(WidgetRegistrationInterface *interface);
virtual void registerWidgetInfo();
~AbstractView() override; ~AbstractView() override;
Model *model() const { return m_model.data(); } Model *model() const { return m_model.data(); }
@@ -310,6 +290,7 @@ public:
protected: protected:
void setModel(Model *model); void setModel(Model *model);
void removeModel(); void removeModel();
static WidgetInfo createWidgetInfo( static WidgetInfo createWidgetInfo(
QWidget *widget = nullptr, QWidget *widget = nullptr,
const QString &uniqueId = QString(), const QString &uniqueId = QString(),
@@ -319,7 +300,6 @@ protected:
DesignerWidgetFlags widgetFlags = DesignerWidgetFlags::DisableOnError); DesignerWidgetFlags widgetFlags = DesignerWidgetFlags::DisableOnError);
void setKind(Kind kind) { m_kind = kind; } void setKind(Kind kind) { m_kind = kind; }
private: private:
QList<ModelNode> toModelNodeList(Utils::span<const Internal::InternalNodePointer> nodeList) const; QList<ModelNode> toModelNodeList(Utils::span<const Internal::InternalNodePointer> nodeList) const;
@@ -329,6 +309,7 @@ private:
bool m_visible = true; bool m_visible = true;
bool m_isBlockingNotifications = false; bool m_isBlockingNotifications = false;
Kind m_kind = Kind::Other; Kind m_kind = Kind::Other;
WidgetRegistrationInterface *m_widgetRegistration = nullptr;
}; };
QMLDESIGNERCORE_EXPORT QList<ModelNode> toModelNodeList( QMLDESIGNERCORE_EXPORT QList<ModelNode> toModelNodeList(

View File

@@ -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)

View File

@@ -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

View File

@@ -59,6 +59,16 @@ void AbstractView::setModel(Model *model)
m_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) RewriterTransaction AbstractView::beginRewriterTransaction(const QByteArray &identifier)
{ {
return RewriterTransaction(this, identifier); return RewriterTransaction(this, identifier);