aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner/designercore/include/nodemetainfo.h
blob: 9c8e32002f6139ac8cd39289fab5ccb7cb9c4de8 (plain)
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#pragma once

#include "propertymetainfo.h"
#include "qmldesignercorelib_global.h"

#include <projectstorage/projectstorageinterface.h>
#include <projectstorage/projectstoragetypes.h>
#include <projectstorageids.h>

#include <QList>
#include <QString>
#include <QIcon>

#include <memory>
#include <optional>
#include <vector>

QT_BEGIN_NAMESPACE
class QDeclarativeContext;
QT_END_NAMESPACE

#ifdef QDS_USE_PROJECTSTORAGE
#  define DEPRECATED_TYPENAME [[deprecated("Don't use string based types anymore!")]]
#  define DEPRECATED_VERSION_NUMBER \
      [[deprecated( \
          "In most cases you don't need them anymore because the import is setting them!")]]
#  define DEPRECATED_COMPONENT_FILE_NAME [[deprecated("Use sourceId() instead.")]]
#  define DEPRECATED_IMPORT_DIRECTORY_PATH [[deprecated("Use allExportedTypeNames().")]]
#  define DEPRECATED_REQUIRED_IMPORT_STRING [[deprecated("Use allExportedTypeNames().")]]
#else
#  define DEPRECATED_TYPENAME
#  define DEPRECATED_VERSION_NUMBER
#  define DEPRECATED_COMPONENT_FILE_NAME
#  define DEPRECATED_IMPORT_DIRECTORY_PATH
#  define DEPRECATED_REQUIRED_IMPORT_STRING
#endif

namespace QmlDesigner {

class MetaInfo;
class Model;
class AbstractProperty;
class NodeMetaInfoPrivate;

enum class MetaInfoType { None, Reference, Value, Sequence };

class QMLDESIGNERCORE_EXPORT NodeMetaInfo
{
    using NodeMetaInfos = std::vector<NodeMetaInfo>;

public:
    NodeMetaInfo();
    NodeMetaInfo(Model *model, const TypeName &typeName, int majorVersion, int minorVersion);
    NodeMetaInfo(TypeId typeId, NotNullPointer<const ProjectStorageType> projectStorage)
        : m_typeId{typeId}
        , m_projectStorage{projectStorage}
    {}
    NodeMetaInfo(NotNullPointer<const ProjectStorageType> projectStorage)
        : m_projectStorage{projectStorage}
    {}

    NodeMetaInfo(const NodeMetaInfo &);
    NodeMetaInfo &operator=(const NodeMetaInfo &);
    NodeMetaInfo(NodeMetaInfo &&);
    NodeMetaInfo &operator=(NodeMetaInfo &&);
    ~NodeMetaInfo();

    bool isValid() const;
    explicit operator bool() const { return isValid(); }

    TypeId id() const { return m_typeId; }

    MetaInfoType type() const;
    bool isFileComponent() const;
    bool isProjectComponent() const;
    bool isInProjectModule() const;
    FlagIs canBeContainer() const;
    FlagIs forceClip() const;
    FlagIs doesLayoutChildren() const;
    FlagIs canBeDroppedInFormEditor() const;
    FlagIs canBeDroppedInNavigator() const;
    FlagIs canBeDroppedInView3D() const;
    FlagIs isMovable() const;
    FlagIs isResizable() const;
    FlagIs hasFormEditorItem() const;
    FlagIs isStackedContainer() const;
    FlagIs takesOverRenderingOfChildren() const;
    FlagIs visibleInNavigator() const;
    FlagIs visibleInLibrary() const;

    bool hasProperty(::Utils::SmallStringView propertyName) const;
    PropertyMetaInfos properties() const;
    PropertyMetaInfos localProperties() const;
    PropertyMetaInfo property(const PropertyName &propertyName) const;
    PropertyNameList signalNames() const;
    PropertyNameList slotNames() const;
    PropertyName defaultPropertyName() const;
    PropertyMetaInfo defaultProperty() const;
    bool hasDefaultProperty() const;

    NodeMetaInfos selfAndPrototypes() const;
    NodeMetaInfos prototypes() const;
    NodeMetaInfos heirs() const;
    NodeMetaInfo commonBase(const NodeMetaInfo &metaInfo) const;

