QmlDesigner: Move component specific code out of the model

The model is an abstraction for communication between components and
should not used as place for component specific code. Otherwise it will
grow quite dramatically.

Add Utils3D in component core which is shared between all components is
actually the place to share code between components.

Change-Id: Ic9d0be72e4480fc33ac6300a10871db4983b4a73
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
Marco Bubke
2024-02-19 15:57:08 +01:00
parent 3586a5b459
commit fe77ba28f8
19 changed files with 119 additions and 76 deletions

View File

@@ -626,6 +626,7 @@ extend_qtc_plugin(QmlDesigner
anchoraction.cpp anchoraction.h
svgpasteaction.cpp svgpasteaction.h
viewmanager.cpp viewmanager.h
utils3d.cpp utils3d.h
)
extend_qtc_plugin(QmlDesigner

View File

@@ -9,11 +9,12 @@
#include "assetslibraryview.h"
#include "designeractionmanager.h"
#include "import.h"
#include "nodemetainfo.h"
#include "modelnodeoperations.h"
#include "nodemetainfo.h"
#include "qmldesignerconstants.h"
#include "qmldesignerplugin.h"
#include "theme.h"
#include <utils3d.h>
#include <studioquickwidget.h>
@@ -229,16 +230,18 @@ int AssetsLibraryWidget::qtVersion() const
void AssetsLibraryWidget::addTextures(const QStringList &filePaths)
{
m_assetsView->executeInTransaction(__FUNCTION__, [&] {
m_createTextures.execute(filePaths, AddTextureMode::Texture,
m_assetsView->model()->active3DSceneId());
m_createTextures.execute(filePaths,
AddTextureMode::Texture,
Utils3D::active3DSceneId(m_assetsView->model()));
});
}
void AssetsLibraryWidget::addLightProbe(const QString &filePath)
{
m_assetsView->executeInTransaction(__FUNCTION__, [&] {
m_createTextures.execute({filePath}, AddTextureMode::LightProbe,
m_assetsView->model()->active3DSceneId());
m_createTextures.execute({filePath},
AddTextureMode::LightProbe,
Utils3D::active3DSceneId(m_assetsView->model()));
});
}
@@ -247,7 +250,8 @@ void AssetsLibraryWidget::updateContextMenuActionsEnableState()
setHasMaterialLibrary(m_assetsView->materialLibraryNode().isValid()
&& m_assetsView->model()->hasImport("QtQuick3D"));
ModelNode activeSceneEnv = m_createTextures.resolveSceneEnv(m_assetsView->model()->active3DSceneId());
ModelNode activeSceneEnv = m_createTextures.resolveSceneEnv(
Utils3D::active3DSceneId(m_assetsView->model()));
setHasSceneEnv(activeSceneEnv.isValid());
}

View File

@@ -0,0 +1,34 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "utils3d.h"
namespace QmlDesigner {
namespace Utils3D {
ModelNode active3DSceneNode(AbstractView *view)
{
if (!view)
return {};
auto activeSceneAux = view->rootModelNode().auxiliaryData(active3dSceneProperty);
if (activeSceneAux) {
int activeScene = activeSceneAux->toInt();
if (view->hasModelNodeForInternalId(activeScene))
return view->modelNodeForInternalId(activeScene);
}
return {};
}
qint32 active3DSceneId(Model *model)
{
auto sceneId = model->rootModelNode().auxiliaryData(active3dSceneProperty);
if (sceneId)
return sceneId->toInt();
return -1;
}
} // namespace Utils3D
} // namespace QmlDesigner

View File

@@ -0,0 +1,18 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
// please put here 3d related functions which have no clear place elsewhere
#include <abstractview.h>
namespace QmlDesigner {
namespace Utils3D {
inline constexpr AuxiliaryDataKeyView active3dSceneProperty{AuxiliaryDataType::Temporary,
"active3dScene"};
ModelNode active3DSceneNode(AbstractView *view);
qint32 active3DSceneId(Model *model);
} // namespace Utils3D
} // namespace QmlDesigner

View File

