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 #include "core/interfaces/native/node/data_panel_modifier.h"
16 
17 #include "core/components/common/layout/constants.h"
18 #include "core/components_ng/base/frame_node.h"
19 #include "core/components_ng/pattern/data_panel/data_panel_model_ng.h"
20 #include "core/pipeline/base/element_register.h"
21 #include "core/common/container.h"
22 
23 namespace OHOS::Ace::NG {
24 namespace {
25 constexpr bool IS_CLOSE_EFFECT = true;
26 constexpr double DEFAULT_STROKE_WIDTH = 24.0;
27 constexpr double DEFAULT_RADIUS = 20.0;
28 constexpr double DEFAULT_OFFSET_X = 5.0;
29 constexpr double DEFAULT_OFFSET_Y = 5.0;
30 const std::string DEFAULT_TRACK_BACKGROUND = "#08182431";
31 }
SetCloseEffect(ArkUINodeHandle node,ArkUI_Bool value)32 void SetCloseEffect(ArkUINodeHandle node, ArkUI_Bool value)
33 {
34     auto* frameNode = reinterpret_cast<FrameNode*>(node);
35     CHECK_NULL_VOID(frameNode);
36     DataPanelModelNG::SetCloseEffect(frameNode, value);
37 }
38 
ResetCloseEffect(ArkUINodeHandle node)39 void ResetCloseEffect(ArkUINodeHandle node)
40 {
41     auto* frameNode = reinterpret_cast<FrameNode*>(node);
42     CHECK_NULL_VOID(frameNode);
43     DataPanelModelNG::SetCloseEffect(frameNode, IS_CLOSE_EFFECT);
44 }
45 
SetDataPanelTrackBackgroundColor(ArkUINodeHandle node,uint32_t value)46 void SetDataPanelTrackBackgroundColor(ArkUINodeHandle node, uint32_t value)
47 {
48     auto* frameNode = reinterpret_cast<FrameNode*>(node);
49     CHECK_NULL_VOID(frameNode);
50     DataPanelModelNG::SetTrackBackground(frameNode, Color(value));
51 }
52 
ResetDataPanelTrackBackgroundColor(ArkUINodeHandle node)53 void ResetDataPanelTrackBackgroundColor(ArkUINodeHandle node)
54 {
55     auto* frameNode = reinterpret_cast<FrameNode*>(node);
56     CHECK_NULL_VOID(frameNode);
57     DataPanelModelNG::SetTrackBackground(frameNode, Color::FromString(DEFAULT_TRACK_BACKGROUND));
58 }
59 
SetDataPanelStrokeWidth(ArkUINodeHandle node,ArkUI_Float32 value,int32_t unit)60 void SetDataPanelStrokeWidth(ArkUINodeHandle node, ArkUI_Float32 value, int32_t unit)
61 {
62     auto* frameNode = reinterpret_cast<FrameNode*>(node);
63     CHECK_NULL_VOID(frameNode);
64     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
65     DataPanelModelNG::SetStrokeWidth(frameNode, Dimension(value, unitEnum));
66 }
67 
ResetDataPanelStrokeWidth(ArkUINodeHandle node)68 void ResetDataPanelStrokeWidth(ArkUINodeHandle node)
69 {
70     auto* frameNode = reinterpret_cast<FrameNode*>(node);
71     CHECK_NULL_VOID(frameNode);
72     DataPanelModelNG::SetStrokeWidth(frameNode, Dimension(DEFAULT_STROKE_WIDTH, DimensionUnit::VP));
73 }
74 
ConvertThemeColor(std::vector<OHOS::Ace::NG::Gradient> & colors)75 void ConvertThemeColor(std::vector<OHOS::Ace::NG::Gradient>& colors)
76 {
77     auto container = Container::Current();
78     CHECK_NULL_VOID(container);
79     auto pipelineContext = container->GetPipelineContext();
80     CHECK_NULL_VOID(pipelineContext);
81     auto themeManager = pipelineContext->GetThemeManager();
82     CHECK_NULL_VOID(themeManager);
83     RefPtr<DataPanelTheme> theme = themeManager->GetTheme<DataPanelTheme>();
84     auto themeColors = theme->GetColorsArray();
85     for (const auto& item : themeColors) {
86         OHOS::Ace::NG::Gradient gradient;
87         OHOS::Ace::NG::GradientColor gradientColorStart;
88         gradientColorStart.SetLinearColor(LinearColor(item.first));
89         gradientColorStart.SetDimension(Dimension(0.0));
90         gradient.AddColor(gradientColorStart);
91         OHOS::Ace::NG::GradientColor gradientColorEnd;
92         gradientColorEnd.SetLinearColor(LinearColor(item.second));
93         gradientColorEnd.SetDimension(Dimension(1.0));
94         gradient.AddColor(gradientColorEnd);
95         colors.emplace_back(gradient);
96     }
97 }
98 
SetValueColors(ArkUINodeHandle node,const struct ArkUIGradientType * gradient)99 void SetValueColors(ArkUINodeHandle node, const struct ArkUIGradientType* gradient)
100 {
101     auto* frameNode = reinterpret_cast<FrameNode*>(node);
102     CHECK_NULL_VOID(frameNode);
103     std::vector<OHOS::Ace::NG::Gradient> shadowColors(gradient->length);
104     uint32_t pos = 0;
105     for (uint32_t i = 0; i < gradient->length; i++) {
106         if (gradient->gradientLength[i] == 0) {
107             shadowColors.clear();
108             ConvertThemeColor(shadowColors);
109             break;
110         }
111         OHOS::Ace::NG::Gradient tempGradient;
112         for (uint32_t j = 0; j < gradient->gradientLength[i]; j++, pos++) {
113             OHOS::Ace::NG::GradientColor gradientColor;
114             gradientColor.SetLinearColor(LinearColor(Color(gradient->color[pos])));
115             gradientColor.SetDimension(
116                 Dimension(gradient->offset[pos].number, static_cast<DimensionUnit>(gradient->offset[pos].unit)));
117             tempGradient.AddColor(gradientColor);
118         }
119         shadowColors.at(i) = tempGradient;
120     }
121     DataPanelModelNG::SetValueColors(frameNode, shadowColors);
122 }
123 
ResetValueColors(ArkUINodeHandle node)124 void ResetValueColors(ArkUINodeHandle node)
125 {
126     auto* frameNode = reinterpret_cast<FrameNode*>(node);
127     CHECK_NULL_VOID(frameNode);
128     std::vector<OHOS::Ace::NG::Gradient> colors;
129     ConvertThemeColor(colors);
130     DataPanelModelNG::SetValueColors(frameNode, colors);
131 }
132 
SetTrackShadow(ArkUINodeHandle node,const struct ArkUIGradientType * gradient,ArkUI_Float32 radius,ArkUI_Float32 offsetX,ArkUI_Float32 offsetY)133 void SetTrackShadow(ArkUINodeHandle node, const struct ArkUIGradientType* gradient, ArkUI_Float32 radius,
134     ArkUI_Float32 offsetX, ArkUI_Float32 offsetY)
135 {
136     auto* frameNode = reinterpret_cast<FrameNode*>(node);
137     CHECK_NULL_VOID(frameNode);
138     OHOS::Ace::NG::DataPanelShadow shadow;
139 
140     std::vector<OHOS::Ace::NG::Gradient> shadowColors(gradient->length);
141     uint32_t pos = 0;
142     for (uint32_t i = 0; i < gradient->length; i++) {
143         if (gradient->gradientLength[i] == 0) {
144             shadowColors.clear();
145             ConvertThemeColor(shadowColors);
146             break;
147         }
148         OHOS::Ace::NG::Gradient tempGradient;
149         for (uint32_t j = 0; j < gradient->gradientLength[i]; j++, pos++) {
150             OHOS::Ace::NG::GradientColor gradientColor;
151             gradientColor.SetLinearColor(LinearColor(Color(gradient->color[pos])));
152             gradientColor.SetDimension(
153                 Dimension(gradient->offset[pos].number, static_cast<DimensionUnit>(gradient->offset[pos].unit)));
154             tempGradient.AddColor(gradientColor);
155         }
156         shadowColors.at(i) = tempGradient;
157     }
158 
159     shadow.radius = radius;
160     shadow.offsetX = offsetX;
161     shadow.offsetY = offsetY;
162     shadow.colors = shadowColors;
163     DataPanelModelNG::SetShadowOption(frameNode, shadow);
164 }
165 
SetNullTrackShadow(ArkUINodeHandle node)166 void SetNullTrackShadow(ArkUINodeHandle node)
167 {
168     auto* frameNode = reinterpret_cast<FrameNode*>(node);
169     CHECK_NULL_VOID(frameNode);
170     DataPanelShadow shadow;
171     shadow.isShadowVisible = false;
172     DataPanelModelNG::SetShadowOption(frameNode, shadow);
173 }
174 
ResetTrackShadow(ArkUINodeHandle node)175 void ResetTrackShadow(ArkUINodeHandle node)
176 {
177     auto* frameNode = reinterpret_cast<FrameNode*>(node);
178     CHECK_NULL_VOID(frameNode);
179     DataPanelShadow shadow;
180     shadow.isShadowVisible = true;
181     shadow.radius = DEFAULT_RADIUS;
182     shadow.offsetX = DEFAULT_OFFSET_X;
183     shadow.offsetY = DEFAULT_OFFSET_Y;
184     std::vector<OHOS::Ace::NG::Gradient> colors;
185     ConvertThemeColor(colors);
186     shadow.colors = colors;
187     DataPanelModelNG::SetShadowOption(frameNode, shadow);
188 }
189 
190 namespace NodeModifier {
GetDataPanelModifier()191 const ArkUIDataPanelModifier* GetDataPanelModifier()
192 {
193     static const ArkUIDataPanelModifier modifier = { SetCloseEffect, ResetCloseEffect,
194         SetDataPanelTrackBackgroundColor, ResetDataPanelTrackBackgroundColor, SetDataPanelStrokeWidth,
195         ResetDataPanelStrokeWidth, SetValueColors, ResetValueColors, SetTrackShadow, SetNullTrackShadow,
196         ResetTrackShadow };
197 
198     return &modifier;
199 }
200 
GetCJUIDataPanelModifier()201 const CJUIDataPanelModifier* GetCJUIDataPanelModifier()
202 {
203     static const CJUIDataPanelModifier modifier = { SetCloseEffect, ResetCloseEffect,
204         SetDataPanelTrackBackgroundColor, ResetDataPanelTrackBackgroundColor, SetDataPanelStrokeWidth,
205         ResetDataPanelStrokeWidth, SetValueColors, ResetValueColors, SetTrackShadow, SetNullTrackShadow,
206         ResetTrackShadow };
207 
208     return &modifier;
209 }
210 }
211 } // namespace OHOS::Ace::NG