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