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 ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)63 void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override 64 { 65 LayoutProperty::ToJsonValue(json, filter); 66 /* no fixed attr below, just return */ 67 if (filter.IsFastFilter()) { 68 return; 69 } 70 std::string alignItems; 71 auto flexAlignItems = GetCrossAxisAlign().value_or(FlexAlign::CENTER); 72 if (isVertical_) { 73 alignItems = "HorizontalAlign.Center"; 74 if (flexAlignItems == FlexAlign::FLEX_START) { 75 alignItems = "HorizontalAlign.Start"; 76 } else if (flexAlignItems == FlexAlign::CENTER) { 77 alignItems = "HorizontalAlign.Center"; 78 } else if (flexAlignItems == FlexAlign::FLEX_END) { 79 alignItems = "HorizontalAlign.End"; 80 } 81 } else { 82 alignItems = "VerticalAlign.Center"; 83 if (flexAlignItems == FlexAlign::FLEX_START) { 84 alignItems = "VerticalAlign.Top"; 85 } else if (flexAlignItems == FlexAlign::CENTER) { 86 alignItems = "VerticalAlign.Center"; 87 } else if (flexAlignItems == FlexAlign::FLEX_END) { 88 alignItems = "VerticalAlign.Bottom"; 89 } 90 } 91 json->PutExtAttr("space", GetSpaceValue(Dimension(0.0f)).ToString().c_str(), filter); 92 json->PutExtAttr("alignItems", alignItems.c_str(), filter); 93 auto justifyContent = V2::ConvertFlexAlignToStirng(GetMainAxisAlign().value_or(FlexAlign::FLEX_START)); 94 json->PutExtAttr("justifyContent", justifyContent.c_str(), filter); 95 } 96 FromJson(const std::unique_ptr<JsonValue> & json)97 void FromJson(const std::unique_ptr<JsonValue>& json) override 98 { 99 static const std::unordered_map<std::string, FlexAlign> uMap { 100 { "Start", FlexAlign::FLEX_START }, 101 { "Top", FlexAlign::FLEX_START }, 102 { "Center", FlexAlign::CENTER }, 103 { "End", FlexAlign::FLEX_END }, 104 { "Bottom", FlexAlign::FLEX_END }, 105 }; 106 107 UpdateSpace(Dimension::FromString(json->GetString("space"))); 108 auto alignItems = json->GetString("alignItems"); 109 auto pos = alignItems.find('.'); 110 if (pos != std::string::npos) { 111 ++pos; 112 alignItems = alignItems.substr(pos, alignItems.length() - pos); 113 FlexAlign flexAlign = FlexAlign::CENTER; 114 auto iter = uMap.find(alignItems); 115 if (iter != uMap.end()) { 116 flexAlign = iter->second; 117 } 118 UpdateCrossAxisAlign(flexAlign); 119 } else { 120 LOGE("UITree |ERROR| invalid %{public}s", alignItems.c_str()); 121 } 122 UpdateMainAxisAlign(V2::ConvertStringToFlexAlign(json->GetString("justifyContent"))); 123 124 LayoutProperty::FromJson(json); 125 } 126 127 protected: Clone(RefPtr<LayoutProperty> property)128 void Clone(RefPtr<LayoutProperty> property) const override 129 { 130 auto value = DynamicCast<LinearLayoutProperty>(property); 131 FlexLayoutProperty::Clone(value); 132 value->isVertical_ = isVertical_; 133 } 134 135 private: 136 // This will call after ModifyLayoutConstraint. 137 bool isVertical_ = false; 138 139 ACE_DISALLOW_COPY_AND_MOVE(LinearLayoutProperty); 140 }; 141 } // namespace OHOS::Ace::NG 142 143 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_LAYOUTS_LAYOUT_PROPERTY_H 144