1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_FLEX_FLEX_LAYOUT_ALGORITHM_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_FLEX_FLEX_LAYOUT_ALGORITHM_H 18 19 #include "core/components/common/layout/constants.h" 20 #include "core/components_ng/layout/layout_algorithm.h" 21 #include "core/components_ng/layout/layout_wrapper.h" 22 #include "core/components_ng/pattern/flex/flex_layout_styles.h" 23 24 namespace OHOS::Ace::NG { 25 26 struct FlexItemProperties { 27 float totalShrink = 0.0f; 28 float totalGrow = 0.0f; 29 RefPtr<LayoutWrapper> lastShrinkChild; 30 RefPtr<LayoutWrapper> lastGrowChild; 31 }; 32 33 struct MagicLayoutNode { 34 LayoutConstraintF layoutConstraint; 35 RefPtr<LayoutWrapper> layoutWrapper; 36 OptionalSizeF calcSize; 37 bool needSecondMeasure = false; 38 }; 39 40 struct BaselineProperties { 41 float maxBaselineDistance = 0.0f; 42 float maxDistanceAboveBaseline = 0.0f; 43 float maxDistanceBelowBaseline = 0.0f; 44 ResetBaselineProperties45 void Reset() 46 { 47 maxBaselineDistance = 0.0f; 48 maxDistanceAboveBaseline = 0.0f; 49 maxDistanceBelowBaseline = 0.0f; 50 } 51 }; 52 53 class ACE_EXPORT FlexLayoutAlgorithm : public LayoutAlgorithm { 54 DECLARE_ACE_TYPE(FlexLayoutAlgorithm, LayoutAlgorithm); 55 56 public: 57 FlexLayoutAlgorithm() = default; 58 ~FlexLayoutAlgorithm() override = default; 59 60 void Measure(LayoutWrapper* layoutWrapper) override; 61 62 void Layout(LayoutWrapper* layoutWrapper) override; 63 SetLinearLayoutFeature()64 void SetLinearLayoutFeature() 65 { 66 isLinearLayoutFeature_ = true; 67 } 68 69 private: 70 void InitFlexProperties(LayoutWrapper* layoutWrapper); 71 void TravelChildrenFlexProps(LayoutWrapper* layoutWrapper, const SizeF& realSize); 72 void UpdateAllocatedSize(const RefPtr<LayoutWrapper>& layoutWrapper, float& crossAxisSize); 73 float GetChildMainAxisSize(const RefPtr<LayoutWrapper>& layoutWrapper) const; 74 float GetChildCrossAxisSize(const RefPtr<LayoutWrapper>& layoutWrapper) const; 75 float GetSelfCrossAxisSize(const RefPtr<LayoutWrapper>& layoutWrapper) const; 76 void CheckSizeValidity(const RefPtr<LayoutWrapper>& layoutWrapper); 77 void CheckBaselineProperties(const RefPtr<LayoutWrapper>& layoutWrapper); 78 void CalculateSpace(float remainSpace, float& frontSpace, float& betweenSpace) const; 79 void PlaceChildren( 80 LayoutWrapper* layoutWrapper, float frontSpace, float betweenSpace, const OffsetF& paddingOffset); 81 FlexAlign GetSelfAlign(const RefPtr<LayoutWrapper>& layoutWrapper) const; 82 float GetStretchCrossAxisLimit() const; 83 void MeasureOutOfLayoutChildren(LayoutWrapper* layoutWrapper); 84 void MeasureAndCleanMagicNodes(LayoutWrapper* containerLayoutWrapper, FlexItemProperties& flexItemProperties); 85 bool HandleBlankFirstTimeMeasure(const MagicLayoutNode& child, FlexItemProperties& flexItemProperties); 86 void UpdateFlexProperties(FlexItemProperties& flexItemProperties, const RefPtr<LayoutWrapper>& layoutWrapper); 87 void SecondaryMeasureByProperty(FlexItemProperties& flexItemProperties, LayoutWrapper* layoutWrapper); 88 void UpdateLayoutConstraintOnMainAxis(LayoutConstraintF& layoutConstraint, float size); 89 void UpdateLayoutConstraintOnCrossAxis(LayoutConstraintF& layoutConstraint, float size); 90 void AdjustTotalAllocatedSize(LayoutWrapper* layoutWrapper); 91 void CheckIsGrowOrShrink(std::function<float(const RefPtr<LayoutWrapper>&)>& getFlex, float remainSpace, 92 float& spacePerFlex, FlexItemProperties& flexItemProperties, RefPtr<LayoutWrapper>& lastChild); 93 void CheckBlankAndKeepMin(const RefPtr<LayoutWrapper>& childLayoutWrapper, float& flexSize); 94 95 OptionalSizeF realSize_; 96 float mainAxisSize_ = 0.0f; 97 float crossAxisSize_ = 0.0f; 98 float selfIdealCrossAxisSize_ = -1.0f; 99 float allocatedSize_ = 0.0f; 100 float space_ = 0.0f; 101 float totalFlexWeight_ = 0.0f; 102 int32_t maxDisplayPriority_ = 0; 103 int32_t validSizeCount_ = 0; 104 FlexAlign crossAxisAlign_ = FlexAlign::FLEX_START; 105 FlexAlign mainAxisAlign_ = FlexAlign::FLEX_START; 106 107 std::map<int32_t, std::list<MagicLayoutNode>> magicNodes_; 108 std::map<int32_t, float> magicNodeWeights_; 109 std::list<MagicLayoutNode> secondaryMeasureList_; 110 std::list<RefPtr<LayoutWrapper>> outOfLayoutChildren_; 111 112 FlexDirection direction_ = FlexDirection::ROW; 113 friend class LinearLayoutUtils; 114 BaselineProperties baselineProperties_; 115 bool isLinearLayoutFeature_ = false; 116 bool isInfiniteLayout_ = false; 117 bool selfAdaptive_ = false; 118 TextDirection textDir_ = TextDirection::LTR; 119 bool childrenHasAlignSelfBaseLine_ = false; 120 121 ACE_DISALLOW_COPY_AND_MOVE(FlexLayoutAlgorithm); 122 }; 123 } // namespace OHOS::Ace::NG 124 125 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_FLEX_FLEX_LAYOUT_ALGORITHM_H 126