From 7309d3e4cb3416d45a244e6d6406865c900f2a92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B0=B8=E5=87=AF?= Date: Wed, 7 May 2025 00:53:52 +0800 Subject: [PATCH] Constraint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘永凯 --- .../components_ng/layout/layout_property.cpp | 13 ++++ .../layout/layout_property_test_ng_two.cpp | 66 +++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/frameworks/core/components_ng/layout/layout_property.cpp b/frameworks/core/components_ng/layout/layout_property.cpp index 21c233c8b08..086a720e233 100644 --- a/frameworks/core/components_ng/layout/layout_property.cpp +++ b/frameworks/core/components_ng/layout/layout_property.cpp @@ -17,6 +17,7 @@ #include "core/components_ng/layout/layout_property.h" #include "core/pipeline_ng/pipeline_context.h" +#include "core/components_ng/pattern/custom/custom_measure_layout_node.h" #include "core/components_ng/property/grid_property.h" #include "core/components_ng/property/measure_utils.h" @@ -424,6 +425,18 @@ void LayoutProperty::UpdateLayoutConstraint(const LayoutConstraintF& parentConst } auto originMax = layoutConstraint_->maxSize; + auto host = GetHost(); + if (host && host->GetParent() && InstanceOf(host->GetParent()) && + GetLayoutPolicyProperty().has_value()) { + if (GetLayoutPolicyProperty().value().widthLayoutPolicy_.value_or(LayoutCalPolicy::NO_MATCH) == + LayoutCalPolicy::FIX_AT_IDEAL_SIZE) { + layoutConstraint_->maxSize.SetWidth(std::numeric_limits::infinity()); + } + if (GetLayoutPolicyProperty().value().heightLayoutPolicy_.value_or(LayoutCalPolicy::NO_MATCH) == + LayoutCalPolicy::FIX_AT_IDEAL_SIZE) { + layoutConstraint_->maxSize.SetHeight(std::numeric_limits::infinity()); + } + } CheckCalcLayoutConstraint(parentConstraint); CheckSelfIdealSize(originMax); CheckBorderAndPadding(); diff --git a/test/unittest/core/layout/layout_property_test_ng_two.cpp b/test/unittest/core/layout/layout_property_test_ng_two.cpp index 337cf36e6ce..3644e69366e 100644 --- a/test/unittest/core/layout/layout_property_test_ng_two.cpp +++ b/test/unittest/core/layout/layout_property_test_ng_two.cpp @@ -25,6 +25,7 @@ #include "base/geometry/dimension.h" #include "core/components/common/layout/constants.h" #include "core/components_ng/layout/layout_property.h" +#include "core/components_ng/pattern/custom/custom_measure_layout_node.h" #undef private #undef protected @@ -33,6 +34,15 @@ using namespace testing; using namespace testing::ext; namespace OHOS::Ace::NG { +LayoutConstraintF layoutConstraintF = { + .minSize = {1, 1}, + .maxSize = {10, 10}, + .percentReference = {5, 5}, + .parentIdealSize = {2, 2}, +}; +constexpr Dimension WIDTH = 1.0_vp; +constexpr Dimension HEIGHT = 2.0_vp; +const CalcSize CALC_SIZE = {CalcLength(WIDTH), CalcLength(HEIGHT)}; namespace { } // namespace @@ -1186,4 +1196,60 @@ HWTEST_F(LayoutPropertyTestNgTwo, UpdateIsMirrorable001, TestSize.Level1) auto isMirrorable1 = layoutProperty->GetPositionProperty()->GetIsMirrorable().value_or(false); EXPECT_EQ(isMirrorable1, false); } + +HWTEST_F(LayoutPropertyTestNgTwo, UpdateLayoutConstraint001, TestSize.Level1) +{ + /** + * @tc.steps1 Create a layoutProperty and constraint. + */ + auto layoutProperty = AceType::MakeRefPtr(); + MeasureProperty constraint; + constraint.maxSize = CALC_SIZE; + constraint.minSize = CALC_SIZE; + constraint.selfIdealSize = CALC_SIZE; + layoutProperty->calcLayoutConstraint_ = std::make_unique(constraint); + layoutProperty->magicItemProperty_.UpdateAspectRatio(1.0); + layoutProperty->measureType_ = MeasureType::MATCH_PARENT; + auto frameNode = FrameNode::CreateFrameNode("host", 1, AceType::MakeRefPtr(), true); + ASSERT_NE(frameNode, nullptr); + auto customMeasureLayoutNode = CustomMeasureLayoutNode::CreateCustomMeasureLayoutNode(2, V2::TEXT_ETS_TAG); + ASSERT_NE(customMeasureLayoutNode, nullptr); + frameNode->parent_ = customMeasureLayoutNode; + layoutProperty->SetHost(frameNode); + LayoutPolicyProperty layoutPolicyProperty; + layoutPolicyProperty.widthLayoutPolicy_ = LayoutCalPolicy::FIX_AT_IDEAL_SIZE; + layoutPolicyProperty.heightLayoutPolicy_ = LayoutCalPolicy::FIX_AT_IDEAL_SIZE; + layoutProperty->layoutPolicy_ = layoutPolicyProperty; + layoutProperty->UpdateLayoutConstraint(std::move(layoutConstraintF)); + EXPECT_EQ(layoutProperty->calcLayoutConstraint_->maxSize.value(), CALC_SIZE); + EXPECT_EQ(layoutProperty->calcLayoutConstraint_->minSize.value(), CALC_SIZE); +} + +HWTEST_F(LayoutPropertyTestNgTwo, UpdateLayoutConstraint002, TestSize.Level1) +{ + /** + * @tc.steps1 Create a layoutProperty and constraint. + */ + auto layoutProperty = AceType::MakeRefPtr(); + MeasureProperty constraint; + constraint.maxSize = CALC_SIZE; + constraint.minSize = CALC_SIZE; + constraint.selfIdealSize = CALC_SIZE; + layoutProperty->calcLayoutConstraint_ = std::make_unique(constraint); + layoutProperty->magicItemProperty_.UpdateAspectRatio(1.0); + layoutProperty->measureType_ = MeasureType::MATCH_PARENT; + auto frameNode = FrameNode::CreateFrameNode("host", 1, AceType::MakeRefPtr(), true); + ASSERT_NE(frameNode, nullptr); + auto customMeasureLayoutNode = CustomMeasureLayoutNode::CreateCustomMeasureLayoutNode(2, V2::TEXT_ETS_TAG); + ASSERT_NE(customMeasureLayoutNode, nullptr); + frameNode->parent_ = customMeasureLayoutNode; + layoutProperty->SetHost(frameNode); + LayoutPolicyProperty layoutPolicyProperty; + layoutPolicyProperty.widthLayoutPolicy_ = LayoutCalPolicy::NO_MATCH; + layoutPolicyProperty.heightLayoutPolicy_ = LayoutCalPolicy::NO_MATCH; + layoutProperty->layoutPolicy_ = layoutPolicyProperty; + layoutProperty->UpdateLayoutConstraint(std::move(layoutConstraintF)); + EXPECT_EQ(layoutProperty->calcLayoutConstraint_->maxSize.value(), CALC_SIZE); + EXPECT_EQ(layoutProperty->calcLayoutConstraint_->minSize.value(), CALC_SIZE); +} } -- Gitee