1 /*
2  * Copyright (c) 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 #include "core/components_ng/pattern/scrollable/scrollable_paint_property.h"
17 
18 #include "core/components/scroll/scroll_bar_theme.h"
19 #include "core/components_ng/base/inspector_filter.h"
20 #include "core/pipeline_ng/pipeline_context.h"
21 
22 namespace OHOS::Ace::NG {
ContentClipToStr() const23 std::string ScrollablePaintProperty::ContentClipToStr() const
24 {
25     auto mode = propContentClip_ ? propContentClip_->first : ContentClipMode::DEFAULT;
26     if (mode == ContentClipMode::DEFAULT) {
27         mode = GetDefaultContentClip();
28     }
29     switch (mode) {
30         case ContentClipMode::CONTENT_ONLY:
31             return "ContentClipMode.CONTENT_ONLY";
32         case ContentClipMode::BOUNDARY:
33             return "ContentClipMode.BOUNDARY";
34         case ContentClipMode::CUSTOM:
35             return "RectShape";
36         case ContentClipMode::SAFE_AREA:
37             return "ContentClipMode.SAFE_AREA";
38         default:
39             return "";
40     }
41 }
42 
ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter) const43 void ScrollablePaintProperty::ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const
44 {
45     PaintProperty::ToJsonValue(json, filter);
46     /* no fixed attr below, just return */
47     if (filter.IsFastFilter()) {
48         return;
49     }
50     json->PutExtAttr("scrollBar", GetBarStateString().c_str(), filter);
51     json->PutExtAttr("scrollBarColor", GetBarColor().ColorToString().c_str(), filter);
52     json->PutExtAttr("scrollBarWidth", GetBarWidth().ToString().c_str(), filter);
53     json->PutExtAttr("fadingEdge",
54         propFadingEdgeProperty_ ? propFadingEdgeProperty_->propFadingEdge.value_or(false) : false, filter);
55     auto fadingEdgeOption = JsonUtil::Create(true);
56     fadingEdgeOption->Put("fadingEdgeLength",
57         propFadingEdgeProperty_
58             ? propFadingEdgeProperty_->propFadingEdgeLength
59                   .value_or(Dimension(32.0, DimensionUnit::VP)) // 32.0: default fading edge length
60                   .ToString()
61                   .c_str()
62             : Dimension(32.0, DimensionUnit::VP).ToString().c_str()); // 32.0: default fading edge length
63     json->PutExtAttr("fadingEdgeOption", fadingEdgeOption, filter);
64     json->PutExtAttr("clipContent", ContentClipToStr().c_str(), filter);
65 }
66 
GetBarColor() const67 Color ScrollablePaintProperty::GetBarColor() const
68 {
69     auto context = PipelineContext::GetCurrentContext();
70     CHECK_NULL_RETURN(context, Color::TRANSPARENT);
71     auto themeManager = context->GetThemeManager();
72     CHECK_NULL_RETURN(themeManager, Color::TRANSPARENT);
73     auto scrollBarTheme = themeManager->GetTheme<ScrollBarTheme>();
74     CHECK_NULL_RETURN(scrollBarTheme, Color::TRANSPARENT);
75     auto defaultScrollBarColor = scrollBarTheme->GetForegroundColor();
76     return propScrollBarProperty_ ? propScrollBarProperty_->propScrollBarColor.value_or(defaultScrollBarColor)
77                                   : defaultScrollBarColor;
78 }
79 
GetBarWidth() const80 Dimension ScrollablePaintProperty::GetBarWidth() const
81 {
82     auto context = PipelineContext::GetCurrentContext();
83     CHECK_NULL_RETURN(context, Dimension());
84     auto themeManager = context->GetThemeManager();
85     CHECK_NULL_RETURN(themeManager, Dimension());
86     auto scrollBarTheme = themeManager->GetTheme<ScrollBarTheme>();
87     CHECK_NULL_RETURN(scrollBarTheme, Dimension());
88     auto defaultScrollBarWidth = scrollBarTheme->GetNormalWidth();
89     return propScrollBarProperty_ ? propScrollBarProperty_->propScrollBarWidth.value_or(defaultScrollBarWidth)
90                                   : defaultScrollBarWidth;
91 }
92 
GetBarStateString() const93 std::string ScrollablePaintProperty::GetBarStateString() const
94 {
95     auto mode = propScrollBarProperty_ ? propScrollBarProperty_->propScrollBarMode.value_or(DisplayMode::AUTO)
96                                        : DisplayMode::AUTO;
97     switch (mode) {
98         case DisplayMode::AUTO:
99             return "BarState.Auto";
100         case DisplayMode::ON:
101             return "BarState.On";
102         case DisplayMode::OFF:
103             return "BarState.Off";
104         default:
105             break;
106     }
107     return "BarState.Off";
108 }
109 
CloneProps(const ScrollablePaintProperty * src)110 void ScrollablePaintProperty::CloneProps(const ScrollablePaintProperty* src)
111 {
112     UpdatePaintProperty(src);
113     propScrollBarProperty_ = src->CloneScrollBarProperty();
114     propFadingEdgeProperty_ = src->CloneFadingEdgeProperty();
115     propContentClip_ = src->CloneContentClip();
116 }
117 
Clone() const118 RefPtr<PaintProperty> ScrollablePaintProperty::Clone() const
119 {
120     auto paintProperty = MakeRefPtr<ScrollablePaintProperty>();
121     paintProperty->CloneProps(this);
122     return paintProperty;
123 }
124 
Clone() const125 RefPtr<PaintProperty> GridPaintProperty::Clone() const
126 {
127     auto paintProperty = MakeRefPtr<GridPaintProperty>();
128     paintProperty->CloneProps(this);
129     return paintProperty;
130 }
131 
Clone() const132 RefPtr<PaintProperty> ScrollPaintProperty::Clone() const
133 {
134     auto paintProperty = MakeRefPtr<GridPaintProperty>();
135     paintProperty->CloneProps(this);
136     return paintProperty;
137 }
138 } // namespace OHOS::Ace::NG
139