    bool defaultPropertyIsComponent() const;

    TypeName displayName() const;
    DEPRECATED_TYPENAME TypeName typeName() const;
    DEPRECATED_TYPENAME TypeName simplifiedTypeName() const;
    DEPRECATED_VERSION_NUMBER int majorVersion() const;
    DEPRECATED_VERSION_NUMBER int minorVersion() const;

    Storage::Info::ExportedTypeNames allExportedTypeNames() const;
    Storage::Info::ExportedTypeNames exportedTypeNamesForSourceId(SourceId sourceId) const;

    Storage::Info::TypeHints typeHints() const;
    Utils::PathString iconPath() const;
    Storage::Info::ItemLibraryEntries itemLibrariesEntries() const;

    SourceId sourceId() const;
    DEPRECATED_COMPONENT_FILE_NAME QString componentFileName() const;

    bool isBasedOn(const NodeMetaInfo &metaInfo) const;
    bool isBasedOn(const NodeMetaInfo &metaInfo1, const NodeMetaInfo &metaInfo2) const;
    bool isBasedOn(const NodeMetaInfo &metaInfo1,
                   const NodeMetaInfo &metaInfo2,
                   const NodeMetaInfo &metaInfo3) const;
    bool isBasedOn(const NodeMetaInfo &metaInfo1,
                   const NodeMetaInfo &metaInfo2,
                   const NodeMetaInfo &metaInfo3,
                   const NodeMetaInfo &metaInfo4) const;
    bool isBasedOn(const NodeMetaInfo &metaInfo1,
                   const NodeMetaInfo &metaInfo2,
                   const NodeMetaInfo &metaInfo3,
                   const NodeMetaInfo &metaInfo4,
                   const NodeMetaInfo &metaInfo5) const;
    bool isBasedOn(const NodeMetaInfo &metaInfo1,
                   const NodeMetaInfo &metaInfo2,
                   const NodeMetaInfo &metaInfo3,
                   const NodeMetaInfo &metaInfo4,
                   const NodeMetaInfo &metaInfo5,
                   const NodeMetaInfo &metaInfo6) const;
    bool isBasedOn(const NodeMetaInfo &metaInfo1,
                   const NodeMetaInfo &metaInfo2,
                   const NodeMetaInfo &metaInfo3,
                   const NodeMetaInfo &metaInfo4,
                   const NodeMetaInfo &metaInfo5,
                   const NodeMetaInfo &metaInfo6,
                   const NodeMetaInfo &metaInfo7) const;