@@ -16,6 +16,7 @@
#include "qmldesignerconstants.h"
#include "qmlobjectnode.h"
#include "variantproperty.h"
#include <utils3d.h>
#include <coreplugin/messagebox.h>
#include <enumeration.h>
@@ -143,7 +144,7 @@ WidgetInfo ContentLibraryView::widgetInfo()
QTC_ASSERT(typeName.size(), return);
if (!m_bundleEffectTarget)
m_bundleEffectTarget = active3DSceneNode();
m_bundleEffectTarget = Utils3D::active3DSceneNode(this);
QTC_ASSERT(m_bundleEffectTarget, return);
@@ -168,7 +169,7 @@ WidgetInfo ContentLibraryView::widgetInfo()
QTC_ASSERT(metaInfo.isValid(), return);
if (!m_bundleEffectTarget)
m_bundleEffectTarget = active3DSceneNode();
m_bundleEffectTarget = Utils3D::active3DSceneNode(this);
QTC_ASSERT(m_bundleEffectTarget, return);
@@ -226,7 +227,7 @@ void ContentLibraryView::modelAttached(Model *model)
m_widget->setHasQuick3DImport(m_hasQuick3DImport);
m_widget->setIsQt6Project(externalDependencies().isQt6Project());
m_sceneId = model->active3DSceneId();
m_sceneId = Utils3D::active3DSceneId(model);
m_widget->setHasActive3DScene(m_sceneId != -1);
m_widget->clearSearchFilter();
@@ -322,7 +323,7 @@ void ContentLibraryView::customNotification(const AbstractView *view,
m_bundleEffectPos = data.size() == 1 ? data.first() : QVariant();
m_widget->effectsModel()->addInstance(m_draggedBundleEffect);
m_bundleEffectTarget = nodeList.first() ? nodeList.first() : active3DSceneNode();
m_bundleEffectTarget = nodeList.first() ? nodeList.first() : Utils3D::active3DSceneNode(this);
}
}
@@ -341,6 +342,14 @@ void ContentLibraryView::nodeAboutToBeRemoved(const ModelNode &removedNode)
m_widget->setHasMaterialLibrary(false);
}
void ContentLibraryView::auxiliaryDataChanged(const ModelNode &,
AuxiliaryDataKeyView type,
const QVariant &data)
{
if (type == Utils3D::active3dSceneProperty)
active3DSceneChanged(data.toInt());
}
#ifdef QDS_USE_PROJECTSTORAGE
void ContentLibraryView::applyBundleMaterialToDropTarget(const ModelNode &bundleMat,
const TypeName &typeName)

View File

@@ -33,7 +33,6 @@ public:
void modelAttached(Model *model) override;
void modelAboutToBeDetached(Model *model) override;
void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
void active3DSceneChanged(qint32 sceneId) override;
void selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
const QList<ModelNode> &lastSelectedNodeList) override;
void customNotification(const AbstractView *view, const QString &identifier,
@@ -42,8 +41,12 @@ public:
const NodeAbstractProperty &oldPropertyParent,
AbstractView::PropertyChangeFlags propertyChange) override;
void nodeAboutToBeRemoved(const ModelNode &removedNode) override;
void auxiliaryDataChanged(const ModelNode &node,
AuxiliaryDataKeyView type,
const QVariant &data) override;
private:
void active3DSceneChanged(qint32 sceneId);
void updateBundleMaterialsImportedState();
void updateBundleEffectsImportedState();
void updateBundlesQuick3DVersion();

View File

