diff --git a/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h index fa867cce033..9429ada9c4d 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h @@ -75,6 +75,7 @@ public: MetaInfoType type() const; bool isFileComponent() const; + bool isSingleton() const; FlagIs canBeContainer() const; FlagIs forceClip() const; FlagIs doesLayoutChildren() const; diff --git a/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp index f863cc1addf..aab341f13f4 100644 --- a/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp @@ -1527,6 +1527,26 @@ bool NodeMetaInfo::isFileComponent() const } } +bool NodeMetaInfo::isSingleton() const +{ + if constexpr (useProjectStorage()) { + if (!isValid()) + return {}; + + using NanotraceHR::keyValue; + NanotraceHR::Tracer tracer{"is singleton", category(), keyValue("type id", m_typeId)}; + + auto isSingleton = typeData().traits.isSingleton; + + tracer.end(keyValue("is singleton", isSingleton)); + + return isSingleton; + + } else { + return false; + } +} + FlagIs NodeMetaInfo::canBeContainer() const { if constexpr (useProjectStorage()) { diff --git a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp index cbdad30c031..925834b8235 100644 --- a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp +++ b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp @@ -236,6 +236,43 @@ TEST_F(NodeMetaInfo, component_is_file_component) ASSERT_TRUE(isFileComponent); } +TEST_F(NodeMetaInfo, object_is_not_singleton) +{ + bool isSingleton = objectMetaInfo.isSingleton(); + + ASSERT_FALSE(isSingleton); +} + +TEST_F(NodeMetaInfo, default_is_not_ingleton) +{ + bool isSingleton = QmlDesigner::NodeMetaInfo{}.isFileComponent(); + + ASSERT_FALSE(isSingleton); +} + +TEST_F(NodeMetaInfo, invalid_is_not_singleton) +{ + auto node = model.createModelNode("Foo"); + auto metaInfo = node.metaInfo(); + + bool isSingleton = metaInfo.isSingleton(); + + ASSERT_FALSE(isSingleton); +} + +TEST_F(NodeMetaInfo, component_is_singleton) +{ + auto moduleId = projectStorageMock.createModule("/path/to/project", ModuleKind::PathLibrary); + TypeTraits traits{TypeTraitsKind::Reference}; + traits.isSingleton = true; + auto typeId = projectStorageMock.createType(moduleId, "Foo", traits); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + bool isSingleton = metaInfo.isSingleton(); + + ASSERT_TRUE(isSingleton); +} + TEST_F(NodeMetaInfo, has_property) { auto metaInfo = model.qtQuickItemMetaInfo();