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);
|
||||
}
|
||||
|
||||
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
|
||||
|
@@ -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
|
||||
|
@@ -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()) {
|
||||
|
@@ -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;
|
||||
|
@@ -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())
|
||||
|
@@ -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(
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
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);
|
||||
|
Reference in New Issue
Block a user