@@ -12,6 +12,7 @@
#include "nodemetainfo.h"
#include "qmlobjectnode.h"
#include "variantproperty.h"
#include <utils3d.h>
#include <coreplugin/messagebox.h>
@@ -117,7 +118,7 @@ ModelNode CreateTexture::resolveSceneEnv(int sceneId)
if (selectedNode.metaInfo().isQtQuick3DSceneEnvironment()) {
activeSceneEnv = selectedNode;
} else if (sceneId != -1) {
ModelNode activeScene = m_view->active3DSceneNode();
ModelNode activeScene = Utils3D::active3DSceneNode(m_view);
if (activeScene.isValid()) {
QmlObjectNode view3D;
if (activeScene.metaInfo().isQtQuick3DView3D()) {

View File

@@ -16,6 +16,7 @@
#include <nodemetainfo.h>
#include <plaintexteditmodifier.h>
#include <rewriterview.h>
#include <utils3d.h>
#include <variantproperty.h>
#include <coreplugin/icore.h>
@@ -84,7 +85,7 @@ ModelNode BakeLights::resolveView3dNode(AbstractView *view)
return {};
ModelNode activeView3D;
ModelNode activeScene = view->active3DSceneNode();
ModelNode activeScene = Utils3D::active3DSceneNode(view);
if (activeScene.isValid()) {
if (activeScene.metaInfo().isQtQuick3DView3D()) {

View File

@@ -23,7 +23,9 @@
#include "seekerslider.h"
#include "snapconfiguration.h"
#include <auxiliarydataproperties.h>
#include <model/modelutils.h>
#include <utils3d.h>
#include <coreplugin/icore.h>
#include <coreplugin/messagebox.h>
@@ -143,7 +145,7 @@ void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState)
if (sceneState.contains(sceneKey)) {
qint32 newActiveScene = sceneState[sceneKey].value<qint32>();
edit3DWidget()->canvas()->updateActiveScene(newActiveScene);
model()->setActive3DSceneId(newActiveScene);
setActive3DSceneId(newActiveScene);
updateAlignActionStates();
}
@@ -238,7 +240,7 @@ void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState)
bool desiredSyncValue = false;
if (sceneState.contains(syncEnvBgKey))
desiredSyncValue = sceneState[syncEnvBgKey].toBool();
ModelNode checkNode = active3DSceneNode();
ModelNode checkNode = Utils3D::active3DSceneNode(this);
const bool activeSceneValid = checkNode.isValid();
while (checkNode.isValid()) {
@@ -385,7 +387,7 @@ void Edit3DView::updateAlignActionStates()
{
bool enabled = false;
ModelNode activeScene = active3DSceneNode();
ModelNode activeScene = Utils3D::active3DSceneNode(this);
if (activeScene.isValid()) {
const QList<ModelNode> nodes = activeScene.allSubModelNodes();
enabled = ::Utils::anyOf(nodes, [](const ModelNode &node) {
@@ -397,6 +399,11 @@ void Edit3DView::updateAlignActionStates()
m_alignViewAction->action()->setEnabled(enabled);
}
void Edit3DView::setActive3DSceneId(qint32 sceneId)
{
rootModelNode().setAuxiliaryData(Utils3D::active3dSceneProperty, sceneId);
}
void Edit3DView::modelAboutToBeDetached(Model *model)
{
m_isBakingLightsSupported = false;

View File

@@ -111,6 +111,7 @@ private:
void handleEntriesChanged();
void showMaterialPropertiesView();
void updateAlignActionStates();
void setActive3DSceneId(qint32 sceneId);
void createSelectBackgroundColorAction(QAction *syncEnvBackgroundAction);
void createGridColorSelectionAction();

View File

@@ -19,6 +19,7 @@
#include "qmleditormenu.h"
#include "qmlvisualnode.h"
#include "viewmanager.h"
#include <utils3d.h>
#include <auxiliarydataproperties.h>
#include <designeractionmanager.h>
@@ -479,10 +480,7 @@ void Edit3DWidget::onCreateAction(QAction *action)
if (!m_view->model()->hasImport(import, true, true))
m_view->model()->changeImports({import}, {});
int activeScene = -1;
auto data = m_view->rootModelNode().auxiliaryData(active3dSceneProperty);
if (data)
activeScene = data->toInt();
int activeScene = Utils3D::active3DSceneId(m_view->model());
auto modelNode = QmlVisualNode::createQml3DNode(m_view, entry,
activeScene, m_contextMenuPos3d).modelNode();
QTC_ASSERT(modelNode.isValid(), return);
@@ -688,7 +686,7 @@ void Edit3DWidget::dragEnterEvent(QDragEnterEvent *dragEnterEvent)
|| dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_BUNDLE_MATERIAL)
|| dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_BUNDLE_EFFECT)
|| dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_TEXTURE)) {
if (m_view->active3DSceneNode().isValid())
if (Utils3D::active3DSceneNode(m_view).isValid())
dragEnterEvent->acceptProposedAction();
} else if (dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_ITEM_LIBRARY_INFO)) {
QByteArray data = dragEnterEvent->mimeData()->data(Constants::MIME_TYPE_ITEM_LIBRARY_INFO);

View File

@@ -15,6 +15,7 @@
#include <nodeinstanceview.h>
#include <nodelistproperty.h>
#include <rewritingexception.h>
#include <utils3d.h>
#include <variantproperty.h>
#include <viewmanager.h>
#include <qmldesignerplugin.h>
@@ -232,16 +233,15 @@ void DesignDocument::moveNodesToPosition(const QList<ModelNode> &nodes, const st
});
if (all3DNodes) {
auto data = rootModelNode().auxiliaryData(active3dSceneProperty);
if (data) {
if (int activeSceneId = data->toInt(); activeSceneId != -1) {
int activeSceneId = Utils3D::active3DSceneId(m_documentModel.get());
if (activeSceneId != -1) {
NodeListProperty sceneNodeProperty = QmlVisualNode::findSceneNodeProperty(
rootModelNode().view(), activeSceneId);
targetNode = sceneNodeProperty.parentModelNode();
}
}
}
}
if (!targetNode.isValid())
targetNode = view.rootModelNode();

View File

@@ -16,6 +16,7 @@
#include "qmldesignerconstants.h"
#include "qmlobjectnode.h"
#include "variantproperty.h"
#include <utils3d.h>
#include <coreplugin/icore.h>
@@ -240,7 +241,7 @@ void MaterialBrowserView::modelAttached(Model *model)
loadPropertyGroups(); // Needs the delay because it uses metaInfo
});
m_sceneId = model->active3DSceneId();
m_sceneId = Utils3D::active3DSceneId(model);
}
void MaterialBrowserView::refreshModel(bool updateImages)
@@ -585,6 +586,14 @@ void MaterialBrowserView::instancePropertyChanged(const QList<QPair<ModelNode, P
}
}
void MaterialBrowserView::auxiliaryDataChanged(const ModelNode &,
AuxiliaryDataKeyView type,
const QVariant &data)
{
if (type == Utils3D::active3dSceneProperty)
active3DSceneChanged(data.toInt());
}
void MaterialBrowserView::applyTextureToModel3D(const QmlObjectNode &model3D, const ModelNode &texture)
{
if (!texture.isValid() && m_appliedTexturePath.isEmpty())

View File

@@ -49,7 +49,9 @@ public:
const QList<ModelNode> &nodeList, const QList<QVariant> &data) override;
void instancesCompleted(const QVector<ModelNode> &completedNodeList) override;
void instancePropertyChanged(const QList<QPair<ModelNode, PropertyName> > &propertyList) override;
void active3DSceneChanged(qint32 sceneId) override;
void auxiliaryDataChanged(const ModelNode &node,
AuxiliaryDataKeyView type,
const QVariant &data) override;
void currentStateChanged(const ModelNode &node) override;
void applyTextureToModel3D(const QmlObjectNode &model3D, const ModelNode &texture = {});
@@ -65,6 +67,7 @@ protected:
bool eventFilter(QObject *obj, QEvent *event) override;
private:
void active3DSceneChanged(qint32 sceneId);
void refreshModel(bool updateImages);
void updateMaterialsPreview();
bool isMaterial(const ModelNode &node) const;

