1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include "abstractview.h"
#include <QPointer>
#include <QSet>
#include <QTimer>
QT_BEGIN_NAMESPACE
class QQuickView;
QT_END_NAMESPACE
namespace QmlDesigner {
class MaterialBrowserWidget;
class MaterialBrowserView : public AbstractView
{
Q_OBJECT
public:
MaterialBrowserView(class AsynchronousImageCache &imageCache,
ExternalDependenciesInterface &externalDependencies);
~MaterialBrowserView() override;
bool hasWidget() const override;
WidgetInfo widgetInfo() override;
// AbstractView
void modelAttached(Model *model) override;
void modelAboutToBeDetached(Model *model) override;
void selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
const QList<ModelNode> &lastSelectedNodeList) override;
void modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap) override;
void nodeIdChanged(const ModelNode &node, const QString &newId, const QString &oldId) override;
void variantPropertiesChanged(const QList<VariantProperty> &propertyList, PropertyChangeFlags propertyChange) override;
void propertiesRemoved(const QList<AbstractProperty> &propertyList) override;
void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent,
const NodeAbstractProperty &oldPropertyParent,
AbstractView::PropertyChangeFlags propertyChange) override;
void nodeAboutToBeRemoved(const ModelNode &removedNode) override;
void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty,
PropertyChangeFlags propertyChange) override;
void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override;
void customNotification(const AbstractView *view, const QString &identifier,
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 currentStateChanged(const ModelNode &node) override;
void applyTextureToModel3D(const QmlObjectNode &model3D, const ModelNode &texture = {});
void applyTextureToMaterial(const QList<ModelNode> &materials, const ModelNode &texture);
void createTextures(const QStringList &assetPaths);
Q_INVOKABLE void updatePropsModel(const QString &matId);
Q_INVOKABLE void applyTextureToProperty(const QString &matId, const QString &propName);
Q_INVOKABLE void closeChooseMatPropsView();
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
private:
void refreshModel(bool updateImages);
bool isMaterial(const ModelNode &node) const;
bool isTexture(const ModelNode &node) const;
void loadPropertyGroups();
void requestPreviews();
ModelNode resolveSceneEnv();
ModelNode getMaterialOfModel(const ModelNode &model, int idx = 0);
AsynchronousImageCache &m_imageCache;
QPointer<MaterialBrowserWidget> m_widget;
QList<ModelNode> m_selectedModels; // selected 3D model nodes
bool m_hasQuick3DImport = false;
bool m_autoSelectModelMaterial = false; // TODO: wire this to some action
bool m_puppetResetPending = false;
bool m_propertyGroupsLoaded = false;
QTimer m_previewTimer;
QSet<ModelNode> m_previewRequests;
QPointer<QQuickView> m_chooseMatPropsView;
QHash<QString, QList<PropertyName>> m_textureModels;
QString m_appliedTextureId;
QString m_appliedTexturePath; // defers texture creation until dialog apply
int m_sceneId = -1;
};
} // namespace QmlDesigner
|