diff --git a/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js b/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js index 1b1bac7d358859ac00a2a1b735814b2aa7419b4c..94db898121aab05d641b5369f90efefb3e59fba1 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js +++ b/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js @@ -623,6 +623,18 @@ let FlexWrap; FlexWrap[FlexWrap.WrapReverse = 2] = 'WrapReverse'; })(FlexWrap || (FlexWrap = {})); +class LayoutPolicyPolicy { + id_ = ''; + + constructor(id) { + this.id_ = id; + } + + static get MATCH_PARENT() { + return new LayoutPolicyPolicy('MATCH_PARENT'); + } +} + var BlurStyle; (function (BlurStyle) { BlurStyle[BlurStyle.SmallLight = 100] = 'SmallLight'; diff --git a/frameworks/bridge/declarative_frontend/jsview/js_flex.cpp b/frameworks/bridge/declarative_frontend/jsview/js_flex.cpp index 099b9addfb3c0e739a913259106bfdc0b8095af1..3d7daa93817c880fb43617b3ef9559b5362e6b59 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_flex.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_flex.cpp @@ -98,8 +98,19 @@ void JSFlex::JsHeight(const JSCallbackInfo& info) void JSFlex::SetHeight(const JSRef& jsValue) { + FlexModel::GetInstance()->SetHeightLayoutPolicy(static_cast(LayoutCalPolicy::NO_MATCH)); if (!JSViewAbstract::JsHeight(jsValue)) { - // JsHeight return false, just return. + // JsHeight return false, check if set LayoutPolicy before return. + if (!jsValue->IsObject()) { + return; + } + JSRef object = JSRef::Cast(jsValue); + JSRef layoutPolicy = object->GetProperty("id_"); + if (layoutPolicy->IsString() && layoutPolicy->ToString() == "MATCH_PARENT") { + FlexModel::GetInstance()->SetHeightLayoutPolicy( + static_cast(LayoutCalPolicy::MATCH_PARENT)); + FlexModel::GetInstance()->SetHasHeight(); + } return; } FlexModel::GetInstance()->SetHasHeight(); @@ -116,8 +127,19 @@ void JSFlex::JsWidth(const JSCallbackInfo& info) void JSFlex::SetWidth(const JSRef& jsValue) { + FlexModel::GetInstance()->SetWidthLayoutPolicy(static_cast(LayoutCalPolicy::NO_MATCH)); if (!JSViewAbstract::JsWidth(jsValue)) { - // JsWidth return false, just return. + // JsWidth return false, check if set LayoutPolicy before return. + if (!jsValue->IsObject()) { + return; + } + JSRef object = JSRef::Cast(jsValue); + JSRef layoutPolicy = object->GetProperty("id_"); + if (layoutPolicy->IsString() && layoutPolicy->ToString() == "MATCH_PARENT") { + FlexModel::GetInstance()->SetWidthLayoutPolicy( + static_cast(LayoutCalPolicy::MATCH_PARENT)); + FlexModel::GetInstance()->SetHasWidth(); + } return; } FlexModel::GetInstance()->SetHasWidth(); diff --git a/frameworks/bridge/declarative_frontend/jsview/models/flex_model_impl.h b/frameworks/bridge/declarative_frontend/jsview/models/flex_model_impl.h index 93af83889437a9cc958e21178a84674e2358f348..3a00ff1a0b4f294b2c0a5c4b0156a03bc59200fa 100644 --- a/frameworks/bridge/declarative_frontend/jsview/models/flex_model_impl.h +++ b/frameworks/bridge/declarative_frontend/jsview/models/flex_model_impl.h @@ -48,6 +48,8 @@ public: void SetAlignContent(int32_t value) override; void SetMainSpace(const std::optional& space) override {}; void SetCrossSpace(const std::optional& space) override {}; + void SetWidthLayoutPolicy(uint8_t widthLayoutPolicy) override {}; + void SetHeightLayoutPolicy(uint8_t heightLayoutPolicy) override {}; }; } // namespace OHOS::Ace::Framework diff --git a/frameworks/core/components/common/layout/constants.h b/frameworks/core/components/common/layout/constants.h index 7779e702a6e6128bae33439bb6f9574d17c16b68..09fc05041628eab848d2410ac150a5b8dd160064 100644 --- a/frameworks/core/components/common/layout/constants.h +++ b/frameworks/core/components/common/layout/constants.h @@ -524,6 +524,11 @@ enum class PixelRoundCalcPolicy { FORCE_FLOOR = 2, }; +enum class LayoutCalPolicy { + NO_MATCH = 0, + MATCH_PARENT = 1, +}; + const ImageRepeat IMAGE_REPEATS[] = { ImageRepeat::REPEAT, ImageRepeat::REPEAT_X, diff --git a/frameworks/core/components_ng/base/frame_node.cpp b/frameworks/core/components_ng/base/frame_node.cpp index 42769a2d6db978ed39e7a87ef0a87ddc712ade6d..7b346de4b34994a4b9db8547155c7679b8232b45 100644 --- a/frameworks/core/components_ng/base/frame_node.cpp +++ b/frameworks/core/components_ng/base/frame_node.cpp @@ -729,6 +729,24 @@ void FrameNode::DumpCommonInfo() DumpLog::GetInstance().AddDesc(std::string("FrameRect: ").append(geometryNode_->GetFrameRect().ToString())); DumpLog::GetInstance().AddDesc( std::string("PaintRect without transform: ").append(renderContext_->GetPaintRectWithoutTransform().ToString())); + if (GetHostTag() == V2::COLUMN_ETS_TAG || GetHostTag() == V2::ROW_ETS_TAG) { + auto widthLayoutPolicy = AceType::DynamicCast(layoutProperty_) + ->GetWidthLayoutPolicy() + .value_or(static_cast(LayoutCalPolicy::NO_MATCH)); + auto heightLayoutPolicy = AceType::DynamicCast(layoutProperty_) + ->GetHeightLayoutPolicy() + .value_or(static_cast(LayoutCalPolicy::NO_MATCH)); + std::string layoutPolicy = ""; + if (widthLayoutPolicy != static_cast(LayoutCalPolicy::NO_MATCH)) { + layoutPolicy.append("WidthLayoutPolicy: ").append(std::to_string(widthLayoutPolicy)); + } + if (heightLayoutPolicy != static_cast(LayoutCalPolicy::NO_MATCH)) { + layoutPolicy.append("HeightLayoutPolicy: ").append(std::to_string(heightLayoutPolicy)); + } + if (layoutPolicy.length() > 0) { + DumpLog::GetInstance().AddDesc(layoutPolicy); + } + } if (renderContext_->GetBackgroundColor()->ColorToString().compare("#00000000") != 0) { DumpLog::GetInstance().AddDesc( std::string("BackgroundColor: ").append(renderContext_->GetBackgroundColor()->ColorToString())); diff --git a/frameworks/core/components_ng/pattern/flex/flex_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/flex/flex_layout_algorithm.cpp index dd58702eabb7cc47fbc8a2249926cf83f15daabd..8cd1d3f81846c1a809544a48ce807f0c30ceb0e5 100644 --- a/frameworks/core/components_ng/pattern/flex/flex_layout_algorithm.cpp +++ b/frameworks/core/components_ng/pattern/flex/flex_layout_algorithm.cpp @@ -260,6 +260,7 @@ void FlexLayoutAlgorithm::TravelChildrenFlexProps(LayoutWrapper* layoutWrapper) maxDisplayPriority_ = 0; totalFlexWeight_ = 0.0f; outOfLayoutChildren_.clear(); + layoutPolicyChildren_.clear(); magicNodes_.clear(); magicNodeWeights_.clear(); childrenHasAlignSelfBaseLine_ = false; @@ -268,8 +269,15 @@ void FlexLayoutAlgorithm::TravelChildrenFlexProps(LayoutWrapper* layoutWrapper) auto childLayoutConstraint = layoutProperty->CreateChildConstraint(); childrenCount_ = 0; for (const auto& child : children) { + bool checkNeedSkip = false; + if (child->GetHostTag() == V2::COLUMN_ETS_TAG || child->GetHostTag() == V2::ROW_ETS_TAG) { + checkNeedSkip = AddElementIntoLayoutPolicyChildren(layoutWrapper, child); + } if (child->IsOutOfLayout()) { outOfLayoutChildren_.emplace_back(child); + checkNeedSkip = true; + } + if (checkNeedSkip) { continue; } childrenCount_++; @@ -301,6 +309,22 @@ void FlexLayoutAlgorithm::TravelChildrenFlexProps(LayoutWrapper* layoutWrapper) } } +bool FlexLayoutAlgorithm::AddElementIntoLayoutPolicyChildren(LayoutWrapper* layoutWrapper, RefPtr child) +{ + auto widthLayoutPolicy = + AceType::DynamicCast(layoutWrapper->GetLayoutProperty())->GetWidthLayoutPolicy(); + auto heightLayoutPolicy = + AceType::DynamicCast(layoutWrapper->GetLayoutProperty())->GetHeightLayoutPolicy(); + if (widthLayoutPolicy.value_or(static_cast(LayoutCalPolicy::NO_MATCH)) == + static_cast(LayoutCalPolicy::NO_MATCH) && + heightLayoutPolicy.value_or(static_cast(LayoutCalPolicy::NO_MATCH)) == + static_cast(LayoutCalPolicy::NO_MATCH)) { + return false; + } + layoutPolicyChildren_.emplace_back(child); + return true; +} + void FlexLayoutAlgorithm::UpdateAllocatedSize(const RefPtr& childLayoutWrapper, float& crossAxisSize) { float mainAxisSize = GetChildMainAxisSize(childLayoutWrapper); @@ -314,9 +338,32 @@ void FlexLayoutAlgorithm::UpdateAllocatedSize(const RefPtr& child void FlexLayoutAlgorithm::MeasureOutOfLayoutChildren(LayoutWrapper* layoutWrapper) { - const auto& layoutConstrain = layoutWrapper->GetLayoutProperty()->CreateChildConstraint(); + const auto& layoutConstraint = layoutWrapper->GetLayoutProperty()->CreateChildConstraint(); for (const auto& child : outOfLayoutChildren_) { - child->Measure(layoutConstrain); + child->Measure(layoutConstraint); + } +} + +void FlexLayoutAlgorithm::MeasureAdaptiveLayoutChildren(LayoutWrapper* layoutWrapper, const SizeF& realSize) +{ + auto layoutConstraint = layoutWrapper->GetLayoutProperty()->CreateChildConstraint(); + layoutConstraint.parentIdealSize.SetSize(realSize); + for (const auto& child : layoutPolicyChildren_) { + child->Measure(layoutConstraint); + auto geometryNode = child->GetGeometryNode(); + CHECK_NULL_CONTINUE(geometryNode); + auto widthLayoutPolicy = + AceType::DynamicCast(layoutWrapper->GetLayoutProperty())->GetWidthLayoutPolicy(); + auto heightLayoutPolicy = + AceType::DynamicCast(layoutWrapper->GetLayoutProperty())->GetHeightLayoutPolicy(); + if (widthLayoutPolicy.value_or(static_cast(LayoutCalPolicy::NO_MATCH)) == + static_cast(LayoutCalPolicy::MATCH_PARENT)) { + geometryNode->SetFrameWidth(realSize.Width()); + } + if (heightLayoutPolicy.value_or(static_cast(LayoutCalPolicy::NO_MATCH)) == + static_cast(LayoutCalPolicy::MATCH_PARENT)) { + geometryNode->SetFrameHeight(realSize.Height()); + } } } @@ -963,6 +1010,17 @@ void FlexLayoutAlgorithm::Measure(LayoutWrapper* layoutWrapper) layoutWrapper->GetGeometryNode()->SetFrameSize(realSize); return; } + if (layoutWrapper->GetHostTag() == V2::COLUMN_ETS_TAG || layoutWrapper->GetHostTag() == V2::ROW_ETS_TAG) { + auto widthLayoutPolicy = + AceType::DynamicCast(layoutWrapper->GetLayoutProperty())->GetWidthLayoutPolicy(); + auto heightLayoutPolicy = + AceType::DynamicCast(layoutWrapper->GetLayoutProperty())->GetHeightLayoutPolicy(); + auto layoutPolicySize = ConstrainIdealSizeByLayoutPolicy(layoutConstraint.value(), + widthLayoutPolicy.value_or(static_cast(LayoutCalPolicy::NO_MATCH)), + heightLayoutPolicy.value_or(static_cast(LayoutCalPolicy::NO_MATCH)), axis) + .ConvertToSizeT(); + realSize.UpdateIllegalSizeWithCheck(layoutPolicySize); + } mainAxisSize_ = GetMainAxisSizeHelper(realSize, direction_); SetInitMainAxisSize(layoutWrapper); auto padding = layoutWrapper->GetLayoutProperty()->CreatePaddingAndBorder(); @@ -1002,6 +1060,11 @@ void FlexLayoutAlgorithm::Measure(LayoutWrapper* layoutWrapper) SetFinalRealSize(layoutWrapper, realSize); layoutWrapper->GetGeometryNode()->SetFrameSize(realSize); + + if (layoutWrapper->GetHostTag() == V2::COLUMN_ETS_TAG || layoutWrapper->GetHostTag() == V2::ROW_ETS_TAG) { + MeasureAdaptiveLayoutChildren(layoutWrapper, realSize); + } + ApplyPatternOperation(layoutWrapper, FlexOperatorType::UPDATE_MEASURE_RESULT, reinterpret_cast(this)); } diff --git a/frameworks/core/components_ng/pattern/flex/flex_layout_algorithm.h b/frameworks/core/components_ng/pattern/flex/flex_layout_algorithm.h index 7bd7e5cf0ffb3c3c13c136d4ca9450f31fe51319..f20e400ddd2f789f5b0be009d24ee2f11ef524f8 100644 --- a/frameworks/core/components_ng/pattern/flex/flex_layout_algorithm.h +++ b/frameworks/core/components_ng/pattern/flex/flex_layout_algorithm.h @@ -83,6 +83,7 @@ private: FlexAlign GetSelfAlign(const RefPtr& layoutWrapper) const; float GetStretchCrossAxisLimit() const; void MeasureOutOfLayoutChildren(LayoutWrapper* layoutWrapper); + void MeasureAdaptiveLayoutChildren(LayoutWrapper* layoutWrapper, const SizeF& realSize); void MeasureAndCleanMagicNodes(LayoutWrapper* containerLayoutWrapper, FlexItemProperties& flexItemProperties); bool HandleBlankFirstTimeMeasure(const MagicLayoutNode& child, FlexItemProperties& flexItemProperties); void UpdateFlexProperties(FlexItemProperties& flexItemProperties, const RefPtr& layoutWrapper); @@ -104,6 +105,7 @@ private: void SetFinalRealSize(LayoutWrapper* layoutWrapper, SizeF& realSize); void SetCrossPos(const RefPtr& layoutWrapper, float& crossPos); void AddElementIntoMagicNodes(int32_t childDisplayPriority, MagicLayoutNode node, float childLayoutWeight); + bool AddElementIntoLayoutPolicyChildren(LayoutWrapper* layoutWrapper, RefPtr child); std::map>::reverse_iterator FirstMeasureInWeightMode(); void SecondMeasureInWeightMode(std::map>::reverse_iterator firstLoopIter); void FinalMeasureInWeightMode(); @@ -150,6 +152,7 @@ private: std::map magicNodeWeights_; std::list secondaryMeasureList_; std::list> outOfLayoutChildren_; + std::list> layoutPolicyChildren_; FlexDirection direction_ = FlexDirection::ROW; friend class LinearLayoutUtils; diff --git a/frameworks/core/components_ng/pattern/flex/flex_layout_property.h b/frameworks/core/components_ng/pattern/flex/flex_layout_property.h index ee3ce7b431c6d39429fda864726651f2bb29c568..64edeeb223c2e5358473f2c071743609b322781f 100644 --- a/frameworks/core/components_ng/pattern/flex/flex_layout_property.h +++ b/frameworks/core/components_ng/pattern/flex/flex_layout_property.h @@ -68,6 +68,9 @@ public: ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FlexLayoutAttribute, CrossAxisAlign, FlexAlign, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FlexLayoutAttribute, Space, Dimension, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FlexLayoutAttribute, IsReverse, bool, PROPERTY_UPDATE_MEASURE); + ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FlexLayoutAttribute, WidthLayoutPolicy, uint8_t, PROPERTY_UPDATE_MEASURE); + ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( + FlexLayoutAttribute, HeightLayoutPolicy, uint8_t, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_GROUP(WrapLayoutAttribute, WrapLayoutAttribute); ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(WrapLayoutAttribute, WrapDirection, WrapDirection, PROPERTY_UPDATE_MEASURE); diff --git a/frameworks/core/components_ng/pattern/flex/flex_layout_styles.h b/frameworks/core/components_ng/pattern/flex/flex_layout_styles.h index aac3549cd9f28d1e6456c8354589a20921749895..caf992b6cb5666c56ddd0a5e8b5d9d3e8842cda8 100644 --- a/frameworks/core/components_ng/pattern/flex/flex_layout_styles.h +++ b/frameworks/core/components_ng/pattern/flex/flex_layout_styles.h @@ -26,6 +26,8 @@ struct FlexLayoutAttribute { ACE_DEFINE_PROPERTY_GROUP_ITEM(CrossAxisAlign, FlexAlign); ACE_DEFINE_PROPERTY_GROUP_ITEM(Space, Dimension); ACE_DEFINE_PROPERTY_GROUP_ITEM(IsReverse, bool); + ACE_DEFINE_PROPERTY_GROUP_ITEM(WidthLayoutPolicy, uint8_t); + ACE_DEFINE_PROPERTY_GROUP_ITEM(HeightLayoutPolicy, uint8_t); }; struct WrapLayoutAttribute { diff --git a/frameworks/core/components_ng/pattern/flex/flex_model.h b/frameworks/core/components_ng/pattern/flex/flex_model.h index 207067d19560fc4751508f718ee0aae08f72a6d2..c58eed5c743d5fea44ffbf61bc1a8fb433e514f0 100644 --- a/frameworks/core/components_ng/pattern/flex/flex_model.h +++ b/frameworks/core/components_ng/pattern/flex/flex_model.h @@ -73,6 +73,8 @@ public: virtual void SetAlignContent(int32_t value) = 0; virtual void SetMainSpace(const std::optional& space) = 0; virtual void SetCrossSpace(const std::optional& space) = 0; + virtual void SetWidthLayoutPolicy(uint8_t widthLayoutPolicy) = 0; + virtual void SetHeightLayoutPolicy(uint8_t heightLayoutPolicy) = 0; }; } // namespace OHOS::Ace #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_FLEX_FLEX_MODEL_H diff --git a/frameworks/core/components_ng/pattern/flex/flex_model_ng.cpp b/frameworks/core/components_ng/pattern/flex/flex_model_ng.cpp index 2fb0eca101ab99aac40ad19868c9656baffabf5a..9f20c2c139bf4daba849a3e571f09f7618241ee0 100644 --- a/frameworks/core/components_ng/pattern/flex/flex_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/flex/flex_model_ng.cpp @@ -217,6 +217,26 @@ void FlexModelNG::SetFlexAlignContent(FrameNode* frameNode, int32_t value) ACE_UPDATE_NODE_LAYOUT_PROPERTY(FlexLayoutProperty, Alignment, static_cast(value), frameNode); } +void FlexModelNG::SetWidthLayoutPolicy(uint8_t widthLayoutPolicy) +{ + ACE_UPDATE_LAYOUT_PROPERTY(FlexLayoutProperty, WidthLayoutPolicy, widthLayoutPolicy); +} + +void FlexModelNG::SetWidthLayoutPolicy(FrameNode* frameNode, uint8_t widthLayoutPolicy) +{ + ACE_UPDATE_NODE_LAYOUT_PROPERTY(FlexLayoutProperty, WidthLayoutPolicy, widthLayoutPolicy, frameNode); +} + +void FlexModelNG::SetHeightLayoutPolicy(uint8_t heightLayoutPolicy) +{ + ACE_UPDATE_LAYOUT_PROPERTY(FlexLayoutProperty, HeightLayoutPolicy, heightLayoutPolicy); +} + +void FlexModelNG::SetHeightLayoutPolicy(FrameNode* frameNode, uint8_t heightLayoutPolicy) +{ + ACE_UPDATE_NODE_LAYOUT_PROPERTY(FlexLayoutProperty, HeightLayoutPolicy, heightLayoutPolicy, frameNode); +} + int FlexModelNG::GetFlexWrap(FrameNode* frameNode) { int value = 0; diff --git a/frameworks/core/components_ng/pattern/flex/flex_model_ng.h b/frameworks/core/components_ng/pattern/flex/flex_model_ng.h index 13277f4079ed84f4c62950f28d102d8713d0566e..3a2b7e811db5c13d33d332ecd37df06d4663f666 100644 --- a/frameworks/core/components_ng/pattern/flex/flex_model_ng.h +++ b/frameworks/core/components_ng/pattern/flex/flex_model_ng.h @@ -49,6 +49,8 @@ public: void SetJustifyContent(int32_t value) override; void SetAlignContent(int32_t value) override; + void SetWidthLayoutPolicy(uint8_t widthLayoutPolicy) override; + void SetHeightLayoutPolicy(uint8_t heightLayoutPolicy) override; static RefPtr CreateFrameNode(int32_t nodeId); static void SetFlexRow(FrameNode* frameNode); @@ -58,6 +60,8 @@ public: static void SetFlexJustifyContent(FrameNode* frameNode, int32_t value); static void SetFlexAlignItems(FrameNode* frameNode, int32_t value); static void SetFlexAlignContent(FrameNode* frameNode, int32_t value); + static void SetWidthLayoutPolicy(FrameNode* frameNode, uint8_t widthLayoutPolicy); + static void SetHeightLayoutPolicy(FrameNode* frameNode, uint8_t heightLayoutPolicy); static int GetFlexWrap(FrameNode* frameNode); static int GetFlexDirection(FrameNode* frameNode); diff --git a/frameworks/core/components_ng/property/measure_utils.cpp b/frameworks/core/components_ng/property/measure_utils.cpp index c3565db17c72b63507206f524a1e575fe7638e7d..1d9969d7c8bc9057420f01f1c3aceb43e64994d4 100644 --- a/frameworks/core/components_ng/property/measure_utils.cpp +++ b/frameworks/core/components_ng/property/measure_utils.cpp @@ -483,6 +483,30 @@ OptionalSizeF CreateIdealSizeByPercentRef( return idealSize; } +OptionalSizeF ConstrainIdealSizeByLayoutPolicy(const LayoutConstraintF& layoutConstraint, + uint8_t widthLayoutPolicy, uint8_t heightLayoutPolicy, Axis axis) +{ + bool isHorizontal = axis == Axis::HORIZONTAL; + bool mainAxisMatchParent = (isHorizontal ? widthLayoutPolicy : heightLayoutPolicy) == + static_cast(LayoutCalPolicy::MATCH_PARENT); + bool crossAxisMatchParent = (isHorizontal ? heightLayoutPolicy : widthLayoutPolicy) == + static_cast(LayoutCalPolicy::MATCH_PARENT); + OptionalSizeF idealSize; + if (mainAxisMatchParent) { + auto parentMainSize = GetMainAxisSize(layoutConstraint.parentIdealSize, axis); + if (parentMainSize) { + SetMainAxisSize(parentMainSize.value(), axis, idealSize); + } + } + if (crossAxisMatchParent) { + auto parentCrossSize = GetCrossAxisSize(layoutConstraint.parentIdealSize, axis); + if (parentCrossSize) { + SetCrossAxisSize(parentCrossSize.value(), axis, idealSize); + } + } + return idealSize; +} + void CreateChildrenConstraint(SizeF& size, const PaddingPropertyF& padding) { float width = 0; diff --git a/frameworks/core/components_ng/property/measure_utils.h b/frameworks/core/components_ng/property/measure_utils.h index d43b65a211227b511ee0109655b995ec2d19b258..a8e09908523f42429536c2c8d4c81ef843fd0314 100644 --- a/frameworks/core/components_ng/property/measure_utils.h +++ b/frameworks/core/components_ng/property/measure_utils.h @@ -135,6 +135,18 @@ ACE_FORCE_EXPORT OptionalSizeF CreateIdealSize( OptionalSizeF CreateIdealSizeByPercentRef(const LayoutConstraintF& layoutConstraint, Axis axis, MeasureType measureType, bool needToConstrain = false, const std::unique_ptr& rawConstraint = nullptr); +/** + * @brief Constrain node IdealSize by LayoutPolicy. + * + * @param layoutConstraint the constraint of current node. + * @param widthLayoutPolicy the LayoutPolicy of width. + * @param heightLayoutPolicy the LayoutPolicy of height. + * @param axis the axis of this node. + * @return SizeF the node size info. + */ +OptionalSizeF ConstrainIdealSizeByLayoutPolicy(const LayoutConstraintF& layoutConstraint, + uint8_t widthLayoutPolicy, uint8_t heightLayoutPolicy, Axis axis); + /** * @brief Create max size for children which is parent's max size minus margin and padding. *