diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h index 55ce166d904..7ccd1028bfb 100644 --- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h @@ -53,6 +53,8 @@ public: TypeId id() const { return m_typeId; } bool isFileComponent() const; + bool isProjectComponent() const; + bool isInProjectModule() const; bool hasProperty(::Utils::SmallStringView propertyName) const; PropertyMetaInfos properties() const; PropertyMetaInfos localProperties() const; diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 81180affdd6..3836dc8d16f 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -1426,6 +1426,24 @@ bool NodeMetaInfo::isFileComponent() const return isValid() && m_privateData->isFileComponent(); } +bool NodeMetaInfo::isProjectComponent() const +{ + if constexpr (useProjectStorage()) { + return isValid() && bool(typeData().traits & Storage::TypeTraits::IsProjectComponent); + } + + return false; +} + +bool NodeMetaInfo::isInProjectModule() const +{ + if constexpr (useProjectStorage()) { + return isValid() && bool(typeData().traits & Storage::TypeTraits::IsInProjectModule); + } + + return false; +} + bool NodeMetaInfo::hasProperty(Utils::SmallStringView propertyName) const { if constexpr (useProjectStorage()) diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h index b61a6ec331a..71bbb745200 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinfotypes.h @@ -46,7 +46,9 @@ enum class TypeTraits : int { Value, Sequence, IsEnum = 1 << 8, - IsFileComponent = 1 << 9 + IsFileComponent = 1 << 9, + IsProjectComponent = 1 << 10, + IsInProjectModule = 1 << 11 }; constexpr TypeTraits operator|(TypeTraits first, TypeTraits second) diff --git a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp index f92b18fc4de..78aed432f7a 100644 --- a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp +++ b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp @@ -155,6 +155,72 @@ TEST_F(NodeMetaInfo, component_is_file_component) ASSERT_TRUE(isFileComponent); } +TEST_F(NodeMetaInfo, is_project_component) +{ + using QmlDesigner::Storage::TypeTraits; + auto moduleId = projectStorageMock.createModule("/path/to/project"); + auto typeId = projectStorageMock.createType(moduleId, "Foo", TypeTraits::IsProjectComponent); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + bool isProjectComponent = metaInfo.isProjectComponent(); + + ASSERT_TRUE(isProjectComponent); +} + +TEST_F(NodeMetaInfo, is_not_project_component) +{ + using QmlDesigner::Storage::TypeTraits; + auto moduleId = projectStorageMock.createModule("/path/to/project"); + auto typeId = projectStorageMock.createType(moduleId, "Foo", {}); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + bool isProjectComponent = metaInfo.isProjectComponent(); + + ASSERT_FALSE(isProjectComponent); +} + +TEST_F(NodeMetaInfo, invalid_is_not_project_component) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isProjectComponent = metaInfo.isProjectComponent(); + + ASSERT_FALSE(isProjectComponent); +} + +TEST_F(NodeMetaInfo, is_in_project_module) +{ + using QmlDesigner::Storage::TypeTraits; + auto moduleId = projectStorageMock.createModule("/path/to/project"); + auto typeId = projectStorageMock.createType(moduleId, "Foo", TypeTraits::IsInProjectModule); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + bool isInProjectModule = metaInfo.isInProjectModule(); + + ASSERT_TRUE(isInProjectModule); +} + +TEST_F(NodeMetaInfo, is_not_in_project_module) +{ + using QmlDesigner::Storage::TypeTraits; + auto moduleId = projectStorageMock.createModule("/path/to/project"); + auto typeId = projectStorageMock.createType(moduleId, "Foo", {}); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + bool isInProjectModule = metaInfo.isInProjectModule(); + + ASSERT_FALSE(isInProjectModule); +} + +TEST_F(NodeMetaInfo, invalid_is_not_in_project_module) +{ + QmlDesigner::NodeMetaInfo metaInfo; + + bool isInProjectModule = metaInfo.isInProjectModule(); + + ASSERT_FALSE(isInProjectModule); +} + TEST_F(NodeMetaInfo, has_property) { auto node = model.createModelNode("Item");