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