    bool isAlias() const;
    bool isBool() const;
    bool isColor() const;
    bool isFloat() const;
    bool isFlowViewFlowActionArea() const;
    bool isFlowViewFlowDecision() const;
    bool isFlowViewFlowItem() const;
    bool isFlowViewFlowTransition() const;
    bool isFlowViewFlowView() const;
    bool isFlowViewFlowWildcard() const;
    bool isFlowViewItem() const;
    bool isFont() const;
    bool isGraphicalItem() const;
    bool isInteger() const;
    bool isLayoutable() const;
    bool isListOrGridView() const;
    bool isNumber() const;
    bool isQmlComponent() const;
    bool isQtMultimediaSoundEffect() const;
    bool isQtObject() const;
    bool isQtQmlConnections() const;
    bool isQtQmlModelsListElement() const;
    bool isQtQuick3DBakedLightmap() const;
    bool isQtQuick3DBuffer() const;
    bool isQtQuick3DCamera() const;
    bool isQtQuick3DCommand() const;
    bool isQtQuick3DDefaultMaterial() const;
    bool isQtQuick3DEffect() const;
    bool isQtQuick3DInstanceList() const;
    bool isQtQuick3DInstanceListEntry() const;
    bool isQtQuick3DLight() const;
    bool isQtQuickListModel() const;
    bool isQtQuickListView() const;
    bool isQtQuick3DMaterial() const;
    bool isQtQuick3DModel() const;
    bool isQtQuick3DNode() const;
    bool isQtQuick3DParticlesAbstractShape() const;
    bool isQtQuick3DParticles3DAffector3D() const;
    bool isQtQuick3DParticles3DAttractor3D() const;
    bool isQtQuick3DParticles3DParticle3D() const;
    bool isQtQuick3DParticles3DParticleEmitter3D() const;
    bool isQtQuick3DParticles3DSpriteParticle3D() const;
    bool isQtQuick3DPass() const;
    bool isQtQuick3DPrincipledMaterial() const;
    bool isQtQuick3DSpecularGlossyMaterial() const;
    bool isQtQuick3DSceneEnvironment() const;
    bool isQtQuick3DShader() const;
    bool isQtQuick3DTexture() const;
    bool isQtQuick3DTextureInput() const;
    bool isQtQuick3DCubeMapTexture() const;
    bool isQtQuick3DView3D() const;
    bool isQtQuickBorderImage() const;
    bool isQtQuickControlsSwipeView() const;
    bool isQtQuickControlsTabBar() const;
    bool isQtQuickExtrasPicture() const;
    bool isQtQuickImage() const;
    bool isQtQuickItem() const;
    bool isQtQuickLayoutsLayout() const;
    bool isQtQuickLoader() const;
    bool isQtQuickPath() const;
    bool isQtQuickPauseAnimation() const;
    bool isQtQuickPositioner() const;
    bool isQtQuickPropertyAnimation() const;
    bool isQtQuickPropertyChanges() const;
    bool isQtQuickRepeater() const;
    bool isQtQuickState() const;
    bool isQtQuickStateOperation() const;
    bool isQtQuickStudioComponentsGroupItem() const;
    bool isQtQuickStudioUtilsJsonListModel() const;
    bool isQtQuickText() const;
    bool isQtQuickTimelineKeyframe() const;
    bool isQtQuickTimelineKeyframeGroup() const;
    bool isQtQuickTimelineTimeline() const;
    bool isQtQuickTimelineTimelineAnimation() const;
    bool isQtQuickTransition() const;
    bool isQtQuickWindowWindow() const;
    bool isQtSafeRendererSafePicture() const;
    bool isQtSafeRendererSafeRendererPicture() const;
    bool isString() const;
    bool isSuitableForMouseAreaFill() const;
    bool isUrl() const;
    bool isVariant() const;
    bool isVector2D() const;
    bool isVector3D() const;
    bool isVector4D() const;
    bool isView() const;
    bool usesCustomParser() const;

    bool isEnumeration() const;
    DEPRECATED_IMPORT_DIRECTORY_PATH QString importDirectoryPath() const;
    DEPRECATED_REQUIRED_IMPORT_STRING QString requiredImportString() const;

    friend bool operator==(const NodeMetaInfo &first, const NodeMetaInfo &second)
    {
        if constexpr (useProjectStorage())
            return first.m_typeId == second.m_typeId;
        else
            return first.m_privateData == second.m_privateData;
    }

    friend bool operator!=(const NodeMetaInfo &first, const NodeMetaInfo &second)
    {
        return !(first == second);
    }

    SourceId propertyEditorPathId() const;

    const ProjectStorageType &projectStorage() const { return *m_projectStorage; }

    void *key() const
    {
        if constexpr (!useProjectStorage())
            return m_privateData.get();

        return nullptr;
    }

private:
    const Storage::Info::Type &typeData() const;
    PropertyDeclarationId defaultPropertyDeclarationId() const;
    bool isSubclassOf(const TypeName &type, int majorVersion = -1, int minorVersion = -1) const;

private:
    TypeId m_typeId;
    NotNullPointer<const ProjectStorageType> m_projectStorage = {};
    mutable std::optional<Storage::Info::Type> m_typeData;
    mutable std::optional<PropertyDeclarationId> m_defaultPropertyId;
    std::shared_ptr<NodeMetaInfoPrivate> m_privateData;
};

using NodeMetaInfos = std::vector<NodeMetaInfo>;

} //QmlDesigner

namespace std {
template<>
struct hash<QmlDesigner::NodeMetaInfo>
{
    auto operator()(const QmlDesigner::NodeMetaInfo &metaInfo) const
    {
        if constexpr (QmlDesigner::useProjectStorage())
            return std::hash<QmlDesigner::TypeId>{}(metaInfo.id());
        else
            return std::hash<void *>{}(metaInfo.key());
    }
};
} // namespace std