From f93e12de2b8f282b25005bf7044c23bcb99e5241 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 26 Sep 2024 13:38:24 +0200 Subject: [PATCH] QmlDesigner: Add hints to hide node in navigator For effects we want to explcitly hide certain items. Change-Id: I49748f851453c7c8d5001ca696d5a6b1b2969550 Reviewed-by: Thomas Hartmann --- .../navigator/navigatortreemodel.cpp | 5 ++- .../libs/designercore/include/nodehints.h | 1 + .../libs/designercore/include/nodemetainfo.h | 1 + .../libs/designercore/metainfo/nodehints.cpp | 13 +++++++ .../designercore/metainfo/nodemetainfo.cpp | 12 ++++++ .../projectstorage/projectstorageinfotypes.h | 7 +++- .../projectstorage/typeannotationreader.cpp | 2 + .../tests/printers/gtest-creator-printing.cpp | 3 ++ .../unittests/metainfo/nodemetainfo-test.cpp | 37 +++++++++++++++++++ .../typeannotationreader-test.cpp | 29 +++++++++++++++ 10 files changed, 107 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 8e5a279ea03..2c6a02002d4 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -324,7 +324,10 @@ QList NavigatorTreeModel::filteredList(const NodeListProperty &proper if (filter) { list.append(::Utils::filtered(nameFilteredList, [](const ModelNode &arg) { - const bool value = (QmlItemNode::isValidQmlItemNode(arg) || NodeHints::fromModelNode(arg).visibleInNavigator()) + const bool visibleInNavigator = NodeHints::fromModelNode(arg).visibleInNavigator(); + const bool hideInNavigator = NodeHints::fromModelNode(arg).hideInNavigator(); + const bool value = ((QmlItemNode::isValidQmlItemNode(arg) && !hideInNavigator) + || visibleInNavigator) && arg.id() != Constants::MATERIAL_LIB_ID; return value; })); diff --git a/src/plugins/qmldesigner/libs/designercore/include/nodehints.h b/src/plugins/qmldesigner/libs/designercore/include/nodehints.h index 99470db65f1..5992d7d64a3 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/nodehints.h +++ b/src/plugins/qmldesigner/libs/designercore/include/nodehints.h @@ -49,6 +49,7 @@ public: QStringList visibleNonDefaultProperties() const; bool takesOverRenderingOfChildren() const; bool visibleInNavigator() const; + bool hideInNavigator() const; bool visibleInLibrary() const; QString forceNonDefaultProperty() const; QPair setParentProperty() const; diff --git a/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h index ea01e9438b6..ed2920cac4b 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/libs/designercore/include/nodemetainfo.h @@ -87,6 +87,7 @@ public: FlagIs isStackedContainer() const; FlagIs takesOverRenderingOfChildren() const; FlagIs visibleInNavigator() const; + FlagIs hideInNavigator() const; FlagIs visibleInLibrary() const; bool hasProperty(::Utils::SmallStringView propertyName) const; diff --git a/src/plugins/qmldesigner/libs/designercore/metainfo/nodehints.cpp b/src/plugins/qmldesigner/libs/designercore/metainfo/nodehints.cpp index 1f9a3e42bd6..5cbae6861fa 100644 --- a/src/plugins/qmldesigner/libs/designercore/metainfo/nodehints.cpp +++ b/src/plugins/qmldesigner/libs/designercore/metainfo/nodehints.cpp @@ -321,6 +321,19 @@ bool NodeHints::visibleInNavigator() const return evaluateBooleanExpression("visibleInNavigator", false); } +bool NodeHints::hideInNavigator() const +{ + if (!isValid()) + return false; + + auto flagIs = m_modelNode.metaInfo().hideInNavigator(); + + if (flagIs != FlagIs::Set) + return convert(flagIs); + + return evaluateBooleanExpression("hideInNavigator", false); +} + bool NodeHints::visibleInLibrary() const { auto flagIs = m_metaInfo.visibleInLibrary(); diff --git a/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp index 47943e096e9..56836119d06 100644 --- a/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/libs/designercore/metainfo/nodemetainfo.cpp @@ -1780,6 +1780,18 @@ FlagIs NodeMetaInfo::visibleInNavigator() const return FlagIs::Set; } +FlagIs NodeMetaInfo::hideInNavigator() const +{ + if constexpr (useProjectStorage()) { + if (isValid()) + return typeData().traits.hideInNavigator; + + return FlagIs::False; + } + + return FlagIs::Set; +} + FlagIs NodeMetaInfo::visibleInLibrary() const { if constexpr (useProjectStorage()) { diff --git a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageinfotypes.h b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageinfotypes.h index 7d1598191d6..8b602ed65a9 100644 --- a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageinfotypes.h +++ b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageinfotypes.h @@ -147,6 +147,7 @@ struct TypeTraits , takesOverRenderingOfChildren{FlagIs::False} , visibleInNavigator{FlagIs::False} , visibleInLibrary{FlagIs::False} + , hideInNavigator{FlagIs::False} , dummy2{0U} {} @@ -193,7 +194,8 @@ struct TypeTraits keyValue("is stacked container", typeTraits.isStackedContainer), keyValue("takes over rendering of children", typeTraits.takesOverRenderingOfChildren), keyValue("visible in navigator", typeTraits.visibleInNavigator), - keyValue("visible in library", typeTraits.visibleInLibrary)); + keyValue("visible in library", typeTraits.visibleInLibrary), + keyValue("hide in navigator", typeTraits.hideInNavigator)); convertToString(string, dict); } @@ -228,7 +230,8 @@ struct TypeTraits FlagIs takesOverRenderingOfChildren : 2; FlagIs visibleInNavigator : 2; FlagIs visibleInLibrary : 2; - unsigned int dummy2 : 6; + FlagIs hideInNavigator : 2; + unsigned int dummy2 : 4; }; unsigned int annotation; diff --git a/src/plugins/qmldesigner/libs/designercore/projectstorage/typeannotationreader.cpp b/src/plugins/qmldesigner/libs/designercore/projectstorage/typeannotationreader.cpp index 71eba949662..4d604cdf2ea 100644 --- a/src/plugins/qmldesigner/libs/designercore/projectstorage/typeannotationreader.cpp +++ b/src/plugins/qmldesigner/libs/designercore/projectstorage/typeannotationreader.cpp @@ -400,6 +400,8 @@ void setTrait(QStringView name, FlagIs flag, Storage::TypeTraits &traits) traits.visibleInNavigator = flag; } else if (name == "visibleInLibrary"_L1) { traits.visibleInLibrary = flag; + } else if (name == "hideInNavigator"_L1) { + traits.hideInNavigator = flag; } } diff --git a/tests/unit/tests/printers/gtest-creator-printing.cpp b/tests/unit/tests/printers/gtest-creator-printing.cpp index fac58b7bd90..d7a63fe6900 100644 --- a/tests/unit/tests/printers/gtest-creator-printing.cpp +++ b/tests/unit/tests/printers/gtest-creator-printing.cpp @@ -656,6 +656,9 @@ std::ostream &operator<<(std::ostream &out, TypeTraits traits) if (traits.visibleInLibrary != QmlDesigner::FlagIs::False) out << " | visibleInLibrary(" << traits.visibleInLibrary << ")"; + if (traits.hideInNavigator != QmlDesigner::FlagIs::False) + out << " | hideInNavigator(" << traits.hideInNavigator << ")"; + return out << ")"; } diff --git a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp index b17a38098ee..f3f55136f27 100644 --- a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp +++ b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp @@ -3061,6 +3061,43 @@ TEST_F(NodeMetaInfo, invalid_is_not_visible_in_library) ASSERT_THAT(visibleInLibrary, FlagIs::False); } +TEST_F(NodeMetaInfo, object_is_not_hide_in_navigator) +{ + auto hideInNavigator = objectMetaInfo.hideInNavigator(); + + ASSERT_THAT(hideInNavigator, FlagIs::False); +} + +TEST_F(NodeMetaInfo, default_is_not_hide_in_navigator) +{ + auto hideInNavigator = QmlDesigner::NodeMetaInfo{}.hideInNavigator(); + + ASSERT_THAT(hideInNavigator, FlagIs::False); +} + +TEST_F(NodeMetaInfo, invalid_is_not_hide_in_navigator) +{ + auto node = model.createModelNode("Foo"); + auto metaInfo = node.metaInfo(); + + auto hideInNavigator = metaInfo.hideInNavigator(); + + ASSERT_THAT(hideInNavigator, FlagIs::False); +} + +TEST_F(NodeMetaInfo, component_is_hide_in_navigator) +{ + auto moduleId = projectStorageMock.createModule("/path/to/project", ModuleKind::PathLibrary); + TypeTraits traits{TypeTraitsKind::Reference}; + traits.hideInNavigator = FlagIs::True; + auto typeId = projectStorageMock.createType(moduleId, "Foo", traits); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + auto hideInNavigator = metaInfo.hideInNavigator(); + + ASSERT_THAT(hideInNavigator, FlagIs::True); +} + TEST_F(NodeMetaInfo, component_is_visible_in_library) { auto moduleId = projectStorageMock.createModule("/path/to/project", ModuleKind::PathLibrary); diff --git a/tests/unit/tests/unittests/projectstorage/typeannotationreader-test.cpp b/tests/unit/tests/unittests/projectstorage/typeannotationreader-test.cpp index b91a89bbaf7..2959a19799c 100644 --- a/tests/unit/tests/unittests/projectstorage/typeannotationreader-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/typeannotationreader-test.cpp @@ -236,6 +236,35 @@ TEST_F(TypeAnnotationReader, parse_false_canBeDroppedInNavigator) IsEmpty()))); } +TEST_F(TypeAnnotationReader, parse_true_hideInNavigator) +{ + using QmlDesigner::FlagIs; + auto content = QString{R"xy( + MetaInfo { + Type { + name: "QtQuick.Controls.Frame" + icon: "images/frame-icon16.png" + + Hints { + hideInNavigator: true + } + } + })xy"}; + traits.hideInNavigator = FlagIs::True; + + auto annotations = reader.parseTypeAnnotation(content, "/path", sourceId, directorySourceId); + + ASSERT_THAT(annotations, + ElementsAre(IsTypeAnnotation(sourceId, + directorySourceId, + "Frame", + moduleId("QtQuick.Controls"), + "/path/images/frame-icon16.png", + traits, + IsEmpty(), + IsEmpty()))); +} + TEST_F(TypeAnnotationReader, parse_true_canBeDroppedInView3D) { using QmlDesigner::FlagIs;