• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/select/select_theme.h"
18 #include "core/components_ng/base/view_abstract_model_ng.h"
19 #include "core/components_ng/pattern/select/select_model_ng.h"
20 #include "frameworks/bridge/common/utils/utils.h"
21 
22 namespace OHOS::Ace::NG {
23 constexpr int32_t DEFAULT_GROUP_DIVIDER_VALUES_COUNT = 3;
24 const char DELIMITER = '|';
25 const char* ERR_CODE = "-1";
26 const int32_t SIZE_OF_FONT_INFO = 3;
27 const int32_t SIZE_OF_TWO = 2;
28 const int32_t DEFAULT_SELECT = 0;
29 constexpr TextDirection DEFAULT_SELECT_DIRECTION = TextDirection::AUTO;
30 
SetSpace(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)31 void SetSpace(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
32 {
33     auto* frameNode = reinterpret_cast<FrameNode*>(node);
34     CHECK_NULL_VOID(frameNode);
35     Dimension space = Dimension(value, static_cast<DimensionUnit>(unit));
36     SelectModelNG::SetSpace(frameNode, space);
37 }
38 
SetValue(ArkUINodeHandle node,ArkUI_CharPtr value)39 void SetValue(ArkUINodeHandle node, ArkUI_CharPtr value)
40 {
41     auto* frameNode = reinterpret_cast<FrameNode*>(node);
42     CHECK_NULL_VOID(frameNode);
43     SelectModelNG::SetValue(frameNode, value);
44 }
45 
SetSelected(ArkUINodeHandle node,ArkUI_Int32 idx)46 void SetSelected(ArkUINodeHandle node, ArkUI_Int32 idx)
47 {
48     auto* frameNode = reinterpret_cast<FrameNode*>(node);
49     CHECK_NULL_VOID(frameNode);
50     if (idx < -1) {
51         idx = -1;
52     }
53     SelectModelNG::SetSelected(frameNode, idx);
54 }
55 
SetSelectFontColor(ArkUINodeHandle node,ArkUI_Uint32 color)56 void SetSelectFontColor(ArkUINodeHandle node, ArkUI_Uint32 color)
57 {
58     auto* frameNode = reinterpret_cast<FrameNode*>(node);
59     CHECK_NULL_VOID(frameNode);
60     SelectModelNG::SetFontColor(frameNode, Color(color));
61 }
62 
SetSelectedOptionBgColor(ArkUINodeHandle node,ArkUI_Uint32 color)63 void SetSelectedOptionBgColor(ArkUINodeHandle node, ArkUI_Uint32 color)
64 {
65     auto* frameNode = reinterpret_cast<FrameNode*>(node);
66     CHECK_NULL_VOID(frameNode);
67     SelectModelNG::SetSelectedOptionBgColor(frameNode, Color(color));
68 }
69 
SetOptionBgColor(ArkUINodeHandle node,ArkUI_Uint32 color)70 void SetOptionBgColor(ArkUINodeHandle node, ArkUI_Uint32 color)
71 {
72     auto* frameNode = reinterpret_cast<FrameNode*>(node);
73     CHECK_NULL_VOID(frameNode);
74     SelectModelNG::SetOptionBgColor(frameNode, Color(color));
75 }
76 
SetOptionFontColor(ArkUINodeHandle node,ArkUI_Uint32 color)77 void SetOptionFontColor(ArkUINodeHandle node, ArkUI_Uint32 color)
78 {
79     auto* frameNode = reinterpret_cast<FrameNode*>(node);
80     CHECK_NULL_VOID(frameNode);
81     SelectModelNG::SetOptionFontColor(frameNode, Color(color));
82 }
83 
SetSelectedOptionFontColor(ArkUINodeHandle node,ArkUI_Uint32 color)84 void SetSelectedOptionFontColor(ArkUINodeHandle node, ArkUI_Uint32 color)
85 {
86     auto* frameNode = reinterpret_cast<FrameNode*>(node);
87     CHECK_NULL_VOID(frameNode);
88     SelectModelNG::SetSelectedOptionFontColor(frameNode, Color(color));
89 }
90 
SetArrowPosition(ArkUINodeHandle node,ArkUI_Int32 arrowPosition)91 void SetArrowPosition(ArkUINodeHandle node, ArkUI_Int32 arrowPosition)
92 {
93     auto* frameNode = reinterpret_cast<FrameNode*>(node);
94     CHECK_NULL_VOID(frameNode);
95     if (static_cast<OHOS::Ace::ArrowPosition>(arrowPosition) != OHOS::Ace::ArrowPosition::START &&
96         static_cast<OHOS::Ace::ArrowPosition>(arrowPosition) != OHOS::Ace::ArrowPosition::END) {
97         arrowPosition = 0;
98     }
99     SelectModelNG::SetArrowPosition(frameNode, static_cast<ArrowPosition>(arrowPosition));
100 }
101 
SetMenuAlign(ArkUINodeHandle node,ArkUI_Int32 alignType,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 size)102 void SetMenuAlign(
103     ArkUINodeHandle node, ArkUI_Int32 alignType, const ArkUI_Float32* values,
104     const ArkUI_Int32* units, ArkUI_Int32 size)
105 {
106     auto* frameNode = reinterpret_cast<FrameNode*>(node);
107     CHECK_NULL_VOID(frameNode);
108     MenuAlign menuAlignObj;
109     menuAlignObj.alignType = static_cast<MenuAlignType>(alignType);
110     if (values != nullptr && units != nullptr && size == SIZE_OF_TWO) {
111         Dimension dx = Dimension(values[0], static_cast<OHOS::Ace::DimensionUnit>(units[0]));
112         Dimension dy = Dimension(values[1], static_cast<OHOS::Ace::DimensionUnit>(units[1]));
113 
114         menuAlignObj.offset = DimensionOffset(dx, dy);
115     }
116     SelectModelNG::SetMenuAlign(frameNode, menuAlignObj);
117 }
118 
SetAvoidance(ArkUINodeHandle node,ArkUI_Int32 modeValue)119 void SetAvoidance(ArkUINodeHandle node, ArkUI_Int32 modeValue)
120 {
121     auto* frameNode = reinterpret_cast<FrameNode*>(node);
122     CHECK_NULL_VOID(frameNode);
123     OHOS::Ace::Avoidance avoidance;
124     switch (modeValue) {
125         case static_cast<ArkUI_Int32>(OHOS::Ace::AvoidanceMode::COVER_TARGET):
126             avoidance.mode = OHOS::Ace::AvoidanceMode::COVER_TARGET;
127             break;
128         case static_cast<ArkUI_Int32>(OHOS::Ace::AvoidanceMode::AVOID_AROUND_TARGET):
129             avoidance.mode = OHOS::Ace::AvoidanceMode::AVOID_AROUND_TARGET;
130             break;
131         default:
132             avoidance.mode = OHOS::Ace::AvoidanceMode::COVER_TARGET;
133             break;
134     }
135 
136     SelectModelNG::SetAvoidance(frameNode, avoidance);
137 }
138 
SetFont(ArkUINodeHandle node,ArkUI_CharPtr fontInfo,ArkUI_Int32 styleVal)139 void SetFont(ArkUINodeHandle node, ArkUI_CharPtr fontInfo, ArkUI_Int32 styleVal)
140 {
141     auto* frameNode = reinterpret_cast<FrameNode*>(node);
142     CHECK_NULL_VOID(frameNode);
143 
144     std::vector<std::string> res;
145     std::string fontValues = std::string(fontInfo);
146     StringUtils::StringSplitter(fontValues, DELIMITER, res);
147     if (res.size() != SIZE_OF_FONT_INFO) {
148         return;
149     }
150 
151     auto selectTheme = GetTheme<SelectTheme>();
152     CHECK_NULL_VOID(selectTheme);
153     auto textTheme = GetTheme<TextTheme>();
154     CHECK_NULL_VOID(textTheme);
155 
156     CalcDimension fontSize = selectTheme->GetFontSize();
157     if (res[0] != ERR_CODE) { // 0: index of font size data
158         fontSize = StringUtils::StringToCalcDimension(res[0], false, DimensionUnit::FP);
159     }
160     SelectModelNG::SetFontSize(frameNode, fontSize);
161 
162     FontWeight weight = FontWeight::MEDIUM;
163     if (res[1] != ERR_CODE) { // 1: index of font weight data
164         weight = StringUtils::StringToFontWeight(res[1], FontWeight::MEDIUM);
165     }
166     SelectModelNG::SetFontWeight(frameNode, weight);
167 
168     std::vector<std::string> fontFamilies = textTheme->GetTextStyle().GetFontFamilies();
169     if (res[2] != ERR_CODE) { // 2: index of font family data
170         fontFamilies = Framework::ConvertStrToFontFamilies(res[2]);
171     }
172     SelectModelNG::SetFontFamily(frameNode, fontFamilies);
173 
174     auto style = static_cast<Ace::FontStyle>(styleVal);
175     SelectModelNG::SetItalicFontStyle(frameNode, style);
176 }
177 
SetOptionFont(ArkUINodeHandle node,ArkUI_CharPtr fontInfo,ArkUI_Int32 styleVal)178 void SetOptionFont(ArkUINodeHandle node, ArkUI_CharPtr fontInfo, ArkUI_Int32 styleVal)
179 {
180     auto* frameNode = reinterpret_cast<FrameNode*>(node);
181     CHECK_NULL_VOID(frameNode);
182     std::vector<std::string> res;
183     std::string fontValues = std::string(fontInfo);
184     StringUtils::StringSplitter(fontValues, DELIMITER, res);
185     if (res.size() != SIZE_OF_FONT_INFO) {
186         return;
187     }
188 
189     auto selectTheme = GetTheme<SelectTheme>();
190     CHECK_NULL_VOID(selectTheme);
191     auto textTheme = GetTheme<TextTheme>();
192     CHECK_NULL_VOID(textTheme);
193 
194     CalcDimension fontSize = selectTheme->GetMenuFontSize();
195     if (res[0] != ERR_CODE) { // 0: index of font size data
196         fontSize = StringUtils::StringToCalcDimension(res[0], false, DimensionUnit::FP);
197     }
198     SelectModelNG::SetOptionFontSize(frameNode, fontSize);
199 
200     FontWeight weight = textTheme->GetTextStyle().GetFontWeight();
201     if (res[1] != ERR_CODE) { // 1: index of font weight data
202         weight = StringUtils::StringToFontWeight(res[1], FontWeight::REGULAR);
203     }
204     SelectModelNG::SetOptionFontWeight(frameNode, weight);
205 
206     std::vector<std::string> fontFamilies = textTheme->GetTextStyle().GetFontFamilies();
207     if (res[2] != ERR_CODE) { // 2: index of font family data
208         fontFamilies = Framework::ConvertStrToFontFamilies(res[2]);
209     }
210     SelectModelNG::SetOptionFontFamily(frameNode, fontFamilies);
211 
212     auto style = static_cast<Ace::FontStyle>(styleVal);
213     SelectModelNG::SetOptionItalicFontStyle(frameNode, style);
214 }
215 
SetSelectedOptionFont(ArkUINodeHandle node,ArkUI_CharPtr fontInfo,ArkUI_Int32 styleVal)216 void SetSelectedOptionFont(ArkUINodeHandle node, ArkUI_CharPtr fontInfo, ArkUI_Int32 styleVal)
217 {
218     auto* frameNode = reinterpret_cast<FrameNode*>(node);
219     CHECK_NULL_VOID(frameNode);
220     std::vector<std::string> res;
221     std::string fontValues = std::string(fontInfo);
222     StringUtils::StringSplitter(fontValues, DELIMITER, res);
223     if (res.size() != SIZE_OF_FONT_INFO) {
224         return;
225     }
226 
227     auto selectTheme = GetTheme<SelectTheme>();
228     CHECK_NULL_VOID(selectTheme);
229     auto textTheme = GetTheme<TextTheme>();
230     CHECK_NULL_VOID(textTheme);
231 
232     CalcDimension fontSize = selectTheme->GetFontSize();
233     if (res[0] != ERR_CODE) { // 0: index of font size data
234         fontSize = StringUtils::StringToCalcDimension(res[0], false, DimensionUnit::FP);
235     }
236     SelectModelNG::SetSelectedOptionFontSize(frameNode, fontSize);
237 
238     FontWeight weight = textTheme->GetTextStyle().GetFontWeight();
239     if (res[1] != ERR_CODE) { // 1: index of font weight data
240         weight = StringUtils::StringToFontWeight(res[1], FontWeight::REGULAR);
241     }
242     SelectModelNG::SetSelectedOptionFontWeight(frameNode, weight);
243 
244     std::vector<std::string> fontFamilies = textTheme->GetTextStyle().GetFontFamilies();
245     if (res[2] != ERR_CODE) { // 2: index of font family data
246         fontFamilies = Framework::ConvertStrToFontFamilies(res[2]);
247     }
248     SelectModelNG::SetSelectedOptionFontFamily(frameNode, fontFamilies);
249 
250     auto style = static_cast<Ace::FontStyle>(styleVal);
251     SelectModelNG::SetSelectedOptionItalicFontStyle(frameNode, style);
252 }
253 
ResetSpace(ArkUINodeHandle node)254 void ResetSpace(ArkUINodeHandle node)
255 {
256     auto* frameNode = reinterpret_cast<FrameNode*>(node);
257     CHECK_NULL_VOID(frameNode);
258     auto selectTheme = GetTheme<SelectTheme>();
259     CHECK_NULL_VOID(selectTheme);
260     Dimension space = selectTheme->GetContentSpinnerPadding();
261     SelectModelNG::SetSpace(frameNode, space);
262 }
263 
ResetValue(ArkUINodeHandle node)264 void ResetValue(ArkUINodeHandle node)
265 {
266     auto* frameNode = reinterpret_cast<FrameNode*>(node);
267     CHECK_NULL_VOID(frameNode);
268     SelectModelNG::SetValue(frameNode, "");
269 }
270 
ResetSelected(ArkUINodeHandle node)271 void ResetSelected(ArkUINodeHandle node)
272 {
273     auto* frameNode = reinterpret_cast<FrameNode*>(node);
274     CHECK_NULL_VOID(frameNode);
275     SelectModelNG::SetSelected(frameNode, DEFAULT_SELECT);
276 }
277 
ResetSelectFontColor(ArkUINodeHandle node)278 void ResetSelectFontColor(ArkUINodeHandle node)
279 {
280     auto* frameNode = reinterpret_cast<FrameNode*>(node);
281     CHECK_NULL_VOID(frameNode);
282     auto selectTheme = GetTheme<SelectTheme>();
283     CHECK_NULL_VOID(selectTheme);
284     SelectModelNG::SetFontColor(frameNode, selectTheme->GetFontColor());
285 }
286 
ResetSelectedOptionBgColor(ArkUINodeHandle node)287 void ResetSelectedOptionBgColor(ArkUINodeHandle node)
288 {
289     auto* frameNode = reinterpret_cast<FrameNode*>(node);
290     CHECK_NULL_VOID(frameNode);
291     auto selectTheme = GetTheme<SelectTheme>();
292     CHECK_NULL_VOID(selectTheme);
293     SelectModelNG::SetSelectedOptionBgColor(frameNode, selectTheme->GetSelectedColor());
294 }
295 
ResetOptionBgColor(ArkUINodeHandle node)296 void ResetOptionBgColor(ArkUINodeHandle node)
297 {
298     auto* frameNode = reinterpret_cast<FrameNode*>(node);
299     CHECK_NULL_VOID(frameNode);
300     auto selectTheme = GetTheme<SelectTheme>();
301     CHECK_NULL_VOID(selectTheme);
302     SelectModelNG::SetOptionBgColor(frameNode, selectTheme->GetBackgroundColor());
303 }
304 
ResetOptionFontColor(ArkUINodeHandle node)305 void ResetOptionFontColor(ArkUINodeHandle node)
306 {
307     auto* frameNode = reinterpret_cast<FrameNode*>(node);
308     CHECK_NULL_VOID(frameNode);
309     auto selectTheme = GetTheme<SelectTheme>();
310     CHECK_NULL_VOID(selectTheme);
311     SelectModelNG::SetOptionFontColor(frameNode, selectTheme->GetMenuFontColor());
312 }
313 
ResetSelectedOptionFontColor(ArkUINodeHandle node)314 void ResetSelectedOptionFontColor(ArkUINodeHandle node)
315 {
316     auto* frameNode = reinterpret_cast<FrameNode*>(node);
317     CHECK_NULL_VOID(frameNode);
318     auto selectTheme = GetTheme<SelectTheme>();
319     CHECK_NULL_VOID(selectTheme);
320     SelectModelNG::SetSelectedOptionFontColor(frameNode, selectTheme->GetSelectedColorText());
321 }
322 
ResetArrowPosition(ArkUINodeHandle node)323 void ResetArrowPosition(ArkUINodeHandle node)
324 {
325     auto* frameNode = reinterpret_cast<FrameNode*>(node);
326     CHECK_NULL_VOID(frameNode);
327     SelectModelNG::SetArrowPosition(frameNode, ArrowPosition::END);
328 }
329 
ResetMenuAlign(ArkUINodeHandle node)330 void ResetMenuAlign(ArkUINodeHandle node)
331 {
332     auto* frameNode = reinterpret_cast<FrameNode*>(node);
333     CHECK_NULL_VOID(frameNode);
334     MenuAlign menuAlignObj;
335     SelectModelNG::SetMenuAlign(frameNode, menuAlignObj);
336 }
337 
ResetAvoidance(ArkUINodeHandle node)338 void ResetAvoidance(ArkUINodeHandle node)
339 {
340     auto* frameNode = reinterpret_cast<FrameNode*>(node);
341     CHECK_NULL_VOID(frameNode);
342     OHOS::Ace::Avoidance avoidance;
343     avoidance.mode = OHOS::Ace::AvoidanceMode::COVER_TARGET;
344     SelectModelNG::SetAvoidance(frameNode, avoidance);
345 }
346 
ResetFont(ArkUINodeHandle node)347 void ResetFont(ArkUINodeHandle node)
348 {
349     auto* frameNode = reinterpret_cast<FrameNode*>(node);
350     CHECK_NULL_VOID(frameNode);
351 
352     auto selectTheme = GetTheme<SelectTheme>();
353     CHECK_NULL_VOID(selectTheme);
354     auto textTheme = GetTheme<TextTheme>();
355     CHECK_NULL_VOID(textTheme);
356 
357     auto controlSize = SelectModelNG::GetControlSize(frameNode);
358     SelectModelNG::SetFontSize(frameNode, selectTheme->GetFontSize(controlSize));
359     SelectModelNG::SetFontWeight(frameNode, FontWeight::MEDIUM);
360     SelectModelNG::SetFontFamily(frameNode, textTheme->GetTextStyle().GetFontFamilies());
361     SelectModelNG::SetItalicFontStyle(frameNode, textTheme->GetTextStyle().GetFontStyle());
362 }
363 
ResetOptionFont(ArkUINodeHandle node)364 void ResetOptionFont(ArkUINodeHandle node)
365 {
366     auto* frameNode = reinterpret_cast<FrameNode*>(node);
367     CHECK_NULL_VOID(frameNode);
368 
369     auto selectTheme = GetTheme<SelectTheme>();
370     CHECK_NULL_VOID(selectTheme);
371     auto textTheme = GetTheme<TextTheme>();
372     CHECK_NULL_VOID(textTheme);
373 
374     SelectModelNG::SetOptionFontSize(frameNode, selectTheme->GetMenuFontSize());
375     SelectModelNG::SetOptionFontWeight(frameNode, textTheme->GetTextStyle().GetFontWeight());
376     SelectModelNG::SetOptionFontFamily(frameNode, textTheme->GetTextStyle().GetFontFamilies());
377     SelectModelNG::SetOptionItalicFontStyle(frameNode, textTheme->GetTextStyle().GetFontStyle());
378 }
379 
ResetSelectedOptionFont(ArkUINodeHandle node)380 void ResetSelectedOptionFont(ArkUINodeHandle node)
381 {
382     auto* frameNode = reinterpret_cast<FrameNode*>(node);
383     CHECK_NULL_VOID(frameNode);
384 
385     auto selectTheme = GetTheme<SelectTheme>();
386     CHECK_NULL_VOID(selectTheme);
387     auto textTheme = GetTheme<TextTheme>();
388     CHECK_NULL_VOID(textTheme);
389 
390     SelectModelNG::SetSelectedOptionFontSize(frameNode, selectTheme->GetFontSize());
391     SelectModelNG::SetSelectedOptionFontWeight(frameNode, textTheme->GetTextStyle().GetFontWeight());
392     SelectModelNG::SetSelectedOptionFontFamily(frameNode, textTheme->GetTextStyle().GetFontFamilies());
393     SelectModelNG::SetSelectedOptionItalicFontStyle(frameNode, textTheme->GetTextStyle().GetFontStyle());
394 }
395 
SetSelectOptionWidthFitTrigger(ArkUINodeHandle node,ArkUI_Bool trigger)396 void SetSelectOptionWidthFitTrigger(ArkUINodeHandle node, ArkUI_Bool trigger)
397 {
398     auto* frameNode = reinterpret_cast<FrameNode*>(node);
399     CHECK_NULL_VOID(frameNode);
400     SelectModelNG::SetOptionWidthFitTrigger(frameNode, trigger);
401 }
402 
SetSelectOptionWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)403 void SetSelectOptionWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
404 {
405     auto* frameNode = reinterpret_cast<FrameNode*>(node);
406     CHECK_NULL_VOID(frameNode);
407     Dimension optionWidth = Dimension(value, static_cast<DimensionUnit>(unit));
408     SelectModelNG::SetHasOptionWidth(frameNode, true);
409     SelectModelNG::SetOptionWidth(frameNode, optionWidth);
410 }
411 
ResetSelectOptionWidth(ArkUINodeHandle node)412 void ResetSelectOptionWidth(ArkUINodeHandle node)
413 {
414     auto* frameNode = reinterpret_cast<FrameNode*>(node);
415     CHECK_NULL_VOID(frameNode);
416     Dimension optionWidth;
417     SelectModelNG::SetHasOptionWidth(frameNode, false);
418     SelectModelNG::SetOptionWidth(frameNode, optionWidth);
419 }
420 
SetSelectOptionHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)421 void SetSelectOptionHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
422 {
423     auto* frameNode = reinterpret_cast<FrameNode*>(node);
424     CHECK_NULL_VOID(frameNode);
425     Dimension optionHeight = Dimension(value, static_cast<DimensionUnit>(unit));
426     SelectModelNG::SetOptionHeight(frameNode, optionHeight);
427 }
428 
ResetSelectOptionHeight(ArkUINodeHandle node)429 void ResetSelectOptionHeight(ArkUINodeHandle node) {}
430 
SetSelectWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)431 void SetSelectWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
432 {
433     auto *frameNode = reinterpret_cast<FrameNode *>(node);
434     CHECK_NULL_VOID(frameNode);
435     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
436     if (unitEnum == DimensionUnit::CALC) {
437         ViewAbstract::SetWidth(
438             frameNode, CalcLength(CalcLength(std::string(calcValue))));
439     } else {
440         ViewAbstract::SetWidth(frameNode, CalcLength(value, unitEnum));
441     }
442 }
443 
ResetSelectWidth(ArkUINodeHandle node)444 void ResetSelectWidth(ArkUINodeHandle node)
445 {
446     auto *frameNode = reinterpret_cast<FrameNode *>(node);
447     CHECK_NULL_VOID(frameNode);
448     ViewAbstract::ClearWidthOrHeight(frameNode, true);
449 }
450 
SetSelectHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)451 void SetSelectHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
452 {
453     auto *frameNode = reinterpret_cast<FrameNode *>(node);
454     CHECK_NULL_VOID(frameNode);
455     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
456     if (unitEnum == DimensionUnit::CALC) {
457         ViewAbstract::SetHeight(
458             frameNode, CalcLength(CalcLength(std::string(calcValue))));
459     } else {
460         ViewAbstract::SetHeight(frameNode, CalcLength(value, unitEnum));
461     }
462 }
463 
ResetSelectHeight(ArkUINodeHandle node)464 void ResetSelectHeight(ArkUINodeHandle node)
465 {
466     auto *frameNode = reinterpret_cast<FrameNode *>(node);
467     CHECK_NULL_VOID(frameNode);
468     ViewAbstract::ClearWidthOrHeight(frameNode, false);
469 }
470 
SetSelectSize(ArkUINodeHandle node,const ArkUI_Float32 * number,const ArkUI_Int32 * unit,ArkUI_CharPtr * calc)471 void SetSelectSize(ArkUINodeHandle node, const ArkUI_Float32* number, const ArkUI_Int32* unit, ArkUI_CharPtr* calc)
472 {
473     CHECK_NULL_VOID(number);
474     CHECK_NULL_VOID(unit);
475     int32_t widthIndex = 0;
476     int32_t heightIndex = 1;
477     auto* frameNode = reinterpret_cast<FrameNode*>(node);
478     CHECK_NULL_VOID(frameNode);
479     if (*(unit + widthIndex) == static_cast<int8_t>(DimensionUnit::CALC) && *(calc + widthIndex) != nullptr) {
480         ViewAbstract::SetWidth(frameNode, CalcLength(std::string(*(calc + widthIndex))));
481     } else {
482         ViewAbstract::SetWidth(
483             frameNode, CalcLength(*(number + widthIndex), static_cast<DimensionUnit>(*(unit + widthIndex))));
484     }
485     if (*(unit + heightIndex) == static_cast<int8_t>(DimensionUnit::CALC) && *(calc + heightIndex) != nullptr) {
486         ViewAbstract::SetHeight(frameNode, CalcLength(std::string(*(calc + heightIndex))));
487     } else {
488         ViewAbstract::SetHeight(
489             frameNode, CalcLength(*(number + heightIndex), static_cast<DimensionUnit>(*(unit + heightIndex))));
490     }
491 }
492 
ResetSelectSize(ArkUINodeHandle node)493 void ResetSelectSize(ArkUINodeHandle node)
494 {
495     auto* frameNode = reinterpret_cast<FrameNode*>(node);
496     CHECK_NULL_VOID(frameNode);
497     ViewAbstract::ClearWidthOrHeight(frameNode, true);
498     ViewAbstract::ClearWidthOrHeight(frameNode, false);
499 }
500 
SetControlSize(ArkUINodeHandle node,ArkUI_Int32 value)501 void SetControlSize(ArkUINodeHandle node, ArkUI_Int32 value)
502 {
503     auto* frameNode = reinterpret_cast<FrameNode*>(node);
504     CHECK_NULL_VOID(frameNode);
505     auto controlSize = static_cast<ControlSize>(value);
506     SelectModelNG::SetControlSize(frameNode, controlSize);
507 }
508 
ResetControlSize(ArkUINodeHandle node)509 void ResetControlSize(ArkUINodeHandle node) {}
510 
SetSelectValue(ArkUINodeHandle node,ArkUI_CharPtr * values,ArkUI_CharPtr * icons,ArkUI_Uint32 length)511 void SetSelectValue(ArkUINodeHandle node, ArkUI_CharPtr* values, ArkUI_CharPtr* icons, ArkUI_Uint32 length)
512 {
513     auto* frameNode = reinterpret_cast<FrameNode*>(node);
514     CHECK_NULL_VOID(frameNode);
515     CHECK_NULL_VOID(values);
516     CHECK_NULL_VOID(icons);
517     std::vector<SelectParam> params;
518     for (uint32_t i = 0; i < length; i++) {
519         if (!values[i]) {
520             return;
521         }
522         SelectParam param;
523         param.text = values[i];
524         param.icon = icons[i];
525         params.emplace_back(param);
526     }
527     SelectModelNG::InitSelect(frameNode, params);
528 }
529 
ResetSelectValue(ArkUINodeHandle node)530 void ResetSelectValue(ArkUINodeHandle node)
531 {
532     auto* frameNode = reinterpret_cast<FrameNode*>(node);
533     CHECK_NULL_VOID(frameNode);
534     std::vector<SelectParam> params;
535     SelectModelNG::InitSelect(frameNode, params);
536 }
537 
SetMenuBgColor(ArkUINodeHandle node,ArkUI_Uint32 color)538 void SetMenuBgColor(ArkUINodeHandle node, ArkUI_Uint32 color)
539 {
540     auto* frameNode = reinterpret_cast<FrameNode*>(node);
541     CHECK_NULL_VOID(frameNode);
542     SelectModelNG::SetMenuBackgroundColor(frameNode, Color(color));
543 }
544 
ResetMenuBgColor(ArkUINodeHandle node)545 void ResetMenuBgColor(ArkUINodeHandle node)
546 {
547     auto* frameNode = reinterpret_cast<FrameNode*>(node);
548     CHECK_NULL_VOID(frameNode);
549     auto selectTheme = GetTheme<SelectTheme>();
550     CHECK_NULL_VOID(selectTheme);
551     SelectModelNG::SetMenuBackgroundColor(frameNode, selectTheme->GetBackgroundColor());
552 }
553 
SetMenuBgBlurStyle(ArkUINodeHandle node,ArkUI_Int32 style)554 void SetMenuBgBlurStyle(ArkUINodeHandle node, ArkUI_Int32 style)
555 {
556     auto* frameNode = reinterpret_cast<FrameNode*>(node);
557     CHECK_NULL_VOID(frameNode);
558     BlurStyleOption styleOption;
559     styleOption.blurStyle = static_cast<OHOS::Ace::BlurStyle>(style);
560     SelectModelNG::SetMenuBackgroundBlurStyle(frameNode, styleOption);
561 }
562 
ResetMenuBgBlurStyle(ArkUINodeHandle node)563 void ResetMenuBgBlurStyle(ArkUINodeHandle node)
564 {
565     auto* frameNode = reinterpret_cast<FrameNode*>(node);
566     CHECK_NULL_VOID(frameNode);
567     BlurStyleOption styleOption;
568     SelectModelNG::SetMenuBackgroundBlurStyle(frameNode, styleOption);
569 }
570 
SetSelectDivider(ArkUINodeHandle node,ArkUI_Uint32 color,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length)571 void SetSelectDivider(ArkUINodeHandle node, ArkUI_Uint32 color, const ArkUI_Float32* values,
572     const ArkUI_Int32* units, ArkUI_Int32 length)
573 {
574     auto* frameNode = reinterpret_cast<FrameNode*>(node);
575     CHECK_NULL_VOID(frameNode);
576 
577     if (length != DEFAULT_GROUP_DIVIDER_VALUES_COUNT) {
578         return;
579     }
580 
581     NG::SelectDivider divider;
582     divider.color = Color(color);
583     divider.strokeWidth = Dimension(values[0], static_cast<OHOS::Ace::DimensionUnit>(units[0]));
584     divider.startMargin = Dimension(values[1], static_cast<OHOS::Ace::DimensionUnit>(units[1]));
585     divider.endMargin = Dimension(values[2], static_cast<OHOS::Ace::DimensionUnit>(units[2]));
586 
587     SelectModelNG::SetDivider(frameNode, divider);
588 }
589 
ResetSelectDivider(ArkUINodeHandle node)590 void ResetSelectDivider(ArkUINodeHandle node)
591 {
592     auto* frameNode = reinterpret_cast<FrameNode*>(node);
593     CHECK_NULL_VOID(frameNode);
594     auto context = frameNode->GetContext();
595     CHECK_NULL_VOID(context);
596     auto themeManager = context->GetThemeManager();
597     CHECK_NULL_VOID(themeManager);
598     auto selectTheme = themeManager->GetTheme<SelectTheme>();
599     Dimension defaultStrokeWidth = 0.0_vp;
600     Dimension defaultMargin = -1.0_vp;
601     Color defaultColor = Color::TRANSPARENT;
602     NG::SelectDivider divider;
603     if (selectTheme) {
604         defaultStrokeWidth = selectTheme->GetDefaultDividerWidth();
605         defaultColor = selectTheme->GetLineColor();
606         divider.strokeWidth = defaultStrokeWidth;
607         divider.color = defaultColor;
608         divider.startMargin = defaultMargin;
609         divider.endMargin = defaultMargin;
610     }
611     SelectModelNG::SetDivider(frameNode, divider);
612 }
613 
ResetSelectDividerNull(ArkUINodeHandle node)614 void ResetSelectDividerNull(ArkUINodeHandle node)
615 {
616     auto* frameNode = reinterpret_cast<FrameNode*>(node);
617     CHECK_NULL_VOID(frameNode);
618     auto context = frameNode->GetContext();
619     CHECK_NULL_VOID(context);
620     auto themeManager = context->GetThemeManager();
621     CHECK_NULL_VOID(themeManager);
622     auto selectTheme = themeManager->GetTheme<SelectTheme>();
623     Dimension defaultStrokeWidth = 0.0_vp;
624     Dimension defaultMargin = -1.0_vp;
625     Color defaultColor = Color::TRANSPARENT;
626     NG::SelectDivider divider;
627     if (selectTheme) {
628         defaultColor = selectTheme->GetLineColor();
629         divider.strokeWidth = defaultStrokeWidth;
630         divider.color = defaultColor;
631         divider.startMargin = defaultMargin;
632         divider.endMargin = defaultMargin;
633     }
634     SelectModelNG::SetDivider(frameNode, divider);
635 }
636 
SetSelectDirection(ArkUINodeHandle node,ArkUI_Int32 direction)637 void SetSelectDirection(ArkUINodeHandle node, ArkUI_Int32 direction)
638 {
639     auto* frameNode = reinterpret_cast<FrameNode*>(node);
640     CHECK_NULL_VOID(frameNode);
641     SelectModelNG::SetLayoutDirection(frameNode, static_cast<TextDirection>(direction));
642 }
643 
ResetSelectDirection(ArkUINodeHandle node)644 void ResetSelectDirection(ArkUINodeHandle node)
645 {
646     auto* frameNode = reinterpret_cast<FrameNode*>(node);
647     CHECK_NULL_VOID(frameNode);
648     SelectModelNG::SetLayoutDirection(frameNode, DEFAULT_SELECT_DIRECTION);
649 }
650 
SetSelectDividerStyle(ArkUINodeHandle node,ArkUIMenuDividerOptions * dividerInfo)651 void SetSelectDividerStyle(ArkUINodeHandle node, ArkUIMenuDividerOptions* dividerInfo)
652 {
653     auto* frameNode = reinterpret_cast<FrameNode*>(node);
654     CHECK_NULL_VOID(frameNode);
655 
656     NG::SelectDivider divider;
657     divider.isDividerStyle = true;
658     divider.strokeWidth = Dimension(dividerInfo->strokeWidth.value,
659         static_cast<OHOS::Ace::DimensionUnit>(dividerInfo->strokeWidth.units));
660     divider.color = Color(dividerInfo->color);
661     divider.startMargin = Dimension(dividerInfo->startMargin.value,
662         static_cast<OHOS::Ace::DimensionUnit>(dividerInfo->startMargin.units));
663     divider.endMargin = Dimension(dividerInfo->endMargin.value,
664         static_cast<OHOS::Ace::DimensionUnit>(dividerInfo->endMargin.units));
665     DividerMode mode = dividerInfo->mode == 1 ? DividerMode::EMBEDDED_IN_MENU: DividerMode::FLOATING_ABOVE_MENU;
666     SelectModelNG::SetDividerStyle(frameNode, divider, mode);
667 }
668 
ResetSelectDividerStyle(ArkUINodeHandle node)669 void ResetSelectDividerStyle(ArkUINodeHandle node)
670 {
671     auto* frameNode = reinterpret_cast<FrameNode*>(node);
672     SelectModelNG::ResetDividerStyle(frameNode);
673 }
674 
675 namespace NodeModifier {
GetSelectModifier()676 const ArkUISelectModifier* GetSelectModifier()
677 {
678     CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
679     static const ArkUISelectModifier modifier = {
680         .setSpace = SetSpace,
681         .setValue = SetValue,
682         .setSelected = SetSelected,
683         .setSelectFontColor = SetSelectFontColor,
684         .setSelectedOptionBgColor = SetSelectedOptionBgColor,
685         .setOptionBgColor = SetOptionBgColor,
686         .setOptionFontColor = SetOptionFontColor,
687         .setSelectedOptionFontColor = SetSelectedOptionFontColor,
688         .setArrowPosition = SetArrowPosition,
689         .setMenuAlign = SetMenuAlign,
690         .setAvoidance = SetAvoidance,
691         .setFont = SetFont,
692         .setOptionFont = SetOptionFont,
693         .setSelectedOptionFont = SetSelectedOptionFont,
694         .resetSpace = ResetSpace,
695         .resetValue = ResetValue,
696         .resetSelected = ResetSelected,
697         .resetSelectFontColor = ResetSelectFontColor,
698         .resetSelectedOptionBgColor = ResetSelectedOptionBgColor,
699         .resetOptionBgColor = ResetOptionBgColor,
700         .resetOptionFontColor = ResetOptionFontColor,
701         .resetSelectedOptionFontColor = ResetSelectedOptionFontColor,
702         .resetArrowPosition = ResetArrowPosition,
703         .resetMenuAlign = ResetMenuAlign,
704         .resetAvoidance = ResetAvoidance,
705         .resetFont = ResetFont,
706         .resetOptionFont = ResetOptionFont,
707         .resetSelectedOptionFont = ResetSelectedOptionFont,
708         .setSelectWidth = SetSelectWidth,
709         .resetSelectWidth = ResetSelectWidth,
710         .setSelectHeight = SetSelectHeight,
711         .resetSelectHeight = ResetSelectHeight,
712         .setSelectSize = SetSelectSize,
713         .resetSelectSize = ResetSelectSize,
714         .setOptionWidthFitTrigger = SetSelectOptionWidthFitTrigger,
715         .setSelectOptionWidth = SetSelectOptionWidth,
716         .resetSelectOptionWidth = ResetSelectOptionWidth,
717         .setSelectOptionHeight = SetSelectOptionHeight,
718         .resetSelectOptionHeight = ResetSelectOptionHeight,
719         .setControlSize = SetControlSize,
720         .resetControlSize = ResetControlSize,
721         .setSelectValue = SetSelectValue,
722         .resetSelectValue = ResetSelectValue,
723         .setMenuBgColor = SetMenuBgColor,
724         .resetMenuBgColor = ResetMenuBgColor,
725         .setMenuBgBlurStyle = SetMenuBgBlurStyle,
726         .resetMenuBgBlurStyle = ResetMenuBgBlurStyle,
727         .setSelectDivider = SetSelectDivider,
728         .resetSelectDivider = ResetSelectDivider,
729         .resetSelectDividerNull = ResetSelectDividerNull,
730         .setSelectDirection = SetSelectDirection,
731         .resetSelectDirection = ResetSelectDirection,
732         .setSelectDividerStyle = SetSelectDividerStyle,
733         .resetSelectDividerStyle = ResetSelectDividerStyle,
734     };
735     CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
736 
737     return &modifier;
738 }
739 
GetCJUISelectModifier()740 const CJUISelectModifier* GetCJUISelectModifier()
741 {
742     CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
743     static const CJUISelectModifier modifier = {
744         .setSpace = SetSpace,
745         .setValue = SetValue,
746         .setSelected = SetSelected,
747         .setSelectFontColor = SetSelectFontColor,
748         .setSelectedOptionBgColor = SetSelectedOptionBgColor,
749         .setOptionBgColor = SetOptionBgColor,
750         .setOptionFontColor = SetOptionFontColor,
751         .setSelectedOptionFontColor = SetSelectedOptionFontColor,
752         .setArrowPosition = SetArrowPosition,
753         .setMenuAlign = SetMenuAlign,
754         .setAvoidance = SetAvoidance,
755         .setFont = SetFont,
756         .setOptionFont = SetOptionFont,
757         .setSelectedOptionFont = SetSelectedOptionFont,
758         .resetSpace = ResetSpace,
759         .resetValue = ResetValue,
760         .resetSelected = ResetSelected,
761         .resetSelectFontColor = ResetSelectFontColor,
762         .resetSelectedOptionBgColor = ResetSelectedOptionBgColor,
763         .resetOptionBgColor = ResetOptionBgColor,
764         .resetOptionFontColor = ResetOptionFontColor,
765         .resetSelectedOptionFontColor = ResetSelectedOptionFontColor,
766         .resetArrowPosition = ResetArrowPosition,
767         .resetMenuAlign = ResetMenuAlign,
768         .resetAvoidance = ResetAvoidance,
769         .resetFont = ResetFont,
770         .resetOptionFont = ResetOptionFont,
771         .resetSelectedOptionFont = ResetSelectedOptionFont,
772         .setSelectWidth = SetSelectWidth,
773         .resetSelectWidth = ResetSelectWidth,
774         .setSelectHeight = SetSelectHeight,
775         .resetSelectHeight = ResetSelectHeight,
776         .setSelectSize = SetSelectSize,
777         .resetSelectSize = ResetSelectSize,
778         .setOptionWidthFitTrigger = SetSelectOptionWidthFitTrigger,
779         .setSelectOptionWidth = SetSelectOptionWidth,
780         .resetSelectOptionWidth = ResetSelectOptionWidth,
781         .setSelectOptionHeight = SetSelectOptionHeight,
782         .resetSelectOptionHeight = ResetSelectOptionHeight,
783         .setControlSize = SetControlSize,
784         .resetControlSize = ResetControlSize,
785         .setMenuBgColor = SetMenuBgColor,
786         .resetMenuBgColor = ResetMenuBgColor,
787         .setMenuBgBlurStyle = SetMenuBgBlurStyle,
788         .resetMenuBgBlurStyle = ResetMenuBgBlurStyle,
789         .setSelectValue = SetSelectValue,
790         .resetSelectValue = ResetSelectValue,
791         .setSelectDivider = SetSelectDivider,
792         .resetSelectDivider = ResetSelectDivider,
793         .resetSelectDividerNull = ResetSelectDividerNull,
794         .setSelectDirection = SetSelectDirection,
795         .resetSelectDirection = ResetSelectDirection,
796     };
797     CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
798 
799     return &modifier;
800 }
801 
SetOnSelectSelect(ArkUINodeHandle node,void * extraParam)802 void SetOnSelectSelect(ArkUINodeHandle node, void* extraParam)
803 {
804     auto* frameNode = reinterpret_cast<FrameNode*>(node);
805     CHECK_NULL_VOID(frameNode);
806     auto onEvent = [node, extraParam](int32_t index, const std::string& value) {
807         ArkUINodeEvent event;
808         event.kind = TEXT_ARRAY;
809         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
810         auto indexStr = std::to_string(index);
811         const char* arrayValue[] = {value.c_str(), indexStr.c_str()};
812         event.textArrayEvent.subKind = ON_SELECT_SELECT;
813         event.textArrayEvent.nativeStringArrayPtr = reinterpret_cast<intptr_t>(arrayValue);
814         SendArkUISyncEvent(&event);
815     };
816     SelectModelNG::SetOnSelect(frameNode, std::move(onEvent));
817 }
818 }
819 } // namespace OHOS::Ace::NG
820