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/checkboxgroup_modifier.h"
16
17 #include "core/components_ng/base/view_abstract.h"
18 #include "core/pipeline_ng/pipeline_context.h"
19
20 namespace OHOS::Ace::NG {
21 static uint32_t ERROR_UINT_CODE = -1;
22 static const float ERROR_FLOAT_CODE = -1.0f;
23 static const int32_t ERROR_INT_CODE = -1;
24 static std::string groupNameValue;
25 const DimensionUnit DEFAULT_UNIT = DimensionUnit::VP;
SetCheckboxGroupSelectedColor(ArkUINodeHandle node,uint32_t color)26 void SetCheckboxGroupSelectedColor(ArkUINodeHandle node, uint32_t color)
27 {
28 auto* frameNode = reinterpret_cast<FrameNode*>(node);
29 CHECK_NULL_VOID(frameNode);
30 CheckBoxGroupModelNG::SetSelectedColor(frameNode, Color(color));
31 }
32
ResetCheckboxGroupSelectedColor(ArkUINodeHandle node)33 void ResetCheckboxGroupSelectedColor(ArkUINodeHandle node)
34 {
35 auto* frameNode = reinterpret_cast<FrameNode*>(node);
36 CHECK_NULL_VOID(frameNode);
37 auto context = frameNode->GetContext();
38 CHECK_NULL_VOID(context);
39 auto themeManager = context->GetThemeManager();
40 CHECK_NULL_VOID(themeManager);
41 auto checkBoxTheme = themeManager->GetTheme<CheckboxTheme>();
42 CheckBoxGroupModelNG::SetSelectedColor(frameNode, checkBoxTheme->GetActiveColor());
43 }
44
SetCheckboxGroupUnSelectedColor(ArkUINodeHandle node,uint32_t color)45 void SetCheckboxGroupUnSelectedColor(ArkUINodeHandle node, uint32_t color)
46 {
47 auto* frameNode = reinterpret_cast<FrameNode*>(node);
48 CHECK_NULL_VOID(frameNode);
49 CheckBoxGroupModelNG::SetUnSelectedColor(frameNode, Color(color));
50 }
51
ResetCheckboxGroupUnSelectedColor(ArkUINodeHandle node)52 void ResetCheckboxGroupUnSelectedColor(ArkUINodeHandle node)
53 {
54 auto* frameNode = reinterpret_cast<FrameNode*>(node);
55 CHECK_NULL_VOID(frameNode);
56 auto context = frameNode->GetContext();
57 CHECK_NULL_VOID(context);
58 auto themeManager = context->GetThemeManager();
59 CHECK_NULL_VOID(themeManager);
60 auto checkBoxTheme = themeManager->GetTheme<CheckboxTheme>();
61 CheckBoxGroupModelNG::SetUnSelectedColor(frameNode, checkBoxTheme->GetInactiveColor());
62 }
63
SetCheckboxGroupSelectAll(ArkUINodeHandle node,ArkUI_Bool isSelected)64 void SetCheckboxGroupSelectAll(ArkUINodeHandle node, ArkUI_Bool isSelected)
65 {
66 auto* frameNode = reinterpret_cast<FrameNode*>(node);
67 CHECK_NULL_VOID(frameNode);
68 CheckBoxGroupModelNG::SetSelectAll(frameNode, isSelected);
69 }
70
ResetCheckboxGroupSelectAll(ArkUINodeHandle node)71 void ResetCheckboxGroupSelectAll(ArkUINodeHandle node)
72 {
73 auto* frameNode = reinterpret_cast<FrameNode*>(node);
74 CHECK_NULL_VOID(frameNode);
75 CheckBoxGroupModelNG::SetSelectAll(frameNode, false);
76 }
77
SetCheckboxGroupWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)78 void SetCheckboxGroupWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
79 {
80 auto *frameNode = reinterpret_cast<FrameNode *>(node);
81 CHECK_NULL_VOID(frameNode);
82 auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
83 if (unitEnum == DimensionUnit::CALC) {
84 ViewAbstract::SetWidth(
85 frameNode, CalcLength(CalcLength(std::string(calcValue))));
86 } else {
87 ViewAbstract::SetWidth(frameNode, CalcLength(value, unitEnum));
88 }
89 }
90
ResetCheckboxGroupWidth(ArkUINodeHandle node)91 void ResetCheckboxGroupWidth(ArkUINodeHandle node)
92 {
93 auto* frameNode = reinterpret_cast<FrameNode*>(node);
94 CHECK_NULL_VOID(frameNode);
95 ViewAbstract::ClearWidthOrHeight(frameNode, true);
96 }
97
SetCheckboxGroupHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)98 void SetCheckboxGroupHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
99 {
100 auto *frameNode = reinterpret_cast<FrameNode *>(node);
101 CHECK_NULL_VOID(frameNode);
102 auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
103 if (unitEnum == DimensionUnit::CALC) {
104 ViewAbstract::SetHeight(
105 frameNode, CalcLength(CalcLength(std::string(calcValue))));
106 } else {
107 ViewAbstract::SetHeight(frameNode, CalcLength(value, unitEnum));
108 }
109 }
110
ResetCheckboxGroupHeight(ArkUINodeHandle node)111 void ResetCheckboxGroupHeight(ArkUINodeHandle node)
112 {
113 auto* frameNode = reinterpret_cast<FrameNode*>(node);
114 CHECK_NULL_VOID(frameNode);
115 ViewAbstract::ClearWidthOrHeight(frameNode, false);
116 }
117
SetCheckboxGroupMark(ArkUINodeHandle node,uint32_t color,ArkUI_Float32 sizeValue,ArkUI_Float32 widthValue)118 void SetCheckboxGroupMark(ArkUINodeHandle node, uint32_t color, ArkUI_Float32 sizeValue, ArkUI_Float32 widthValue)
119 {
120 auto* frameNode = reinterpret_cast<FrameNode*>(node);
121 CHECK_NULL_VOID(frameNode);
122 CheckBoxGroupModelNG::SetCheckMarkColor(frameNode, Color(color));
123
124 Dimension size = Dimension(sizeValue, DEFAULT_UNIT);
125 CheckBoxGroupModelNG::SetCheckMarkSize(frameNode, size);
126
127 Dimension width = Dimension(widthValue, DEFAULT_UNIT);
128 CheckBoxGroupModelNG::SetCheckMarkWidth(frameNode, width);
129 }
130
ResetCheckboxGroupMark(ArkUINodeHandle node)131 void ResetCheckboxGroupMark(ArkUINodeHandle node)
132 {
133 auto* frameNode = reinterpret_cast<FrameNode*>(node);
134 CHECK_NULL_VOID(frameNode);
135 auto context = frameNode->GetContext();
136 CHECK_NULL_VOID(context);
137 auto themeManager = context->GetThemeManager();
138 CHECK_NULL_VOID(themeManager);
139 auto checkBoxTheme = themeManager->GetTheme<CheckboxTheme>();
140
141 CheckBoxGroupModelNG::SetCheckMarkColor(frameNode, checkBoxTheme->GetPointColor());
142
143 Dimension size = Dimension(-1.0f);
144 CheckBoxGroupModelNG::SetCheckMarkSize(frameNode, size);
145
146 CheckBoxGroupModelNG::SetCheckMarkWidth(frameNode, checkBoxTheme->GetCheckStroke());
147 }
148
SetCheckboxGroupStyle(ArkUINodeHandle node,ArkUI_Int32 style)149 void SetCheckboxGroupStyle(ArkUINodeHandle node, ArkUI_Int32 style)
150 {
151 auto* frameNode = reinterpret_cast<FrameNode*>(node);
152 CHECK_NULL_VOID(frameNode);
153 CheckBoxGroupModelNG::SetCheckboxGroupStyle(frameNode, static_cast<CheckBoxStyle>(style));
154 }
155
ResetCheckboxGroupStyle(ArkUINodeHandle node)156 void ResetCheckboxGroupStyle(ArkUINodeHandle node)
157 {
158 auto* frameNode = reinterpret_cast<FrameNode*>(node);
159 CHECK_NULL_VOID(frameNode);
160 CheckBoxGroupModelNG::SetCheckboxGroupStyle(frameNode, CheckBoxStyle::CIRCULAR_STYLE);
161 }
162
SetCheckboxGroupName(ArkUINodeHandle node,ArkUI_CharPtr group)163 void SetCheckboxGroupName(ArkUINodeHandle node, ArkUI_CharPtr group)
164 {
165 CHECK_NULL_VOID(group);
166 auto* frameNode = reinterpret_cast<FrameNode*>(node);
167 CHECK_NULL_VOID(frameNode);
168 CheckBoxGroupModelNG::SetCheckboxGroupName(frameNode, std::string(group));
169 }
170
SetCheckboxGroupOnChange(ArkUINodeHandle node,void * callback)171 void SetCheckboxGroupOnChange(ArkUINodeHandle node, void* callback)
172 {
173 auto* frameNode = reinterpret_cast<FrameNode*>(node);
174 CHECK_NULL_VOID(frameNode);
175 if (callback) {
176 auto onChange = reinterpret_cast<std::function<void (const BaseEventInfo*)>*>(callback);
177 CheckBoxGroupModelNG::SetOnChange(frameNode, std::move(*onChange));
178 } else {
179 CheckBoxGroupModelNG::SetOnChange(frameNode, nullptr);
180 }
181 }
182
ResetCheckboxGroupOnChange(ArkUINodeHandle node)183 void ResetCheckboxGroupOnChange(ArkUINodeHandle node)
184 {
185 auto* frameNode = reinterpret_cast<FrameNode*>(node);
186 CHECK_NULL_VOID(frameNode);
187 CheckBoxGroupModelNG::SetOnChange(frameNode, nullptr);
188 }
189
GetCheckboxGroupName(ArkUINodeHandle node)190 ArkUI_CharPtr GetCheckboxGroupName(ArkUINodeHandle node)
191 {
192 auto *frameNode = reinterpret_cast<FrameNode *>(node);
193 CHECK_NULL_RETURN(frameNode, "");
194 groupNameValue = CheckBoxGroupModelNG::GetCheckboxGroupName(frameNode);
195 return groupNameValue.c_str();
196 }
197
GetCheckboxGroupSelectAll(ArkUINodeHandle node)198 ArkUI_Bool GetCheckboxGroupSelectAll(ArkUINodeHandle node)
199 {
200 auto *frameNode = reinterpret_cast<FrameNode *>(node);
201 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
202 return static_cast<ArkUI_Bool>(CheckBoxGroupModelNG::GetSelect(frameNode));
203 }
204
GetCheckboxGroupSelectedColor(ArkUINodeHandle node)205 ArkUI_Uint32 GetCheckboxGroupSelectedColor(ArkUINodeHandle node)
206 {
207 auto *frameNode = reinterpret_cast<FrameNode *>(node);
208 CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
209 return CheckBoxGroupModelNG::GetSelectedColor(frameNode).GetValue();
210 }
211
GetCheckboxGroupUnSelectedColor(ArkUINodeHandle node)212 ArkUI_Uint32 GetCheckboxGroupUnSelectedColor(ArkUINodeHandle node)
213 {
214 auto *frameNode = reinterpret_cast<FrameNode *>(node);
215 CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
216 return CheckBoxGroupModelNG::GetUnSelectedColor(frameNode).GetValue();
217 }
218
GetCheckboxGroupMarkColor(ArkUINodeHandle node)219 ArkUI_Uint32 GetCheckboxGroupMarkColor(ArkUINodeHandle node)
220 {
221 auto *frameNode = reinterpret_cast<FrameNode *>(node);
222 CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
223 return CheckBoxGroupModelNG::GetCheckMarkColor(frameNode).GetValue();
224 }
225
GetCheckboxGroupMarkSize(ArkUINodeHandle node)226 ArkUI_Float64 GetCheckboxGroupMarkSize(ArkUINodeHandle node)
227 {
228 auto *frameNode = reinterpret_cast<FrameNode *>(node);
229 CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
230 return CheckBoxGroupModelNG::GetCheckMarkSize(frameNode).Value();
231 }
232
GetCheckboxGroupMarkWidth(ArkUINodeHandle node)233 ArkUI_Float64 GetCheckboxGroupMarkWidth(ArkUINodeHandle node)
234 {
235 auto *frameNode = reinterpret_cast<FrameNode *>(node);
236 CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
237 return CheckBoxGroupModelNG::GetCheckMarkWidth(frameNode).Value();
238 }
239
GetCheckboxGroupStyle(ArkUINodeHandle node)240 ArkUI_Int32 GetCheckboxGroupStyle(ArkUINodeHandle node)
241 {
242 auto *frameNode = reinterpret_cast<FrameNode *>(node);
243 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
244 return static_cast<ArkUI_Int32>(CheckBoxGroupModelNG::GetCheckboxGroupStyle(frameNode));
245 }
246
247 namespace NodeModifier {
GetCheckboxGroupModifier()248 const ArkUICheckboxGroupModifier* GetCheckboxGroupModifier()
249 {
250 CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
251 static const ArkUICheckboxGroupModifier modifier = {
252 .setCheckboxGroupSelectedColor = SetCheckboxGroupSelectedColor,
253 .resetCheckboxGroupSelectedColor = ResetCheckboxGroupSelectedColor,
254 .setCheckboxGroupUnSelectedColor = SetCheckboxGroupUnSelectedColor,
255 .resetCheckboxGroupUnSelectedColor = ResetCheckboxGroupUnSelectedColor,
256 .setCheckboxGroupSelectAll = SetCheckboxGroupSelectAll,
257 .resetCheckboxGroupSelectAll = ResetCheckboxGroupSelectAll,
258 .setCheckboxGroupWidth = SetCheckboxGroupWidth,
259 .resetCheckboxGroupWidth = ResetCheckboxGroupWidth,
260 .setCheckboxGroupHeight = SetCheckboxGroupHeight,
261 .resetCheckboxGroupHeight = ResetCheckboxGroupHeight,
262 .setCheckboxGroupMark = SetCheckboxGroupMark,
263 .resetCheckboxGroupMark = ResetCheckboxGroupMark,
264 .setCheckboxGroupStyle = SetCheckboxGroupStyle,
265 .resetCheckboxGroupStyle = ResetCheckboxGroupStyle,
266 .setCheckboxGroupName = SetCheckboxGroupName,
267 .setCheckboxGroupOnChange=SetCheckboxGroupOnChange,
268 .resetCheckboxGroupOnChange=ResetCheckboxGroupOnChange,
269 .getCheckboxGroupName = GetCheckboxGroupName,
270 .getCheckboxGroupSelectAll = GetCheckboxGroupSelectAll,
271 .getCheckboxGroupSelectedColor = GetCheckboxGroupSelectedColor,
272 .getCheckboxGroupUnSelectedColor = GetCheckboxGroupUnSelectedColor,
273 .getCheckboxGroupMarkColor = GetCheckboxGroupMarkColor,
274 .getCheckboxGroupMarkSize = GetCheckboxGroupMarkSize,
275 .getCheckboxGroupMarkWidth = GetCheckboxGroupMarkWidth,
276 .getCheckboxGroupStyle = GetCheckboxGroupStyle,
277 };
278 CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
279 return &modifier;
280 }
281
GetCJUICheckboxGroupModifier()282 const CJUICheckboxGroupModifier* GetCJUICheckboxGroupModifier()
283 {
284 CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
285 static const CJUICheckboxGroupModifier modifier = {
286 .setCheckboxGroupSelectedColor = SetCheckboxGroupSelectedColor,
287 .resetCheckboxGroupSelectedColor = ResetCheckboxGroupSelectedColor,
288 .setCheckboxGroupUnSelectedColor = SetCheckboxGroupUnSelectedColor,
289 .resetCheckboxGroupUnSelectedColor = ResetCheckboxGroupUnSelectedColor,
290 .setCheckboxGroupSelectAll = SetCheckboxGroupSelectAll,
291 .resetCheckboxGroupSelectAll = ResetCheckboxGroupSelectAll,
292 .setCheckboxGroupWidth = SetCheckboxGroupWidth,
293 .resetCheckboxGroupWidth = ResetCheckboxGroupWidth,
294 .setCheckboxGroupHeight = SetCheckboxGroupHeight,
295 .resetCheckboxGroupHeight = ResetCheckboxGroupHeight,
296 .setCheckboxGroupMark = SetCheckboxGroupMark,
297 .resetCheckboxGroupMark = ResetCheckboxGroupMark,
298 .setCheckboxGroupStyle = SetCheckboxGroupStyle,
299 .resetCheckboxGroupStyle = ResetCheckboxGroupStyle,
300 .setCheckboxGroupName = SetCheckboxGroupName,
301 .getCheckboxGroupName = GetCheckboxGroupName,
302 .getCheckboxGroupSelectAll = GetCheckboxGroupSelectAll,
303 .getCheckboxGroupSelectedColor = GetCheckboxGroupSelectedColor,
304 .getCheckboxGroupUnSelectedColor = GetCheckboxGroupUnSelectedColor,
305 .getCheckboxGroupMarkColor = GetCheckboxGroupMarkColor,
306 .getCheckboxGroupMarkSize = GetCheckboxGroupMarkSize,
307 .getCheckboxGroupMarkWidth = GetCheckboxGroupMarkWidth,
308 .getCheckboxGroupStyle = GetCheckboxGroupStyle,
309 };
310 CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
311 return &modifier;
312 }
313
SetCheckboxGroupChange(ArkUINodeHandle node,void * extraParam)314 void SetCheckboxGroupChange(ArkUINodeHandle node, void* extraParam)
315 {
316 auto* frameNode = reinterpret_cast<FrameNode*>(node);
317 CHECK_NULL_VOID(frameNode);
318 auto onEvent = [node, extraParam](const BaseEventInfo* info) {
319 const auto* groupInfo = TypeInfoHelper::DynamicCast<CheckboxGroupResult>(info);
320 if (!groupInfo) {
321 return;
322 }
323 ArkUINodeEvent event;
324 event.kind = TEXT_INPUT;
325 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
326 event.textInputEvent.subKind = ON_CHECKBOX_GROUP_CHANGE;
327 std::vector<std::string> nameList = groupInfo->GetNameList();
328 std::string status = std::to_string(groupInfo->GetStatus());
329
330 std::string nodeEventStr;
331 if (!nameList.empty()) {
332 nodeEventStr.append("Name:");
333 for (auto nameStr : nameList) {
334 nodeEventStr.append(nameStr);
335 nodeEventStr.append(",");
336 }
337 nodeEventStr.pop_back();
338 nodeEventStr.append(";");
339 }
340
341 nodeEventStr.append("Status:" + status);
342 event.textInputEvent.nativeStringPtr = reinterpret_cast<intptr_t>(nodeEventStr.c_str());
343 SendArkUISyncEvent(&event);
344 };
345 CheckBoxGroupModelNG::SetOnChange(frameNode, std::move(onEvent));
346 }
347
ResetCheckboxGroupChange(ArkUINodeHandle node)348 void ResetCheckboxGroupChange(ArkUINodeHandle node)
349 {
350 auto* frameNode = reinterpret_cast<FrameNode*>(node);
351 CHECK_NULL_VOID(frameNode);
352 CheckBoxGroupModelNG::SetOnChange(frameNode, nullptr);
353 }
354 }
355 }
356