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/select_modifier.h"
16
17 #include "core/components/common/layout/constants.h"
18 #include "core/components/select/select_theme.h"
19 #include "core/components/text/text_theme.h"
20 #include "core/components_ng/base/frame_node.h"
21 #include "core/components_ng/base/view_abstract_model_ng.h"
22 #include "core/components_ng/pattern/select/select_model_ng.h"
23 #include "core/pipeline/base/element_register.h"
24 #include "core/components_ng/pattern/select/select_model.h"
25 #include "frameworks/bridge/common/utils/utils.h"
26
27 namespace OHOS::Ace::NG {
28 constexpr int32_t DEFAULT_GROUP_DIVIDER_VALUES_COUNT = 3;
29 const char DELIMITER = '|';
30 const char* ERR_CODE = "-1";
31 const int32_t SIZE_OF_FONT_INFO = 3;
32 const int32_t SIZE_OF_TWO = 2;
33 const int32_t DEFAULT_SELECT = 0;
34
SetSpace(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)35 void SetSpace(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
36 {
37 auto* frameNode = reinterpret_cast<FrameNode*>(node);
38 CHECK_NULL_VOID(frameNode);
39 Dimension space = Dimension(value, static_cast<DimensionUnit>(unit));
40 SelectModelNG::SetSpace(frameNode, space);
41 }
42
SetValue(ArkUINodeHandle node,ArkUI_CharPtr value)43 void SetValue(ArkUINodeHandle node, ArkUI_CharPtr value)
44 {
45 auto* frameNode = reinterpret_cast<FrameNode*>(node);
46 CHECK_NULL_VOID(frameNode);
47 SelectModelNG::SetValue(frameNode, value);
48 }
49
SetSelected(ArkUINodeHandle node,ArkUI_Int32 idx)50 void SetSelected(ArkUINodeHandle node, ArkUI_Int32 idx)
51 {
52 auto* frameNode = reinterpret_cast<FrameNode*>(node);
53 CHECK_NULL_VOID(frameNode);
54 if (idx < -1) {
55 idx = -1;
56 }
57 SelectModelNG::SetSelected(frameNode, idx);
58 }
59
SetSelectFontColor(ArkUINodeHandle node,ArkUI_Uint32 color)60 void SetSelectFontColor(ArkUINodeHandle node, ArkUI_Uint32 color)
61 {
62 auto* frameNode = reinterpret_cast<FrameNode*>(node);
63 CHECK_NULL_VOID(frameNode);
64 SelectModelNG::SetFontColor(frameNode, Color(color));
65 }
66
SetSelectedOptionBgColor(ArkUINodeHandle node,ArkUI_Uint32 color)67 void SetSelectedOptionBgColor(ArkUINodeHandle node, ArkUI_Uint32 color)
68 {
69 auto* frameNode = reinterpret_cast<FrameNode*>(node);
70 CHECK_NULL_VOID(frameNode);
71 SelectModelNG::SetSelectedOptionBgColor(frameNode, Color(color));
72 }
73
SetOptionBgColor(ArkUINodeHandle node,ArkUI_Uint32 color)74 void SetOptionBgColor(ArkUINodeHandle node, ArkUI_Uint32 color)
75 {
76 auto* frameNode = reinterpret_cast<FrameNode*>(node);
77 CHECK_NULL_VOID(frameNode);
78 SelectModelNG::SetOptionBgColor(frameNode, Color(color));
79 }
80
SetOptionFontColor(ArkUINodeHandle node,ArkUI_Uint32 color)81 void SetOptionFontColor(ArkUINodeHandle node, ArkUI_Uint32 color)
82 {
83 auto* frameNode = reinterpret_cast<FrameNode*>(node);
84 CHECK_NULL_VOID(frameNode);
85 SelectModelNG::SetOptionFontColor(frameNode, Color(color));
86 }
87
SetSelectedOptionFontColor(ArkUINodeHandle node,ArkUI_Uint32 color)88 void SetSelectedOptionFontColor(ArkUINodeHandle node, ArkUI_Uint32 color)
89 {
90 auto* frameNode = reinterpret_cast<FrameNode*>(node);
91 CHECK_NULL_VOID(frameNode);
92 SelectModelNG::SetSelectedOptionFontColor(frameNode, Color(color));
93 }
94
SetArrowPosition(ArkUINodeHandle node,ArkUI_Int32 arrowPosition)95 void SetArrowPosition(ArkUINodeHandle node, ArkUI_Int32 arrowPosition)
96 {
97 auto* frameNode = reinterpret_cast<FrameNode*>(node);
98 CHECK_NULL_VOID(frameNode);
99 if (static_cast<OHOS::Ace::ArrowPosition>(arrowPosition) != OHOS::Ace::ArrowPosition::START &&
100 static_cast<OHOS::Ace::ArrowPosition>(arrowPosition) != OHOS::Ace::ArrowPosition::END) {
101 arrowPosition = 0;
102 }
103 SelectModelNG::SetArrowPosition(frameNode, static_cast<ArrowPosition>(arrowPosition));
104 }
105
SetMenuAlign(ArkUINodeHandle node,ArkUI_Int32 alignType,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 size)106 void SetMenuAlign(
107 ArkUINodeHandle node, ArkUI_Int32 alignType, const ArkUI_Float32* values,
108 const ArkUI_Int32* units, ArkUI_Int32 size)
109 {
110 auto* frameNode = reinterpret_cast<FrameNode*>(node);
111 CHECK_NULL_VOID(frameNode);
112 MenuAlign menuAlignObj;
113 menuAlignObj.alignType = static_cast<MenuAlignType>(alignType);
114 if (values != nullptr && units != nullptr && size == SIZE_OF_TWO) {
115 Dimension dx = Dimension(values[0], static_cast<OHOS::Ace::DimensionUnit>(units[0]));
116 Dimension dy = Dimension(values[1], static_cast<OHOS::Ace::DimensionUnit>(units[1]));
117
118 menuAlignObj.offset = DimensionOffset(dx, dy);
119 }
120 SelectModelNG::SetMenuAlign(frameNode, menuAlignObj);
121 }
122
SetFont(ArkUINodeHandle node,ArkUI_CharPtr fontInfo,ArkUI_Int32 styleVal)123 void SetFont(ArkUINodeHandle node, ArkUI_CharPtr fontInfo, ArkUI_Int32 styleVal)
124 {
125 auto* frameNode = reinterpret_cast<FrameNode*>(node);
126 CHECK_NULL_VOID(frameNode);
127
128 std::vector<std::string> res;
129 std::string fontValues = std::string(fontInfo);
130 StringUtils::StringSplitter(fontValues, DELIMITER, res);
131 if (res.size() != SIZE_OF_FONT_INFO) {
132 return;
133 }
134
135 auto selectTheme = GetTheme<SelectTheme>();
136 CHECK_NULL_VOID(selectTheme);
137 auto textTheme = GetTheme<TextTheme>();
138 CHECK_NULL_VOID(textTheme);
139
140 CalcDimension fontSize = selectTheme->GetFontSize();
141 if (res[0] != ERR_CODE) { // 0: index of font size data
142 fontSize = StringUtils::StringToCalcDimension(res[0], false, DimensionUnit::FP);
143 }
144 SelectModelNG::SetFontSize(frameNode, fontSize);
145
146 FontWeight weight = FontWeight::MEDIUM;
147 if (res[1] != ERR_CODE) { // 1: index of font weight data
148 weight = StringUtils::StringToFontWeight(res[1], FontWeight::MEDIUM);
149 }
150 SelectModelNG::SetFontWeight(frameNode, weight);
151
152 std::vector<std::string> fontFamilies = textTheme->GetTextStyle().GetFontFamilies();
153 if (res[2] != ERR_CODE) { // 2: index of font family data
154 fontFamilies = Framework::ConvertStrToFontFamilies(res[2]);
155 }
156 SelectModelNG::SetFontFamily(frameNode, fontFamilies);
157
158 auto style = static_cast<Ace::FontStyle>(styleVal);
159 SelectModelNG::SetItalicFontStyle(frameNode, style);
160 }
161
SetOptionFont(ArkUINodeHandle node,ArkUI_CharPtr fontInfo,ArkUI_Int32 styleVal)162 void SetOptionFont(ArkUINodeHandle node, ArkUI_CharPtr fontInfo, ArkUI_Int32 styleVal)
163 {
164 auto* frameNode = reinterpret_cast<FrameNode*>(node);
165 CHECK_NULL_VOID(frameNode);
166 std::vector<std::string> res;
167 std::string fontValues = std::string(fontInfo);
168 StringUtils::StringSplitter(fontValues, DELIMITER, res);
169 if (res.size() != SIZE_OF_FONT_INFO) {
170 return;
171 }
172
173 auto selectTheme = GetTheme<SelectTheme>();
174 CHECK_NULL_VOID(selectTheme);
175 auto textTheme = GetTheme<TextTheme>();
176 CHECK_NULL_VOID(textTheme);
177
178 CalcDimension fontSize = selectTheme->GetMenuFontSize();
179 if (res[0] != ERR_CODE) { // 0: index of font size data
180 fontSize = StringUtils::StringToCalcDimension(res[0], false, DimensionUnit::FP);
181 }
182 SelectModelNG::SetOptionFontSize(frameNode, fontSize);
183
184 FontWeight weight = textTheme->GetTextStyle().GetFontWeight();
185 if (res[1] != ERR_CODE) { // 1: index of font weight data
186 weight = StringUtils::StringToFontWeight(res[1], FontWeight::REGULAR);
187 }
188 SelectModelNG::SetOptionFontWeight(frameNode, weight);
189
190 std::vector<std::string> fontFamilies = textTheme->GetTextStyle().GetFontFamilies();
191 if (res[2] != ERR_CODE) { // 2: index of font family data
192 fontFamilies = Framework::ConvertStrToFontFamilies(res[2]);
193 }
194 SelectModelNG::SetOptionFontFamily(frameNode, fontFamilies);
195
196 auto style = static_cast<Ace::FontStyle>(styleVal);
197 SelectModelNG::SetOptionItalicFontStyle(frameNode, style);
198 }
199
SetSelectedOptionFont(ArkUINodeHandle node,ArkUI_CharPtr fontInfo,ArkUI_Int32 styleVal)200 void SetSelectedOptionFont(ArkUINodeHandle node, ArkUI_CharPtr fontInfo, ArkUI_Int32 styleVal)
201 {
202 auto* frameNode = reinterpret_cast<FrameNode*>(node);
203 CHECK_NULL_VOID(frameNode);
204 std::vector<std::string> res;
205 std::string fontValues = std::string(fontInfo);
206 StringUtils::StringSplitter(fontValues, DELIMITER, res);
207 if (res.size() != SIZE_OF_FONT_INFO) {
208 return;
209 }
210
211 auto selectTheme = GetTheme<SelectTheme>();
212 CHECK_NULL_VOID(selectTheme);
213 auto textTheme = GetTheme<TextTheme>();
214 CHECK_NULL_VOID(textTheme);
215
216 CalcDimension fontSize = selectTheme->GetFontSize();
217 if (res[0] != ERR_CODE) { // 0: index of font size data
218 fontSize = StringUtils::StringToCalcDimension(res[0], false, DimensionUnit::FP);
219 }
220 SelectModelNG::SetSelectedOptionFontSize(frameNode, fontSize);
221
222 FontWeight weight = textTheme->GetTextStyle().GetFontWeight();
223 if (res[1] != ERR_CODE) { // 1: index of font weight data
224 weight = StringUtils::StringToFontWeight(res[1], FontWeight::REGULAR);
225 }
226 SelectModelNG::SetSelectedOptionFontWeight(frameNode, weight);
227
228 std::vector<std::string> fontFamilies = textTheme->GetTextStyle().GetFontFamilies();
229 if (res[2] != ERR_CODE) { // 2: index of font family data
230 fontFamilies = Framework::ConvertStrToFontFamilies(res[2]);
231 }
232 SelectModelNG::SetSelectedOptionFontFamily(frameNode, fontFamilies);
233
234 auto style = static_cast<Ace::FontStyle>(styleVal);
235 SelectModelNG::SetSelectedOptionItalicFontStyle(frameNode, style);
236 }
237
ResetSpace(ArkUINodeHandle node)238 void ResetSpace(ArkUINodeHandle node)
239 {
240 auto* frameNode = reinterpret_cast<FrameNode*>(node);
241 CHECK_NULL_VOID(frameNode);
242 auto selectTheme = GetTheme<SelectTheme>();
243 CHECK_NULL_VOID(selectTheme);
244 Dimension space = selectTheme->GetContentSpinnerPadding();
245 SelectModelNG::SetSpace(frameNode, space);
246 }
247
ResetValue(ArkUINodeHandle node)248 void ResetValue(ArkUINodeHandle node)
249 {
250 auto* frameNode = reinterpret_cast<FrameNode*>(node);
251 CHECK_NULL_VOID(frameNode);
252 SelectModelNG::SetValue(frameNode, "");
253 }
254
ResetSelected(ArkUINodeHandle node)255 void ResetSelected(ArkUINodeHandle node)
256 {
257 auto* frameNode = reinterpret_cast<FrameNode*>(node);
258 CHECK_NULL_VOID(frameNode);
259 SelectModelNG::SetSelected(frameNode, DEFAULT_SELECT);
260 }
261
ResetSelectFontColor(ArkUINodeHandle node)262 void ResetSelectFontColor(ArkUINodeHandle node)
263 {
264 auto* frameNode = reinterpret_cast<FrameNode*>(node);
265 CHECK_NULL_VOID(frameNode);
266 auto selectTheme = GetTheme<SelectTheme>();
267 CHECK_NULL_VOID(selectTheme);
268 SelectModelNG::SetFontColor(frameNode, selectTheme->GetFontColor());
269 }
270
ResetSelectedOptionBgColor(ArkUINodeHandle node)271 void ResetSelectedOptionBgColor(ArkUINodeHandle node)
272 {
273 auto* frameNode = reinterpret_cast<FrameNode*>(node);
274 CHECK_NULL_VOID(frameNode);
275 auto selectTheme = GetTheme<SelectTheme>();
276 CHECK_NULL_VOID(selectTheme);
277 SelectModelNG::SetSelectedOptionBgColor(frameNode, selectTheme->GetSelectedColor());
278 }
279
ResetOptionBgColor(ArkUINodeHandle node)280 void ResetOptionBgColor(ArkUINodeHandle node)
281 {
282 auto* frameNode = reinterpret_cast<FrameNode*>(node);
283 CHECK_NULL_VOID(frameNode);
284 auto selectTheme = GetTheme<SelectTheme>();
285 CHECK_NULL_VOID(selectTheme);
286 SelectModelNG::SetOptionBgColor(frameNode, selectTheme->GetBackgroundColor());
287 }
288
ResetOptionFontColor(ArkUINodeHandle node)289 void ResetOptionFontColor(ArkUINodeHandle node)
290 {
291 auto* frameNode = reinterpret_cast<FrameNode*>(node);
292 CHECK_NULL_VOID(frameNode);
293 auto selectTheme = GetTheme<SelectTheme>();
294 CHECK_NULL_VOID(selectTheme);
295 SelectModelNG::SetOptionFontColor(frameNode, selectTheme->GetMenuFontColor());
296 }
297
ResetSelectedOptionFontColor(ArkUINodeHandle node)298 void ResetSelectedOptionFontColor(ArkUINodeHandle node)
299 {
300 auto* frameNode = reinterpret_cast<FrameNode*>(node);
301 CHECK_NULL_VOID(frameNode);
302 auto selectTheme = GetTheme<SelectTheme>();
303 CHECK_NULL_VOID(selectTheme);
304 SelectModelNG::SetSelectedOptionFontColor(frameNode, selectTheme->GetSelectedColorText());
305 }
306
ResetArrowPosition(ArkUINodeHandle node)307 void ResetArrowPosition(ArkUINodeHandle node)
308 {
309 auto* frameNode = reinterpret_cast<FrameNode*>(node);
310 CHECK_NULL_VOID(frameNode);
311 SelectModelNG::SetArrowPosition(frameNode, ArrowPosition::END);
312 }
313
ResetMenuAlign(ArkUINodeHandle node)314 void ResetMenuAlign(ArkUINodeHandle node)
315 {
316 auto* frameNode = reinterpret_cast<FrameNode*>(node);
317 CHECK_NULL_VOID(frameNode);
318 MenuAlign menuAlignObj;
319 SelectModelNG::SetMenuAlign(frameNode, menuAlignObj);
320 }
321
ResetFont(ArkUINodeHandle node)322 void ResetFont(ArkUINodeHandle node)
323 {
324 auto* frameNode = reinterpret_cast<FrameNode*>(node);
325 CHECK_NULL_VOID(frameNode);
326
327 auto selectTheme = GetTheme<SelectTheme>();
328 CHECK_NULL_VOID(selectTheme);
329 auto textTheme = GetTheme<TextTheme>();
330 CHECK_NULL_VOID(textTheme);
331
332 auto controlSize = SelectModelNG::GetControlSize(frameNode);
333 SelectModelNG::SetFontSize(frameNode, selectTheme->GetFontSize(controlSize));
334 SelectModelNG::SetFontWeight(frameNode, FontWeight::MEDIUM);
335 SelectModelNG::SetFontFamily(frameNode, textTheme->GetTextStyle().GetFontFamilies());
336 SelectModelNG::SetItalicFontStyle(frameNode, textTheme->GetTextStyle().GetFontStyle());
337 }
338
ResetOptionFont(ArkUINodeHandle node)339 void ResetOptionFont(ArkUINodeHandle node)
340 {
341 auto* frameNode = reinterpret_cast<FrameNode*>(node);
342 CHECK_NULL_VOID(frameNode);
343
344 auto selectTheme = GetTheme<SelectTheme>();
345 CHECK_NULL_VOID(selectTheme);
346 auto textTheme = GetTheme<TextTheme>();
347 CHECK_NULL_VOID(textTheme);
348
349 SelectModelNG::SetOptionFontSize(frameNode, selectTheme->GetMenuFontSize());
350 SelectModelNG::SetOptionFontWeight(frameNode, textTheme->GetTextStyle().GetFontWeight());
351 SelectModelNG::SetOptionFontFamily(frameNode, textTheme->GetTextStyle().GetFontFamilies());
352 SelectModelNG::SetOptionItalicFontStyle(frameNode, textTheme->GetTextStyle().GetFontStyle());
353 }
354
ResetSelectedOptionFont(ArkUINodeHandle node)355 void ResetSelectedOptionFont(ArkUINodeHandle node)
356 {
357 auto* frameNode = reinterpret_cast<FrameNode*>(node);
358 CHECK_NULL_VOID(frameNode);
359
360 auto selectTheme = GetTheme<SelectTheme>();
361 CHECK_NULL_VOID(selectTheme);
362 auto textTheme = GetTheme<TextTheme>();
363 CHECK_NULL_VOID(textTheme);
364
365 SelectModelNG::SetSelectedOptionFontSize(frameNode, selectTheme->GetFontSize());
366 SelectModelNG::SetSelectedOptionFontWeight(frameNode, textTheme->GetTextStyle().GetFontWeight());
367 SelectModelNG::SetSelectedOptionFontFamily(frameNode, textTheme->GetTextStyle().GetFontFamilies());
368 SelectModelNG::SetSelectedOptionItalicFontStyle(frameNode, textTheme->GetTextStyle().GetFontStyle());
369 }
370
SetSelectOptionWidthFitTrigger(ArkUINodeHandle node,ArkUI_Bool trigger)371 void SetSelectOptionWidthFitTrigger(ArkUINodeHandle node, ArkUI_Bool trigger)
372 {
373 auto* frameNode = reinterpret_cast<FrameNode*>(node);
374 CHECK_NULL_VOID(frameNode);
375 SelectModelNG::SetOptionWidthFitTrigger(frameNode, trigger);
376 }
377
SetSelectOptionWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)378 void SetSelectOptionWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
379 {
380 auto* frameNode = reinterpret_cast<FrameNode*>(node);
381 CHECK_NULL_VOID(frameNode);
382 Dimension optionWidth = Dimension(value, static_cast<DimensionUnit>(unit));
383 SelectModelNG::SetHasOptionWidth(frameNode, true);
384 SelectModelNG::SetOptionWidth(frameNode, optionWidth);
385 }
386
ResetSelectOptionWidth(ArkUINodeHandle node)387 void ResetSelectOptionWidth(ArkUINodeHandle node)
388 {
389 auto* frameNode = reinterpret_cast<FrameNode*>(node);
390 CHECK_NULL_VOID(frameNode);
391 Dimension optionWidth;
392 SelectModelNG::SetHasOptionWidth(frameNode, false);
393 SelectModelNG::SetOptionWidth(frameNode, optionWidth);
394 }
395
SetSelectOptionHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)396 void SetSelectOptionHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
397 {
398 auto* frameNode = reinterpret_cast<FrameNode*>(node);
399 CHECK_NULL_VOID(frameNode);
400 Dimension optionHeight = Dimension(value, static_cast<DimensionUnit>(unit));
401 SelectModelNG::SetOptionHeight(frameNode, optionHeight);
402 }
403
ResetSelectOptionHeight(ArkUINodeHandle node)404 void ResetSelectOptionHeight(ArkUINodeHandle node) {}
405
SetSelectWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)406 void SetSelectWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
407 {
408 auto *frameNode = reinterpret_cast<FrameNode *>(node);
409 CHECK_NULL_VOID(frameNode);
410 auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
411 if (unitEnum == DimensionUnit::CALC) {
412 ViewAbstract::SetWidth(
413 frameNode, CalcLength(CalcLength(std::string(calcValue))));
414 } else {
415 ViewAbstract::SetWidth(frameNode, CalcLength(value, unitEnum));
416 }
417 }
418
ResetSelectWidth(ArkUINodeHandle node)419 void ResetSelectWidth(ArkUINodeHandle node)
420 {
421 auto *frameNode = reinterpret_cast<FrameNode *>(node);
422 CHECK_NULL_VOID(frameNode);
423 ViewAbstract::ClearWidthOrHeight(frameNode, true);
424 }
425
SetSelectHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)426 void SetSelectHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
427 {
428 auto *frameNode = reinterpret_cast<FrameNode *>(node);
429 CHECK_NULL_VOID(frameNode);
430 auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
431 if (unitEnum == DimensionUnit::CALC) {
432 ViewAbstract::SetHeight(
433 frameNode, CalcLength(CalcLength(std::string(calcValue))));
434 } else {
435 ViewAbstract::SetHeight(frameNode, CalcLength(value, unitEnum));
436 }
437 }
438
ResetSelectHeight(ArkUINodeHandle node)439 void ResetSelectHeight(ArkUINodeHandle node)
440 {
441 auto *frameNode = reinterpret_cast<FrameNode *>(node);
442 CHECK_NULL_VOID(frameNode);
443 ViewAbstract::ClearWidthOrHeight(frameNode, false);
444 }
445
SetSelectSize(ArkUINodeHandle node,const ArkUI_Float32 * number,const ArkUI_Int32 * unit,ArkUI_CharPtr * calc)446 void SetSelectSize(ArkUINodeHandle node, const ArkUI_Float32* number, const ArkUI_Int32* unit, ArkUI_CharPtr* calc)
447 {
448 CHECK_NULL_VOID(number);
449 CHECK_NULL_VOID(unit);
450 int32_t widthIndex = 0;
451 int32_t heightIndex = 1;
452 auto* frameNode = reinterpret_cast<FrameNode*>(node);
453 CHECK_NULL_VOID(frameNode);
454 if (*(unit + widthIndex) == static_cast<int8_t>(DimensionUnit::CALC) && *(calc + widthIndex) != nullptr) {
455 ViewAbstract::SetWidth(frameNode, CalcLength(std::string(*(calc + widthIndex))));
456 } else {
457 ViewAbstract::SetWidth(
458 frameNode, CalcLength(*(number + widthIndex), static_cast<DimensionUnit>(*(unit + widthIndex))));
459 }
460 if (*(unit + heightIndex) == static_cast<int8_t>(DimensionUnit::CALC) && *(calc + heightIndex) != nullptr) {
461 ViewAbstract::SetHeight(frameNode, CalcLength(std::string(*(calc + heightIndex))));
462 } else {
463 ViewAbstract::SetHeight(
464 frameNode, CalcLength(*(number + heightIndex), static_cast<DimensionUnit>(*(unit + heightIndex))));
465 }
466 }
467
ResetSelectSize(ArkUINodeHandle node)468 void ResetSelectSize(ArkUINodeHandle node)
469 {
470 auto* frameNode = reinterpret_cast<FrameNode*>(node);
471 CHECK_NULL_VOID(frameNode);
472 ViewAbstract::ClearWidthOrHeight(frameNode, true);
473 ViewAbstract::ClearWidthOrHeight(frameNode, false);
474 }
475
SetControlSize(ArkUINodeHandle node,ArkUI_Int32 value)476 void SetControlSize(ArkUINodeHandle node, ArkUI_Int32 value)
477 {
478 auto* frameNode = reinterpret_cast<FrameNode*>(node);
479 CHECK_NULL_VOID(frameNode);
480 auto controlSize = static_cast<ControlSize>(value);
481 SelectModelNG::SetControlSize(frameNode, controlSize);
482 }
483
ResetControlSize(ArkUINodeHandle node)484 void ResetControlSize(ArkUINodeHandle node) {}
485
SetMenuBgColor(ArkUINodeHandle node,ArkUI_Uint32 color)486 void SetMenuBgColor(ArkUINodeHandle node, ArkUI_Uint32 color)
487 {
488 auto* frameNode = reinterpret_cast<FrameNode*>(node);
489 CHECK_NULL_VOID(frameNode);
490 SelectModelNG::SetMenuBackgroundColor(frameNode, Color(color));
491 }
492
ResetMenuBgColor(ArkUINodeHandle node)493 void ResetMenuBgColor(ArkUINodeHandle node)
494 {
495 auto* frameNode = reinterpret_cast<FrameNode*>(node);
496 CHECK_NULL_VOID(frameNode);
497 auto selectTheme = GetTheme<SelectTheme>();
498 CHECK_NULL_VOID(selectTheme);
499 SelectModelNG::SetMenuBackgroundColor(frameNode, selectTheme->GetBackgroundColor());
500 }
501
SetMenuBgBlurStyle(ArkUINodeHandle node,ArkUI_Int32 style)502 void SetMenuBgBlurStyle(ArkUINodeHandle node, ArkUI_Int32 style)
503 {
504 auto* frameNode = reinterpret_cast<FrameNode*>(node);
505 CHECK_NULL_VOID(frameNode);
506 BlurStyleOption styleOption;
507 styleOption.blurStyle = static_cast<OHOS::Ace::BlurStyle>(style);
508 SelectModelNG::SetMenuBackgroundBlurStyle(frameNode, styleOption);
509 }
510
ResetMenuBgBlurStyle(ArkUINodeHandle node)511 void ResetMenuBgBlurStyle(ArkUINodeHandle node)
512 {
513 auto* frameNode = reinterpret_cast<FrameNode*>(node);
514 CHECK_NULL_VOID(frameNode);
515 BlurStyleOption styleOption;
516 SelectModelNG::SetMenuBackgroundBlurStyle(frameNode, styleOption);
517 }
518
SetSelectValue(ArkUINodeHandle node,ArkUI_CharPtr * values,ArkUI_CharPtr * icons,ArkUI_Uint32 length)519 void SetSelectValue(ArkUINodeHandle node, ArkUI_CharPtr* values, ArkUI_CharPtr* icons, ArkUI_Uint32 length)
520 {
521 auto* frameNode = reinterpret_cast<FrameNode*>(node);
522 CHECK_NULL_VOID(frameNode);
523 CHECK_NULL_VOID(values);
524 CHECK_NULL_VOID(icons);
525 std::vector<SelectParam> params(length);
526 for (uint32_t i = 0; i < length; i++) {
527 if (!values[i]) {
528 return;
529 }
530 params[i] = { values[i], icons[i] };
531 }
532 SelectModelNG::InitSelect(frameNode, params);
533 }
534
ResetSelectValue(ArkUINodeHandle node)535 void ResetSelectValue(ArkUINodeHandle node)
536 {
537 auto* frameNode = reinterpret_cast<FrameNode*>(node);
538 CHECK_NULL_VOID(frameNode);
539 std::vector<SelectParam> params;
540 SelectModelNG::InitSelect(frameNode, params);
541 }
542
SetSelectDivider(ArkUINodeHandle node,ArkUI_Uint32 color,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length)543 void SetSelectDivider(ArkUINodeHandle node, ArkUI_Uint32 color, const ArkUI_Float32* values,
544 const ArkUI_Int32* units, ArkUI_Int32 length)
545 {
546 auto* frameNode = reinterpret_cast<FrameNode*>(node);
547 CHECK_NULL_VOID(frameNode);
548
549 if (length != DEFAULT_GROUP_DIVIDER_VALUES_COUNT) {
550 return;
551 }
552
553 NG::SelectDivider divider;
554 divider.color = Color(color);
555 divider.strokeWidth = Dimension(values[0], static_cast<OHOS::Ace::DimensionUnit>(units[0]));
556 divider.startMargin = Dimension(values[1], static_cast<OHOS::Ace::DimensionUnit>(units[1]));
557 divider.endMargin = Dimension(values[2], static_cast<OHOS::Ace::DimensionUnit>(units[2]));
558
559 SelectModelNG::SetDivider(frameNode, divider);
560 }
561
ResetSelectDivider(ArkUINodeHandle node)562 void ResetSelectDivider(ArkUINodeHandle node)
563 {
564 auto* frameNode = reinterpret_cast<FrameNode*>(node);
565 CHECK_NULL_VOID(frameNode);
566 auto context = frameNode->GetContext();
567 CHECK_NULL_VOID(context);
568 auto themeManager = context->GetThemeManager();
569 CHECK_NULL_VOID(themeManager);
570 auto selectTheme = themeManager->GetTheme<SelectTheme>();
571 Dimension defaultStrokeWidth = 0.0_vp;
572 Dimension defaultMargin = -1.0_vp;
573 Color defaultColor = Color::TRANSPARENT;
574 NG::SelectDivider divider;
575 if (selectTheme) {
576 defaultStrokeWidth = selectTheme->GetDefaultDividerWidth();
577 defaultColor = selectTheme->GetLineColor();
578 divider.strokeWidth = defaultStrokeWidth;
579 divider.color = defaultColor;
580 divider.startMargin = defaultMargin;
581 divider.endMargin = defaultMargin;
582 }
583 SelectModelNG::SetDivider(frameNode, divider);
584 }
585
ResetSelectDividerNull(ArkUINodeHandle node)586 void ResetSelectDividerNull(ArkUINodeHandle node)
587 {
588 auto* frameNode = reinterpret_cast<FrameNode*>(node);
589 CHECK_NULL_VOID(frameNode);
590 auto context = frameNode->GetContext();
591 CHECK_NULL_VOID(context);
592 auto themeManager = context->GetThemeManager();
593 CHECK_NULL_VOID(themeManager);
594 auto selectTheme = themeManager->GetTheme<SelectTheme>();
595 Dimension defaultStrokeWidth = 0.0_vp;
596 Dimension defaultMargin = -1.0_vp;
597 Color defaultColor = Color::TRANSPARENT;
598 NG::SelectDivider divider;
599 if (selectTheme) {
600 defaultColor = selectTheme->GetLineColor();
601 divider.strokeWidth = defaultStrokeWidth;
602 divider.color = defaultColor;
603 divider.startMargin = defaultMargin;
604 divider.endMargin = defaultMargin;
605 }
606 SelectModelNG::SetDivider(frameNode, divider);
607 }
608
609 namespace NodeModifier {
GetSelectModifier()610 const ArkUISelectModifier* GetSelectModifier()
611 {
612 static const ArkUISelectModifier modifier = { SetSpace, SetValue, SetSelected, SetSelectFontColor,
613 SetSelectedOptionBgColor, SetOptionBgColor, SetOptionFontColor, SetSelectedOptionFontColor, SetArrowPosition,
614 SetMenuAlign, SetFont, SetOptionFont, SetSelectedOptionFont, ResetSpace, ResetValue, ResetSelected,
615 ResetSelectFontColor, ResetSelectedOptionBgColor, ResetOptionBgColor, ResetOptionFontColor,
616 ResetSelectedOptionFontColor, ResetArrowPosition, ResetMenuAlign, ResetFont, ResetOptionFont,
617 ResetSelectedOptionFont, SetSelectWidth, ResetSelectWidth, SetSelectHeight, ResetSelectHeight, SetSelectSize,
618 ResetSelectSize, SetSelectOptionWidthFitTrigger, SetSelectOptionWidth, ResetSelectOptionWidth,
619 SetSelectOptionHeight, ResetSelectOptionHeight, SetControlSize, ResetControlSize, SetMenuBgColor,
620 ResetMenuBgColor, SetMenuBgBlurStyle, ResetMenuBgBlurStyle, SetSelectValue, ResetSelectValue, SetSelectDivider,
621 ResetSelectDivider, ResetSelectDividerNull };
622
623 return &modifier;
624 }
625
GetCJUISelectModifier()626 const CJUISelectModifier* GetCJUISelectModifier()
627 {
628 static const CJUISelectModifier modifier = { SetSpace, SetValue, SetSelected, SetSelectFontColor,
629 SetSelectedOptionBgColor, SetOptionBgColor, SetOptionFontColor, SetSelectedOptionFontColor, SetArrowPosition,
630 SetMenuAlign, SetFont, SetOptionFont, SetSelectedOptionFont, ResetSpace, ResetValue, ResetSelected,
631 ResetSelectFontColor, ResetSelectedOptionBgColor, ResetOptionBgColor, ResetOptionFontColor,
632 ResetSelectedOptionFontColor, ResetArrowPosition, ResetMenuAlign, ResetFont, ResetOptionFont,
633 ResetSelectedOptionFont, SetSelectWidth, ResetSelectWidth, SetSelectHeight, ResetSelectHeight, SetSelectSize,
634 ResetSelectSize, SetSelectOptionWidthFitTrigger, SetSelectOptionWidth, ResetSelectOptionWidth,
635 SetSelectOptionHeight, ResetSelectOptionHeight, SetControlSize, ResetControlSize, SetMenuBgColor,
636 ResetMenuBgColor, SetMenuBgBlurStyle, ResetMenuBgBlurStyle, SetSelectValue, ResetSelectValue, SetSelectDivider,
637 ResetSelectDivider, ResetSelectDividerNull };
638
639 return &modifier;
640 }
641
SetOnSelectSelect(ArkUINodeHandle node,void * extraParam)642 void SetOnSelectSelect(ArkUINodeHandle node, void* extraParam)
643 {
644 auto* frameNode = reinterpret_cast<FrameNode*>(node);
645 CHECK_NULL_VOID(frameNode);
646 auto onEvent = [node, extraParam](int32_t index, const std::string& value) {
647 ArkUINodeEvent event;
648 event.kind = TEXT_ARRAY;
649 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
650 auto indexStr = std::to_string(index);
651 const char* arrayValue[] = {value.c_str(), indexStr.c_str()};
652 event.textArrayEvent.subKind = ON_SELECT_SELECT;
653 event.textArrayEvent.nativeStringArrayPtr = reinterpret_cast<intptr_t>(arrayValue);
654 SendArkUIAsyncEvent(&event);
655 };
656 SelectModelNG::SetOnSelect(frameNode, std::move(onEvent));
657 }
658 }
659 } // namespace OHOS::Ace::NG