1 /* 2 * Copyright (c) 2022-2023 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_SIDE_BAR_SIDE_BAR_CONTAINER_LAYOUT_PROPERTY_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SIDE_BAR_SIDE_BAR_CONTAINER_LAYOUT_PROPERTY_H 18 19 #include <string> 20 21 #include "core/components/common/properties/color.h" 22 #include "core/components/declaration/button/button_declaration.h" 23 #include "core/components_ng/base/inspector_filter.h" 24 #include "core/components_ng/layout/layout_property.h" 25 #include "core/image/image_source_info.h" 26 #include "core/pipeline_ng/pipeline_context.h" 27 28 namespace OHOS::Ace::NG { 29 30 struct ControlButtonStyle { 31 ACE_DEFINE_PROPERTY_GROUP_ITEM(ControlButtonWidth, Dimension); 32 ACE_DEFINE_PROPERTY_GROUP_ITEM(ControlButtonHeight, Dimension); 33 ACE_DEFINE_PROPERTY_GROUP_ITEM(ControlButtonLeft, Dimension); 34 ACE_DEFINE_PROPERTY_GROUP_ITEM(ControlButtonTop, Dimension); 35 ACE_DEFINE_PROPERTY_GROUP_ITEM(ControlButtonShowIconInfo, ImageSourceInfo); 36 ACE_DEFINE_PROPERTY_GROUP_ITEM(ControlButtonHiddenIconInfo, ImageSourceInfo); 37 ACE_DEFINE_PROPERTY_GROUP_ITEM(ControlButtonSwitchingIconInfo, ImageSourceInfo); 38 }; 39 40 struct DividerStyle { 41 ACE_DEFINE_PROPERTY_GROUP_ITEM(DividerStrokeWidth, Dimension); 42 ACE_DEFINE_PROPERTY_GROUP_ITEM(DividerStartMargin, Dimension); 43 ACE_DEFINE_PROPERTY_GROUP_ITEM(DividerEndMargin, Dimension); 44 ACE_DEFINE_PROPERTY_GROUP_ITEM(DividerColor, Color); 45 }; 46 47 class ACE_EXPORT SideBarContainerLayoutProperty : public LayoutProperty { 48 DECLARE_ACE_TYPE(SideBarContainerLayoutProperty, LayoutProperty); 49 50 public: 51 SideBarContainerLayoutProperty() = default; 52 ~SideBarContainerLayoutProperty() override = default; 53 Clone()54 RefPtr<LayoutProperty> Clone() const override 55 { 56 auto value = MakeRefPtr<SideBarContainerLayoutProperty>(); 57 value->LayoutProperty::UpdateLayoutProperty(AceType::DynamicCast<LayoutProperty>(this)); 58 value->propSideBarContainerType_ = CloneSideBarContainerType(); 59 value->propShowSideBar_ = CloneShowSideBar(); 60 value->propShowControlButton_ = CloneShowControlButton(); 61 value->propSideBarWidth_ = CloneSideBarWidth(); 62 value->propMinSideBarWidth_ = CloneMinSideBarWidth(); 63 value->propMaxSideBarWidth_ = CloneMaxSideBarWidth(); 64 value->propAutoHide_ = CloneAutoHide(); 65 value->propSideBarPosition_ = CloneSideBarPosition(); 66 value->propControlButtonStyle_ = CloneControlButtonStyle(); 67 value->propDividerStyle_ = CloneDividerStyle(); 68 value->propMinContentWidth_ = CloneMinContentWidth(); 69 return value; 70 } 71 Reset()72 void Reset() override 73 { 74 LayoutProperty::Reset(); 75 ResetSideBarContainerType(); 76 ResetShowSideBar(); 77 ResetShowControlButton(); 78 ResetSideBarWidth(); 79 ResetMinSideBarWidth(); 80 ResetMaxSideBarWidth(); 81 ResetAutoHide(); 82 ResetSideBarPosition(); 83 ResetControlButtonStyle(); 84 ResetDividerStyle(); 85 ResetMinContentWidth(); 86 } 87 ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)88 void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override 89 { 90 LayoutProperty::ToJsonValue(json, filter); 91 /* no fixed attr below, just return */ 92 if (filter.IsFastFilter()) { 93 return; 94 } 95 constexpr Dimension DEFAULT_CONTROL_BUTTON_WIDTH = 32.0_vp; 96 constexpr Dimension DEFAULT_CONTROL_BUTTON_HEIGHT = 32.0_vp; 97 constexpr Dimension DEFAULT_CONTROL_BUTTON_LEFT = 16.0_vp; 98 constexpr Dimension DEFAULT_CONTROL_BUTTON_TOP = 48.0_vp; 99 constexpr Dimension DEFAULT_MAX_SIDE_BAR_WIDTH = 280.0_vp; 100 constexpr Dimension DEFAULT_DIVIDER_STROKE_WIDTH = 1.0_vp; 101 constexpr Dimension DEFAULT_DIVIDER_START_MARGIN = 0.0_vp; 102 constexpr Dimension DEFAULT_DIVIDER_END_MARGIN = 0.0_vp; 103 constexpr Color DEFAULT_DIVIDER_COLOR = Color(0x08000000); 104 105 static Dimension DEFAULT_SIDE_BAR_WIDTH = 200.0_vp; 106 static Dimension DEFAULT_MIN_SIDE_BAR_WIDTH = 200.0_vp; 107 static Dimension DEFAULT_MIN_CONTENT_WIDTH = 0.0_vp; 108 constexpr static int32_t PLATFORM_VERSION_TEN = 10; 109 auto pipeline = PipelineContext::GetCurrentContext(); 110 CHECK_NULL_VOID(pipeline); 111 if (pipeline->GetMinPlatformVersion() >= PLATFORM_VERSION_TEN) { 112 DEFAULT_SIDE_BAR_WIDTH = 240.0_vp; 113 DEFAULT_MIN_SIDE_BAR_WIDTH = 240.0_vp; 114 DEFAULT_MIN_CONTENT_WIDTH = 360.0_vp; 115 } 116 117 auto type = propSideBarContainerType_.value_or(SideBarContainerType::EMBED); 118 auto sideBarWidth = propSideBarWidth_.value_or(DEFAULT_SIDE_BAR_WIDTH); 119 auto minSideBarWidth = propMinSideBarWidth_.value_or(DEFAULT_MIN_SIDE_BAR_WIDTH); 120 auto maxSideBarWidth = propMaxSideBarWidth_.value_or(DEFAULT_MAX_SIDE_BAR_WIDTH); 121 auto sideBarPosition = propSideBarPosition_.value_or(SideBarPosition::START); 122 auto minContentWidth = propMinContentWidth_.value_or(DEFAULT_MIN_CONTENT_WIDTH); 123 json->PutExtAttr("type", type == SideBarContainerType::EMBED ? 124 "SideBarContainerType.Embed" : "SideBarContainerType.OVERLAY", filter); 125 json->PutExtAttr("showSideBar", propShowSideBar_.value_or(true) ? "true" : "false", filter); 126 json->PutExtAttr("showControlButton", propShowControlButton_.value_or(true) ? "true" : "false", filter); 127 json->PutExtAttr("sideBarWidth", std::to_string(sideBarWidth.Value()).c_str(), filter); 128 json->PutExtAttr("minSideBarWidth", std::to_string(minSideBarWidth.Value()).c_str(), filter); 129 json->PutExtAttr("maxSideBarWidth", std::to_string(maxSideBarWidth.Value()).c_str(), filter); 130 json->PutExtAttr("autoHide", propAutoHide_.value_or(true) ? "true" : "false", filter); 131 json->PutExtAttr("sideBarPosition", 132 sideBarPosition == SideBarPosition::START ? "SideBarPosition.Start" : "SideBarPosition.End", filter); 133 json->PutExtAttr("minContentWidth", std::to_string(minContentWidth.Value()).c_str(), filter); 134 135 // divider 136 Dimension strokeWidth = DEFAULT_DIVIDER_STROKE_WIDTH; 137 Dimension startMargin = DEFAULT_DIVIDER_START_MARGIN; 138 Dimension endMargin = DEFAULT_DIVIDER_END_MARGIN; 139 Color color = DEFAULT_DIVIDER_COLOR; 140 141 if (propDividerStyle_) { 142 strokeWidth = propDividerStyle_->propDividerStrokeWidth.value_or(DEFAULT_DIVIDER_STROKE_WIDTH); 143 startMargin = propDividerStyle_->propDividerStartMargin.value_or(DEFAULT_DIVIDER_START_MARGIN); 144 endMargin = propDividerStyle_->propDividerEndMargin.value_or(DEFAULT_DIVIDER_END_MARGIN); 145 color = propDividerStyle_->propDividerColor.value_or(DEFAULT_DIVIDER_COLOR); 146 } 147 auto jsonDivider = JsonUtil::Create(true); 148 CHECK_NULL_VOID(jsonDivider); 149 jsonDivider->Put("strokeWidth", strokeWidth.ToString().c_str()); 150 jsonDivider->Put("startMargin", startMargin.ToString().c_str()); 151 jsonDivider->Put("endMargin", endMargin.ToString().c_str()); 152 jsonDivider->Put("color", color.ColorToString().c_str()); 153 json->PutExtAttr("divider", jsonDivider->ToString().c_str(), filter); 154 155 CHECK_NULL_VOID(propControlButtonStyle_); 156 auto left = propControlButtonStyle_->propControlButtonLeft.value_or(DEFAULT_CONTROL_BUTTON_LEFT); 157 auto top = propControlButtonStyle_->propControlButtonTop.value_or(DEFAULT_CONTROL_BUTTON_TOP); 158 auto width = propControlButtonStyle_->propControlButtonWidth.value_or(DEFAULT_CONTROL_BUTTON_WIDTH); 159 auto height = propControlButtonStyle_->propControlButtonHeight.value_or(DEFAULT_CONTROL_BUTTON_HEIGHT); 160 161 auto jsonControl = JsonUtil::Create(true); 162 CHECK_NULL_VOID(jsonControl); 163 jsonControl->Put("left", std::to_string(left.Value()).c_str()); 164 jsonControl->Put("top", std::to_string(top.Value()).c_str()); 165 jsonControl->Put("width", std::to_string(width.Value()).c_str()); 166 jsonControl->Put("height", std::to_string(height.Value()).c_str()); 167 168 auto jsonIcon = JsonUtil::Create(true); 169 CHECK_NULL_VOID(jsonIcon); 170 jsonIcon->Put("shown", propControlButtonStyle_->propControlButtonShowIconInfo->GetSrc().c_str()); 171 jsonIcon->Put("hidden", propControlButtonStyle_->propControlButtonHiddenIconInfo->GetSrc().c_str()); 172 jsonIcon->Put("switching", propControlButtonStyle_->propControlButtonSwitchingIconInfo->GetSrc().c_str()); 173 174 jsonControl->Put("icon", jsonIcon); 175 json->PutExtAttr("controlButton", jsonControl->ToString().c_str(), filter); 176 } 177 178 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SideBarContainerType, SideBarContainerType, PROPERTY_UPDATE_MEASURE); 179 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowSideBar, bool, PROPERTY_UPDATE_MEASURE); 180 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowControlButton, bool, PROPERTY_UPDATE_NORMAL); 181 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SideBarWidth, Dimension, PROPERTY_UPDATE_MEASURE); 182 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(MinSideBarWidth, Dimension, PROPERTY_UPDATE_MEASURE); 183 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(MaxSideBarWidth, Dimension, PROPERTY_UPDATE_MEASURE); 184 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(AutoHide, bool, PROPERTY_UPDATE_MEASURE); 185 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SideBarPosition, SideBarPosition, PROPERTY_UPDATE_MEASURE); 186 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(MinContentWidth, Dimension, PROPERTY_UPDATE_MEASURE); 187 188 ACE_DEFINE_PROPERTY_GROUP(ControlButtonStyle, ControlButtonStyle); 189 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(ControlButtonStyle, ControlButtonWidth, Dimension, PROPERTY_UPDATE_MEASURE); 190 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(ControlButtonStyle, ControlButtonHeight, Dimension, PROPERTY_UPDATE_MEASURE); 191 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(ControlButtonStyle, ControlButtonLeft, Dimension, PROPERTY_UPDATE_MEASURE); 192 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(ControlButtonStyle, ControlButtonTop, Dimension, PROPERTY_UPDATE_MEASURE); 193 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( 194 ControlButtonStyle, ControlButtonShowIconInfo, ImageSourceInfo, PROPERTY_UPDATE_MEASURE); 195 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( 196 ControlButtonStyle, ControlButtonHiddenIconInfo, ImageSourceInfo, PROPERTY_UPDATE_MEASURE); 197 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( 198 ControlButtonStyle, ControlButtonSwitchingIconInfo, ImageSourceInfo, PROPERTY_UPDATE_MEASURE); 199 200 ACE_DEFINE_PROPERTY_GROUP(DividerStyle, DividerStyle); 201 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(DividerStyle, DividerStrokeWidth, Dimension, PROPERTY_UPDATE_MEASURE); 202 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(DividerStyle, DividerStartMargin, Dimension, PROPERTY_UPDATE_MEASURE); 203 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(DividerStyle, DividerEndMargin, Dimension, PROPERTY_UPDATE_MEASURE); 204 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(DividerStyle, DividerColor, Color, PROPERTY_UPDATE_MEASURE); 205 206 private: 207 ACE_DISALLOW_COPY_AND_MOVE(SideBarContainerLayoutProperty); 208 }; 209 210 } // namespace OHOS::Ace::NG 211 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SIDE_BAR_SIDE_BAR_CONTAINER_LAYOUT_PROPERTY_H 212