From c110aab7a189360c931ef3498f70978f6ccf0e16 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Fri, 14 Mar 2025 18:10:44 +0100 Subject: [PATCH] QmlDesigner: Add is singleton to NodeMetaInfo Change-Id: Icb657fd326b25a6d9c7f2e73dc35df5c4df42c1e Reviewed-by: Thomas Hartmann --- .../libs/designercore/include/nodemetainfo.h | 1 + .../designercore/metainfo/nodemetainfo.cpp | 20 ++++++++++ .../unittests/metainfo/nodemetainfo-test.cpp | 37 +++++++++++++++++++ 3 files changed, 58 insertions(+) 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();