View File

@@ -223,8 +223,6 @@ public:
virtual void view3DAction(View3DActionType type, const QVariant &value);
virtual void active3DSceneChanged(qint32 sceneId);
virtual void dragStarted(QMimeData *mimeData);
virtual void dragEnded();
@@ -233,7 +231,6 @@ public:
void ensureMaterialLibraryNode();
ModelNode materialLibraryNode();
bool isPartOfMaterialLibrary(const ModelNode &node);
ModelNode active3DSceneNode();
ModelNode getTextureDefaultInstance(const QString &source);
const NodeInstanceView *nodeInstanceView() const;

View File

@@ -95,8 +95,6 @@ inline constexpr AuxiliaryDataKeyDefaultValue insightCategoriesProperty{Auxiliar
"insightCategories",
{}};
inline constexpr AuxiliaryDataKeyView uuidProperty{AuxiliaryDataType::Document, "uuid"};
inline constexpr AuxiliaryDataKeyView active3dSceneProperty{AuxiliaryDataType::Temporary,
"active3dScene"};
inline constexpr AuxiliaryDataKeyView tmpProperty{AuxiliaryDataType::Temporary, "tmp"};
inline constexpr AuxiliaryDataKeyView recordProperty{AuxiliaryDataType::Temporary, "Record"};
inline constexpr AuxiliaryDataKeyView transitionDurationProperty{AuxiliaryDataType::Document,

View File

@@ -239,9 +239,6 @@ public:
std::optional<std::function<bool(const QString &)>> isDuplicate = {}) const;
QString generateIdFromName(const QString &name, const QString &fallbackId = "element") const;
void setActive3DSceneId(qint32 sceneId);
qint32 active3DSceneId() const;
void startDrag(QMimeData *mimeData, const QPixmap &icon);
void endDrag();

