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_LINEAR_LAYOUT_LINEAR_LAYOUT_PROPERTY_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_LINEAR_LAYOUT_LINEAR_LAYOUT_PROPERTY_H 18 19 #include "base/geometry/dimension.h" 20 #include "core/components/common/layout/constants.h" 21 #include "core/components_ng/base/inspector_filter.h" 22 #include "core/components_ng/layout/layout_property.h" 23 #include "core/components_ng/pattern/flex/flex_layout_property.h" 24 #include "core/components_ng/property/flex_property.h" 25 #include "core/components_ng/property/property.h" 26 #include "core/components_v2/inspector/utils.h" 27 28 namespace OHOS::Ace::NG { 29 class ACE_EXPORT LinearLayoutProperty : public FlexLayoutProperty { 30 DECLARE_ACE_TYPE(LinearLayoutProperty, FlexLayoutProperty); 31 32 public: LinearLayoutProperty(bool isVertical)33 explicit LinearLayoutProperty(bool isVertical) : isVertical_(isVertical) 34 { 35 UpdateFlexDirection(isVertical_ ? FlexDirection::COLUMN : FlexDirection::ROW); 36 } 37 38 ~LinearLayoutProperty() override = default; 39 Clone()40 RefPtr<LayoutProperty> Clone() const override 41 { 42 auto value = MakeRefPtr<LinearLayoutProperty>(isVertical_); 43 Clone(value); 44 return value; 45 } 46 Reset()47 void Reset() override 48 { 49 FlexLayoutProperty::Reset(); 50 isVertical_ = false; 51 } 52 SetIsVertical(bool isVertical)53 void SetIsVertical(bool isVertical) 54 { 55 isVertical_ = isVertical; 56 } 57 IsVertical()58 bool IsVertical() const 59 { 60 return isVertical_; 61 } 62 GetPercentSensitive()63 std::pair<bool, bool> GetPercentSensitive() override 64 { 65 return LayoutProperty::GetPercentSensitive(); 66 } 67 ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)68 void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override 69 { 70 LayoutProperty::ToJsonValue(json, filter); 71 /* no fixed attr below, just return */ 72 if (filter.IsFastFilter()) { 73 return; 74 } 75 std::string alignItems; 76 auto flexAlignItems = GetCrossAxisAlign().value_or(FlexAlign::CENTER); 77 if (isVertical_) { 78 alignItems = "HorizontalAlign.Center"; 79 if (flexAlignItems == FlexAlign::FLEX_START) { 80 alignItems = "HorizontalAlign.Start"; 81 } else if (flexAlignItems == FlexAlign::CENTER) { 82 alignItems = "HorizontalAlign.Center"; 83 } else if (flexAlignItems == FlexAlign::FLEX_END) { 84 alignItems = "HorizontalAlign.End"; 85 } 86 } else { 87 alignItems = "VerticalAlign.Center"; 88 if (flexAlignItems == FlexAlign::FLEX_START) { 89 alignItems = "VerticalAlign.Top"; 90 } else if (flexAlignItems == FlexAlign::CENTER) { 91 alignItems = "VerticalAlign.Center"; 92 } else if (flexAlignItems == FlexAlign::FLEX_END) { 93 alignItems = "VerticalAlign.Bottom"; 94 } 95 } 96 json->PutExtAttr("space", GetSpaceValue(Dimension(0.0f)).ToString().c_str(), filter); 97 json->PutExtAttr("alignItems", alignItems.c_str(), filter); 98 auto justifyContent = V2::ConvertFlexAlignToStirng(GetMainAxisAlign().value_or(FlexAlign::FLEX_START)); 99 json->PutExtAttr("justifyContent", justifyContent.c_str(), filter); 100 } 101 FromJson(const std::unique_ptr<JsonValue> & json)102 void FromJson(const std::unique_ptr<JsonValue>& json) override 103 { 104 static const std::unordered_map<std::string, FlexAlign> uMap { 105 { "Start", FlexAlign::FLEX_START }, 106 { "Top", FlexAlign::FLEX_START }, 107 { "Center", FlexAlign::CENTER }, 108 { "End", FlexAlign::FLEX_END }, 109 { "Bottom", FlexAlign::FLEX_END }, 110 }; 111 112 UpdateSpace(Dimension::FromString(json->GetString("space"))); 113 auto alignItems = json->GetString("alignItems"); 114 auto pos = alignItems.find('.'); 115 if (pos != std::string::npos) { 116 ++pos; 117 alignItems = alignItems.substr(pos, alignItems.length() - pos); 118 FlexAlign flexAlign = FlexAlign::CENTER; 119 auto iter = uMap.find(alignItems); 120 if (iter != uMap.end()) { 121 flexAlign = iter->second; 122 } 123 UpdateCrossAxisAlign(flexAlign); 124 } else { 125 LOGE("UITree |ERROR| invalid %{public}s", alignItems.c_str()); 126 } 127 UpdateMainAxisAlign(V2::ConvertStringToFlexAlign(json->GetString("justifyContent"))); 128 129 LayoutProperty::FromJson(json); 130 } 131 132 protected: Clone(RefPtr<LayoutProperty> property)133 void Clone(RefPtr<LayoutProperty> property) const override 134 { 135 auto value = DynamicCast<LinearLayoutProperty>(property); 136 FlexLayoutProperty::Clone(value); 137 value->isVertical_ = isVertical_; 138 } 139 140 private: 141 // This will call after ModifyLayoutConstraint. 142 bool isVertical_ = false; 143 144 ACE_DISALLOW_COPY_AND_MOVE(LinearLayoutProperty); 145 }; 146 } // namespace OHOS::Ace::NG 147 148 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_LAYOUTS_LAYOUT_PROPERTY_H 149