forked from qt-creator/qt-creator
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:
committed by
spyro-adb
parent
9b6198b11c
commit
e0cc2a3ebe
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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()) {
|
||||||
|
@@ -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;
|
||||||
|
@@ -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())
|
||||||
|
@@ -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(
|
||||||
|
@@ -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)
|
@@ -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
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user