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);
}
QList<WidgetInfo> ViewManager::widgetInfos() const
void ViewManager::initializeWidgetInfos()
{
QList<WidgetInfo> 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<WidgetInfo> ViewManager::widgetInfos()
{
return m_widgetInfo;
}
void ViewManager::disableWidgets()
@@ -599,4 +582,14 @@ void ViewManager::addView(std::unique_ptr<AbstractView> &&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

View File

@@ -5,10 +5,11 @@
#include <qmldesignercomponents_global.h>
#include <abstractview.h>
#include <coreplugin/icontext.h>
#include <abstractview.h>
#include <widgetregistration.h>
#include <utils/filepath.h>
#include <QWidgetAction>
@@ -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<AbstractCustomTool> &&tool);
@@ -61,8 +60,7 @@ public:
addView(std::move(view));
return notOwningPointer;
}
QList<WidgetInfo> widgetInfos() const;
QList<WidgetInfo> 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<ViewManagerData> d;
QList<WidgetInfo> m_widgetInfo;
};
} // namespace QmlDesigner

View File

@@ -19,6 +19,7 @@
#include <bundleimporter.h>
#include <designerpaths.h>
#include <documentmanager.h>
#include <dynamiclicensecheck.h>
#include <enumeration.h>
#include <externaldependenciesinterface.h>
#include <modelutils.h>
@@ -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()) {

View File

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

View File

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

View File

@@ -6,6 +6,8 @@
#include "model.h"
#include "modelnode.h"
#include "qmldesignercorelib_global.h"
#include "widgetregistration.h"
#include <commondefines.h>
#include <utils/span.h>
@@ -37,30 +39,6 @@ class 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
{
Q_OBJECT
@@ -94,6 +72,8 @@ public:
, m_action{Utils::makeUniqueObjectPtr<AbstractViewAction>(*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<ModelNode> toModelNodeList(Utils::span<const Internal::InternalNodePointer> 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<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;
}
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);