View File

@@ -373,8 +373,6 @@ void AbstractView::modelNodePreviewPixmapChanged(const ModelNode &/*node*/, cons
void AbstractView::view3DAction(View3DActionType, const QVariant &) {}
void AbstractView::active3DSceneChanged(qint32 /*sceneId*/) {}
void AbstractView::dragStarted(QMimeData * /*mimeData*/) {}
void AbstractView::dragEnded() {}
@@ -837,19 +835,6 @@ bool AbstractView::isPartOfMaterialLibrary(const ModelNode &node)
|| (node.hasParentProperty() && node.parentProperty().parentModelNode() == matLib));
}
ModelNode AbstractView::active3DSceneNode()
{
auto activeSceneAux = rootModelNode().auxiliaryData(active3dSceneProperty);
if (activeSceneAux) {
int activeScene = activeSceneAux->toInt();
if (hasModelNodeForInternalId(activeScene))
return modelNodeForInternalId(activeScene);
}
return {};
}
ModelNode AbstractView::getTextureDefaultInstance(const QString &source)
{
ModelNode matLib = materialLibraryNode();

View File

@@ -733,11 +733,6 @@ void ModelPrivate::notifyView3DAction(View3DActionType type, const QVariant &val
notifyNormalViewsLast([&](AbstractView *view) { view->view3DAction(type, value); });
}
void ModelPrivate::notifyActive3DSceneIdChanged(qint32 sceneId)
{
notifyInstanceChanges([&](AbstractView *view) { view->active3DSceneChanged(sceneId); });
}
void ModelPrivate::notifyDragStarted(QMimeData *mimeData)
{
notifyInstanceChanges([&](AbstractView *view) { view->dragStarted(mimeData); });
@@ -1903,24 +1898,6 @@ QString Model::generateIdFromName(const QString &name, const QString &fallbackId
return newId;
}
void Model::setActive3DSceneId(qint32 sceneId)
{
auto activeSceneAux = d->rootNode()->auxiliaryData(active3dSceneProperty);
if (activeSceneAux && activeSceneAux->toInt() == sceneId)
return;
d->rootNode()->setAuxiliaryData(active3dSceneProperty, sceneId);
d->notifyActive3DSceneIdChanged(sceneId);
}
qint32 Model::active3DSceneId() const
{
auto sceneId = d->rootNode()->auxiliaryData(active3dSceneProperty);
if (sceneId)
return sceneId->toInt();
return -1;
}
void Model::startDrag(QMimeData *mimeData, const QPixmap &icon)
{
d->notifyDragStarted(mimeData);