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