1 /*
2 * Copyright (c) 2023-2024 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/node_textpicker_modifier.h"
16
17 #include "base/geometry/dimension.h"
18 #include "base/utils/utils.h"
19 #include "bridge/common/utils/utils.h"
20 #include "core/components/common/layout/constants.h"
21 #include "core/components/common/properties/text_style.h"
22 #include "core/components/picker/picker_theme.h"
23 #include "core/components_ng/base/frame_node.h"
24 #include "core/components_ng/pattern/picker/picker_type_define.h"
25 #include "core/components_ng/pattern/tabs/tabs_model.h"
26 #include "core/components_ng/pattern/text_picker/textpicker_model_ng.h"
27 #include "core/interfaces/arkoala/arkoala_api.h"
28 #include "core/pipeline/base/element_register.h"
29
30 namespace OHOS::Ace::NG {
31 namespace {
32 constexpr int32_t SIZE_OF_THREE = 3;
33 constexpr int32_t POS_0 = 0;
34 constexpr int32_t POS_1 = 1;
35 constexpr int32_t POS_2 = 2;
36 constexpr int NUM_3 = 3;
37 constexpr int32_t DEFAULT_GROUP_DIVIDER_VALUES_COUNT = 3;
38 const char DEFAULT_DELIMITER = '|';
39 const int32_t ERROR_INT_CODE = -1;
40 constexpr uint32_t MAX_SIZE = 12;
41 std::string g_strValue;
42 const std::vector<OHOS::Ace::FontStyle> FONT_STYLES = { OHOS::Ace::FontStyle::NORMAL, OHOS::Ace::FontStyle::ITALIC };
43 const std::vector<TextOverflow> TEXT_OVERFLOWS = { TextOverflow::NONE, TextOverflow::CLIP, TextOverflow::ELLIPSIS,
44 TextOverflow::MARQUEE };
45
SetTextPickerBackgroundColor(ArkUINodeHandle node,ArkUI_Uint32 color)46 void SetTextPickerBackgroundColor(ArkUINodeHandle node, ArkUI_Uint32 color)
47 {
48 auto* frameNode = reinterpret_cast<FrameNode*>(node);
49 CHECK_NULL_VOID(frameNode);
50 TextPickerModelNG::SetBackgroundColor(frameNode, Color(color));
51 }
52
ResetTextPickerBackgroundColor(ArkUINodeHandle node)53 void ResetTextPickerBackgroundColor(ArkUINodeHandle node)
54 {
55 auto* frameNode = reinterpret_cast<FrameNode*>(node);
56 CHECK_NULL_VOID(frameNode);
57 auto pipeline = frameNode->GetContext();
58 CHECK_NULL_VOID(pipeline);
59 auto theme = pipeline->GetTheme<DialogTheme>();
60 CHECK_NULL_VOID(theme);
61 TextPickerModelNG::SetBackgroundColor(frameNode, theme->GetBackgroundColor());
62 }
63
GetTextPickerCanLoop(ArkUINodeHandle node)64 ArkUI_Int32 GetTextPickerCanLoop(ArkUINodeHandle node)
65 {
66 auto* frameNode = reinterpret_cast<FrameNode*>(node);
67 CHECK_NULL_RETURN(frameNode, 1);
68 return TextPickerModelNG::GetCanLoop(frameNode);
69 }
70
SetTextPickerCanLoop(ArkUINodeHandle node,int canLoop)71 void SetTextPickerCanLoop(ArkUINodeHandle node, int canLoop)
72 {
73 auto* frameNode = reinterpret_cast<FrameNode*>(node);
74 CHECK_NULL_VOID(frameNode);
75 TextPickerModelNG::SetCanLoop(frameNode, canLoop);
76 }
77
ResetTextPickerCanLoop(ArkUINodeHandle node)78 void ResetTextPickerCanLoop(ArkUINodeHandle node)
79 {
80 auto* frameNode = reinterpret_cast<FrameNode*>(node);
81 CHECK_NULL_VOID(frameNode);
82 TextPickerModelNG::SetCanLoop(frameNode, true);
83 }
84
GetTextPickerSelectedIndex(ArkUINodeHandle node,ArkUI_Uint32 * values,ArkUI_Int32 size)85 void GetTextPickerSelectedIndex(ArkUINodeHandle node, ArkUI_Uint32* values, ArkUI_Int32 size)
86 {
87 auto* frameNode = reinterpret_cast<FrameNode*>(node);
88 CHECK_NULL_VOID(frameNode);
89 if (TextPickerModelNG::IsSingle(frameNode)) {
90 auto selectedValue = static_cast<ArkUI_Uint32>(TextPickerModelNG::getTextPickerSelectedIndex(frameNode));
91 values[0] = selectedValue;
92 } else {
93 auto selectedValue = TextPickerModelNG::getTextPickerSelecteds(frameNode);
94 if (static_cast<ArkUI_Uint32>(size) != selectedValue.size()) {
95 return;
96 }
97 for (int i = 0; i < size; i++) {
98 values[i] = selectedValue[i];
99 }
100 }
101 }
102
SetTextPickerSelectedIndex(ArkUINodeHandle node,ArkUI_Uint32 * values,ArkUI_Int32 size)103 void SetTextPickerSelectedIndex(ArkUINodeHandle node, ArkUI_Uint32* values, ArkUI_Int32 size)
104 {
105 auto* frameNode = reinterpret_cast<FrameNode*>(node);
106 CHECK_NULL_VOID(frameNode);
107
108 if (TextPickerModelNG::IsSingle(frameNode)) {
109 NodeModifier::SetSelectedIndexSingle(frameNode, values, size);
110 } else {
111 NodeModifier::SetSelectedIndexMulti(frameNode, values, size);
112 }
113 }
114
ResetTextPickerSelectedIndex(ArkUINodeHandle node)115 void ResetTextPickerSelectedIndex(ArkUINodeHandle node)
116 {
117 auto* frameNode = reinterpret_cast<FrameNode*>(node);
118 CHECK_NULL_VOID(frameNode);
119 std::vector<uint32_t> selectedValues;
120 selectedValues.emplace_back(0);
121 if (TextPickerModelNG::IsSingle(frameNode)) {
122 NodeModifier::SetSelectedIndexSingle(frameNode, selectedValues.data(), selectedValues.size());
123 } else {
124 NodeModifier::SetSelectedIndexMulti(frameNode, selectedValues.data(), selectedValues.size());
125 }
126 }
127
SetTextPickerTextStyle(ArkUINodeHandle node,ArkUI_Uint32 color,ArkUI_CharPtr fontInfo,ArkUI_Int32 style)128 void SetTextPickerTextStyle(ArkUINodeHandle node, ArkUI_Uint32 color, ArkUI_CharPtr fontInfo, ArkUI_Int32 style)
129 {
130 auto* frameNode = reinterpret_cast<FrameNode*>(node);
131 CHECK_NULL_VOID(frameNode);
132 auto pipeline = frameNode->GetContext();
133 CHECK_NULL_VOID(pipeline);
134 auto themeManager = pipeline->GetThemeManager();
135 CHECK_NULL_VOID(themeManager);
136 auto theme = themeManager->GetTheme<PickerTheme>();
137 CHECK_NULL_VOID(theme);
138
139 NG::PickerTextStyle textStyle;
140 std::vector<std::string> res;
141 std::string fontValues = std::string(fontInfo);
142 StringUtils::StringSplitter(fontValues, DEFAULT_DELIMITER, res);
143 if (res.size() != NUM_3) {
144 return;
145 }
146 textStyle.fontSize = StringUtils::StringToCalcDimension(res[POS_0], false, DimensionUnit::FP);
147 if (style >= 0 && style < static_cast<int32_t>(FONT_STYLES.size())) {
148 textStyle.fontStyle = FONT_STYLES[style];
149 } else {
150 textStyle.fontStyle = FONT_STYLES[0];
151 }
152 textStyle.fontFamily = Framework::ConvertStrToFontFamilies(res[POS_2]);
153 textStyle.fontWeight = StringUtils::StringToFontWeight(res[POS_1]);
154 textStyle.textColor = Color(color);
155 TextPickerModelNG::SetNormalTextStyle(frameNode, theme, textStyle);
156 }
157
ResetTextPickerTextStyle(ArkUINodeHandle node)158 void ResetTextPickerTextStyle(ArkUINodeHandle node)
159 {
160 auto* frameNode = reinterpret_cast<FrameNode*>(node);
161 CHECK_NULL_VOID(frameNode);
162 NG::PickerTextStyle pickerTextStyle;
163 auto context = frameNode->GetContext();
164 CHECK_NULL_VOID(context);
165 auto themeManager = context->GetThemeManager();
166 CHECK_NULL_VOID(themeManager);
167 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
168 TextPickerModelNG::SetNormalTextStyle(frameNode, pickerTheme, pickerTextStyle);
169 }
170
SetTextPickerSelectedTextStyle(ArkUINodeHandle node,ArkUI_Uint32 color,ArkUI_CharPtr fontInfo,ArkUI_Int32 style)171 void SetTextPickerSelectedTextStyle(ArkUINodeHandle node, ArkUI_Uint32 color, ArkUI_CharPtr fontInfo, ArkUI_Int32 style)
172 {
173 auto* frameNode = reinterpret_cast<FrameNode*>(node);
174 CHECK_NULL_VOID(frameNode);
175 auto pipeline = frameNode->GetContext();
176 CHECK_NULL_VOID(pipeline);
177 auto themeManager = pipeline->GetThemeManager();
178 CHECK_NULL_VOID(themeManager);
179 auto theme = themeManager->GetTheme<PickerTheme>();
180 CHECK_NULL_VOID(theme);
181
182 NG::PickerTextStyle textStyle;
183 std::vector<std::string> res;
184 std::string fontValues = std::string(fontInfo);
185 StringUtils::StringSplitter(fontValues, DEFAULT_DELIMITER, res);
186 if (res.size() != NUM_3) {
187 return;
188 }
189 textStyle.fontSize = StringUtils::StringToCalcDimension(res[POS_0], false, DimensionUnit::FP);
190 if (style >= 0 && style < static_cast<int32_t>(FONT_STYLES.size())) {
191 textStyle.fontStyle = FONT_STYLES[style];
192 } else {
193 textStyle.fontStyle = FONT_STYLES[0];
194 }
195 textStyle.fontFamily = Framework::ConvertStrToFontFamilies(res[POS_2]);
196 textStyle.fontWeight = StringUtils::StringToFontWeight(res[POS_1]);
197 textStyle.textColor = Color(color);
198 TextPickerModelNG::SetSelectedTextStyle(frameNode, theme, textStyle);
199 }
200
ResetTextPickerSelectedTextStyle(ArkUINodeHandle node)201 void ResetTextPickerSelectedTextStyle(ArkUINodeHandle node)
202 {
203 auto* frameNode = reinterpret_cast<FrameNode*>(node);
204 CHECK_NULL_VOID(frameNode);
205 NG::PickerTextStyle pickerTextStyle;
206 auto context = frameNode->GetContext();
207 CHECK_NULL_VOID(context);
208 auto themeManager = context->GetThemeManager();
209 CHECK_NULL_VOID(themeManager);
210 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
211 TextPickerModelNG::SetSelectedTextStyle(frameNode, pickerTheme, pickerTextStyle);
212 }
213
SetTextPickerDisappearTextStyle(ArkUINodeHandle node,ArkUI_Uint32 color,ArkUI_CharPtr fontInfo,ArkUI_Int32 style)214 void SetTextPickerDisappearTextStyle(
215 ArkUINodeHandle node, ArkUI_Uint32 color, ArkUI_CharPtr fontInfo, ArkUI_Int32 style)
216 {
217 auto* frameNode = reinterpret_cast<FrameNode*>(node);
218 CHECK_NULL_VOID(frameNode);
219 auto pipeline = frameNode->GetContext();
220 CHECK_NULL_VOID(pipeline);
221 auto themeManager = pipeline->GetThemeManager();
222 CHECK_NULL_VOID(themeManager);
223 auto theme = themeManager->GetTheme<PickerTheme>();
224 CHECK_NULL_VOID(theme);
225
226 NG::PickerTextStyle textStyle;
227 std::vector<std::string> res;
228 std::string fontValues = std::string(fontInfo);
229 StringUtils::StringSplitter(fontValues, DEFAULT_DELIMITER, res);
230 if (res.size() != NUM_3) {
231 return;
232 }
233 textStyle.fontSize = StringUtils::StringToCalcDimension(res[POS_0], false, DimensionUnit::FP);
234 if (style >= 0 && style < static_cast<int32_t>(FONT_STYLES.size())) {
235 textStyle.fontStyle = FONT_STYLES[style];
236 } else {
237 textStyle.fontStyle = FONT_STYLES[0];
238 }
239 textStyle.fontFamily = Framework::ConvertStrToFontFamilies(res[POS_2]);
240 textStyle.fontWeight = StringUtils::StringToFontWeight(res[POS_1]);
241 textStyle.textColor = Color(color);
242 TextPickerModelNG::SetDisappearTextStyle(frameNode, theme, textStyle);
243 }
244
ResetTextPickerDisappearTextStyle(ArkUINodeHandle node)245 void ResetTextPickerDisappearTextStyle(ArkUINodeHandle node)
246 {
247 auto* frameNode = reinterpret_cast<FrameNode*>(node);
248 CHECK_NULL_VOID(frameNode);
249 NG::PickerTextStyle pickerTextStyle;
250 auto context = frameNode->GetContext();
251 CHECK_NULL_VOID(context);
252 auto themeManager = context->GetThemeManager();
253 CHECK_NULL_VOID(themeManager);
254 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
255 TextPickerModelNG::SetDisappearTextStyle(frameNode, pickerTheme, pickerTextStyle);
256 }
257
GetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node,ArkUI_Int32 dUnit)258 ArkUI_Float32 GetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node, ArkUI_Int32 dUnit)
259 {
260 auto* frameNode = reinterpret_cast<FrameNode*>(node);
261 CHECK_NULL_RETURN(frameNode, -1.0f);
262 return TextPickerModelNG::GetDefaultPickerItemHeight(frameNode).GetNativeValue(static_cast<DimensionUnit>(dUnit));
263 }
264
SetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node,float dVal,ArkUI_Int32 dUnit)265 void SetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node, float dVal, ArkUI_Int32 dUnit)
266 {
267 auto* frameNode = reinterpret_cast<FrameNode*>(node);
268 CHECK_NULL_VOID(frameNode);
269 TextPickerModelNG::SetDefaultPickerItemHeight(frameNode, Dimension(dVal, static_cast<DimensionUnit>(dUnit)));
270 }
271
ResetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node)272 void ResetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node)
273 {
274 auto* frameNode = reinterpret_cast<FrameNode*>(node);
275 CHECK_NULL_VOID(frameNode);
276 auto height = Dimension(0.0);
277 TextPickerModelNG::SetDefaultPickerItemHeight(frameNode, height);
278 }
279
GetTextPickerRangeStr(ArkUINodeHandle node)280 ArkUI_CharPtr GetTextPickerRangeStr(ArkUINodeHandle node)
281 {
282 auto* frameNode = reinterpret_cast<FrameNode*>(node);
283 CHECK_NULL_RETURN(frameNode, "");
284 g_strValue = TextPickerModelNG::getTextPickerRange(frameNode);
285 return g_strValue.c_str();
286 }
287
GetTextPickerSingleRange(ArkUINodeHandle node)288 ArkUI_Int32 GetTextPickerSingleRange(ArkUINodeHandle node)
289 {
290 auto* frameNode = reinterpret_cast<FrameNode*>(node);
291 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
292 return TextPickerModelNG::GetTextPickerRangeType(frameNode);
293 }
294
SetTextPickerRangeStr(ArkUINodeHandle node,ArkUI_CharPtr rangeStr,ArkUI_Bool isSingleRange,ArkUI_Int32 rangeType)295 void SetTextPickerRangeStr(
296 ArkUINodeHandle node, ArkUI_CharPtr rangeStr, ArkUI_Bool isSingleRange, ArkUI_Int32 rangeType)
297 {
298 auto* frameNode = reinterpret_cast<FrameNode*>(node);
299 CHECK_NULL_VOID(frameNode);
300 TextPickerModelNG::SetTextPickerSingeRange(static_cast<bool>(isSingleRange));
301 std::vector<std::string> getRangeVector;
302 StringUtils::StringSplitter(std::string(rangeStr), ';', getRangeVector);
303 if (isSingleRange) {
304 std::vector<NG::RangeContent> result;
305 for (const auto& text : getRangeVector) {
306 NG::RangeContent content;
307 content.icon_ = "";
308 content.text_ = text;
309 result.emplace_back(content);
310 }
311 TextPickerModelNG::SetRange(frameNode, result);
312 } else {
313 std::vector<NG::TextCascadePickerOptions> multiResult;
314 for (const auto& text : getRangeVector) {
315 NG::TextCascadePickerOptions option;
316 StringUtils::StringSplitter(std::string(text), ',', option.rangeResult);
317 multiResult.emplace_back(option);
318 }
319 TextPickerModelNG::SetColumns(frameNode, multiResult);
320 }
321 TextPickerModelNG::SetTextPickerRangeType(frameNode, rangeType);
322 }
323
GetTextPickerValue(ArkUINodeHandle node)324 ArkUI_CharPtr GetTextPickerValue(ArkUINodeHandle node)
325 {
326 auto* frameNode = reinterpret_cast<FrameNode*>(node);
327 CHECK_NULL_RETURN(frameNode, "");
328 if (TextPickerModelNG::IsSingle(frameNode)) {
329 g_strValue = TextPickerModelNG::getTextPickerValue(frameNode);
330 } else {
331 g_strValue = TextPickerModelNG::getTextPickerValues(frameNode);
332 }
333 return g_strValue.c_str();
334 }
335
SetTextPickerValue(ArkUINodeHandle node,ArkUI_CharPtr valueStr)336 void SetTextPickerValue(ArkUINodeHandle node, ArkUI_CharPtr valueStr)
337 {
338 auto* frameNode = reinterpret_cast<FrameNode*>(node);
339 CHECK_NULL_VOID(frameNode);
340 std::vector<std::string> getValueVector;
341 StringUtils::StringSplitter(std::string(valueStr), ';', getValueVector);
342 if (TextPickerModelNG::GetTextPickerSingeRange()) {
343 TextPickerModelNG::SetValue(frameNode, valueStr);
344 } else {
345 TextPickerModelNG::SetValues(frameNode, getValueVector);
346 }
347 }
348
GetTextPickerSelectedTextStyle(ArkUINodeHandle node)349 ArkUI_CharPtr GetTextPickerSelectedTextStyle(ArkUINodeHandle node)
350 {
351 auto* frameNode = reinterpret_cast<FrameNode*>(node);
352 CHECK_NULL_RETURN(frameNode, "");
353 PickerTextStyle pickerTextStyle = TextPickerModelNG::getSelectedTextStyle(frameNode);
354 std::vector<std::string> fontFamilies = pickerTextStyle.fontFamily.value_or(std::vector<std::string>());
355 std::string families;
356 if (fontFamilies.size() == 0) {
357 fontFamilies.emplace_back("HarmonyOS Sans");
358 }
359 //set index start
360 int index = 0;
361 for (auto& family : fontFamilies) {
362 families += family;
363 if (index != static_cast<int>(fontFamilies.size()) - 1) {
364 families += ",";
365 }
366 index++;
367 }
368 g_strValue = pickerTextStyle.textColor->ColorToString() + ";";
369 g_strValue = g_strValue + std::to_string(static_cast<int>(pickerTextStyle.fontSize->ConvertToFp())) + ";";
370 g_strValue = g_strValue + StringUtils::ToString(pickerTextStyle.fontWeight.value_or(FontWeight::W100)) + ";";
371 g_strValue = g_strValue + families + ";";
372 g_strValue =
373 g_strValue + StringUtils::ToStringNDK(pickerTextStyle.fontStyle.value_or(OHOS::Ace::FontStyle::NORMAL));
374 return g_strValue.c_str();
375 }
376
GetTextPickerTextStyle(ArkUINodeHandle node)377 ArkUI_CharPtr GetTextPickerTextStyle(ArkUINodeHandle node)
378 {
379 auto* frameNode = reinterpret_cast<FrameNode*>(node);
380 CHECK_NULL_RETURN(frameNode, "");
381 PickerTextStyle pickerTextStyle = TextPickerModelNG::getNormalTextStyle(frameNode);
382 std::vector<std::string> fontFamilies = pickerTextStyle.fontFamily.value_or(std::vector<std::string>());
383 std::string families;
384 if (fontFamilies.size() == 0) {
385 fontFamilies.emplace_back("HarmonyOS Sans");
386 }
387 //set index start
388 int index = 0;
389 for (auto& family : fontFamilies) {
390 families += family;
391 if (index != static_cast<int>(fontFamilies.size()) - 1) {
392 families += ",";
393 }
394 index++;
395 }
396 g_strValue = pickerTextStyle.textColor->ColorToString() + ";";
397 g_strValue = g_strValue + std::to_string(static_cast<int>(pickerTextStyle.fontSize->ConvertToFp())) + ";";
398 g_strValue = g_strValue + StringUtils::ToString(pickerTextStyle.fontWeight.value_or(FontWeight::W100)) + ";";
399 g_strValue = g_strValue + families + ";";
400 g_strValue =
401 g_strValue + StringUtils::ToStringNDK(pickerTextStyle.fontStyle.value_or(OHOS::Ace::FontStyle::NORMAL));
402 return g_strValue.c_str();
403 }
404
GetTextPickerDisappearTextStyle(ArkUINodeHandle node)405 ArkUI_CharPtr GetTextPickerDisappearTextStyle(ArkUINodeHandle node)
406 {
407 auto* frameNode = reinterpret_cast<FrameNode*>(node);
408 CHECK_NULL_RETURN(frameNode, "");
409 PickerTextStyle pickerTextStyle = TextPickerModelNG::getDisappearTextStyle(frameNode);
410 std::vector<std::string> fontFamilies = pickerTextStyle.fontFamily.value_or(std::vector<std::string>());
411 std::string families;
412 if (fontFamilies.size() == 0) {
413 fontFamilies.emplace_back("HarmonyOS Sans");
414 }
415 //set index start
416 int index = 0;
417 for (auto& family : fontFamilies) {
418 families += family;
419 if (index != static_cast<int>(fontFamilies.size()) - 1) {
420 families += ",";
421 }
422 index++;
423 }
424 g_strValue = pickerTextStyle.textColor->ColorToString() + ";";
425 g_strValue = g_strValue + std::to_string(static_cast<int>(pickerTextStyle.fontSize->ConvertToFp())) + ";";
426 g_strValue = g_strValue + StringUtils::ToString(pickerTextStyle.fontWeight.value_or(FontWeight::W100)) + ";";
427 g_strValue = g_strValue + families + ";";
428 g_strValue =
429 g_strValue + StringUtils::ToStringNDK(pickerTextStyle.fontStyle.value_or(OHOS::Ace::FontStyle::NORMAL));
430 return g_strValue.c_str();
431 }
432
SetTextPickerDivider(ArkUINodeHandle node,ArkUI_Uint32 color,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length)433 void SetTextPickerDivider(
434 ArkUINodeHandle node, ArkUI_Uint32 color, const ArkUI_Float32* values, const ArkUI_Int32* units, ArkUI_Int32 length)
435 {
436 auto* frameNode = reinterpret_cast<FrameNode*>(node);
437 CHECK_NULL_VOID(frameNode);
438
439 if (length != DEFAULT_GROUP_DIVIDER_VALUES_COUNT) {
440 return;
441 }
442
443 NG::ItemDivider divider;
444 divider.color = Color(color);
445 divider.strokeWidth = Dimension(values[POS_0], static_cast<OHOS::Ace::DimensionUnit>(units[POS_0]));
446 divider.startMargin = Dimension(values[POS_1], static_cast<OHOS::Ace::DimensionUnit>(units[POS_1]));
447 divider.endMargin = Dimension(values[POS_2], static_cast<OHOS::Ace::DimensionUnit>(units[POS_2]));
448
449 TextPickerModelNG::SetDivider(frameNode, divider);
450 }
451
ResetTextPickerDivider(ArkUINodeHandle node)452 void ResetTextPickerDivider(ArkUINodeHandle node)
453 {
454 auto* frameNode = reinterpret_cast<FrameNode*>(node);
455 CHECK_NULL_VOID(frameNode);
456 NG::ItemDivider divider;
457 TextPickerModelNG::SetDivider(frameNode, divider);
458 }
459
SetTextPickerGradientHeight(ArkUINodeHandle node,ArkUI_Float32 dVal,ArkUI_Int32 dUnit)460 void SetTextPickerGradientHeight(ArkUINodeHandle node, ArkUI_Float32 dVal, ArkUI_Int32 dUnit)
461 {
462 auto* frameNode = reinterpret_cast<FrameNode*>(node);
463 CHECK_NULL_VOID(frameNode);
464 TextPickerModelNG::SetGradientHeight(frameNode, Dimension(dVal, static_cast<DimensionUnit>(dUnit)));
465 }
466
ResetTextPickerGradientHeight(ArkUINodeHandle node)467 void ResetTextPickerGradientHeight(ArkUINodeHandle node)
468 {
469 auto* frameNode = reinterpret_cast<FrameNode*>(node);
470 CHECK_NULL_VOID(frameNode);
471
472 auto pipeline = frameNode->GetContext();
473 CHECK_NULL_VOID(pipeline);
474 auto themeManager = pipeline->GetThemeManager();
475 CHECK_NULL_VOID(themeManager);
476 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
477 CHECK_NULL_VOID(pickerTheme);
478
479 CalcDimension height;
480 if (pickerTheme) {
481 height = pickerTheme->GetGradientHeight();
482 } else {
483 height = 0.0_vp;
484 }
485
486 TextPickerModelNG::SetGradientHeight(frameNode, height);
487 }
488
SetTextPickerDisableTextStyleAnimation(ArkUINodeHandle node,int disableTextStyleAnimation)489 void SetTextPickerDisableTextStyleAnimation(ArkUINodeHandle node, int disableTextStyleAnimation)
490 {
491 auto* frameNode = reinterpret_cast<FrameNode*>(node);
492 CHECK_NULL_VOID(frameNode);
493 TextPickerModelNG::SetDisableTextStyleAnimation(frameNode, disableTextStyleAnimation);
494 }
495
ResetTextPickerDisableTextStyleAnimation(ArkUINodeHandle node)496 void ResetTextPickerDisableTextStyleAnimation(ArkUINodeHandle node)
497 {
498 auto* frameNode = reinterpret_cast<FrameNode*>(node);
499 CHECK_NULL_VOID(frameNode);
500 TextPickerModelNG::SetDisableTextStyleAnimation(frameNode, false);
501 }
502
SetTextPickerDefaultTextStyle(ArkUINodeHandle node,ArkUI_Uint32 color,ArkUI_CharPtr fontInfo,ArkUI_Int32 style,ArkUI_CharPtr minFontSize,ArkUI_CharPtr maxFontSize,ArkUI_Int32 overflow)503 void SetTextPickerDefaultTextStyle(ArkUINodeHandle node, ArkUI_Uint32 color, ArkUI_CharPtr fontInfo, ArkUI_Int32 style,
504 ArkUI_CharPtr minFontSize, ArkUI_CharPtr maxFontSize, ArkUI_Int32 overflow)
505 {
506 auto* frameNode = reinterpret_cast<FrameNode*>(node);
507 CHECK_NULL_VOID(frameNode);
508 auto pipeline = frameNode->GetContext();
509 CHECK_NULL_VOID(pipeline);
510 auto themeManager = pipeline->GetThemeManager();
511 CHECK_NULL_VOID(themeManager);
512 auto theme = themeManager->GetTheme<TextTheme>();
513 CHECK_NULL_VOID(theme);
514
515 NG::PickerTextStyle textStyle;
516 std::vector<std::string> res;
517 std::string fontValues = std::string(fontInfo);
518 StringUtils::StringSplitter(fontValues, DEFAULT_DELIMITER, res);
519 if (res.size() != NUM_3) {
520 return;
521 }
522 textStyle.fontSize = StringUtils::StringToCalcDimension(res[POS_0], false, DimensionUnit::FP);
523 if (style >= 0 && style < static_cast<int32_t>(FONT_STYLES.size())) {
524 textStyle.fontStyle = FONT_STYLES[style];
525 } else {
526 textStyle.fontStyle = FONT_STYLES[0];
527 }
528 textStyle.fontFamily = Framework::ConvertStrToFontFamilies(res[POS_2]);
529 textStyle.fontWeight = StringUtils::StringToFontWeight(res[POS_1]);
530 textStyle.textColor = Color(color);
531 textStyle.minFontSize = StringUtils::StringToCalcDimension(minFontSize, false, DimensionUnit::FP);
532 textStyle.maxFontSize = StringUtils::StringToCalcDimension(maxFontSize, false, DimensionUnit::FP);
533 if (overflow >= 0 && overflow < static_cast<int32_t>(TEXT_OVERFLOWS.size())) {
534 textStyle.textOverflow = TEXT_OVERFLOWS[overflow];
535 } else {
536 textStyle.textOverflow = TEXT_OVERFLOWS[0];
537 }
538
539 TextPickerModelNG::SetDefaultTextStyle(frameNode, theme, textStyle);
540 }
541
ResetTextPickerDefaultTextStyle(ArkUINodeHandle node)542 void ResetTextPickerDefaultTextStyle(ArkUINodeHandle node)
543 {
544 auto* frameNode = reinterpret_cast<FrameNode*>(node);
545 CHECK_NULL_VOID(frameNode);
546 auto pipeline = frameNode->GetContext();
547 CHECK_NULL_VOID(pipeline);
548 auto themeManager = pipeline->GetThemeManager();
549 CHECK_NULL_VOID(themeManager);
550 auto theme = themeManager->GetTheme<TextTheme>();
551 CHECK_NULL_VOID(theme);
552 NG::PickerTextStyle pickerTextStyle;
553 TextPickerModelNG::SetDefaultTextStyle(frameNode, theme, pickerTextStyle);
554 }
555
GetTextPickerSelectedSize(ArkUINodeHandle node)556 ArkUI_Int32 GetTextPickerSelectedSize(ArkUINodeHandle node)
557 {
558 auto* frameNode = reinterpret_cast<FrameNode*>(node);
559 CHECK_NULL_RETURN(frameNode, 0);
560 if (TextPickerModelNG::IsSingle(frameNode)) {
561 return 1;
562 }
563 return TextPickerModelNG::GetSelectedSize(frameNode);
564 }
565
566 } // namespace
567
568 namespace NodeModifier {
GetTextPickerModifier()569 const ArkUITextPickerModifier* GetTextPickerModifier()
570 {
571 static const ArkUITextPickerModifier modifier = { SetTextPickerBackgroundColor, SetTextPickerCanLoop,
572 GetTextPickerSelectedIndex, SetTextPickerSelectedIndex, GetTextPickerTextStyle, SetTextPickerTextStyle,
573 GetTextPickerSelectedTextStyle, SetTextPickerSelectedTextStyle, GetTextPickerDisappearTextStyle,
574 SetTextPickerDisappearTextStyle, SetTextPickerDefaultPickerItemHeight, ResetTextPickerCanLoop,
575 ResetTextPickerSelectedIndex, ResetTextPickerTextStyle, ResetTextPickerSelectedTextStyle,
576 ResetTextPickerDisappearTextStyle, ResetTextPickerDefaultPickerItemHeight, ResetTextPickerBackgroundColor,
577 GetTextPickerRangeStr, GetTextPickerSingleRange, SetTextPickerRangeStr, GetTextPickerValue, SetTextPickerValue,
578 SetTextPickerDivider, ResetTextPickerDivider, SetTextPickerGradientHeight, ResetTextPickerGradientHeight,
579 GetTextPickerSelectedSize, GetTextPickerCanLoop, GetTextPickerDefaultPickerItemHeight,
580 SetTextPickerDisableTextStyleAnimation, ResetTextPickerDisableTextStyleAnimation, SetTextPickerDefaultTextStyle,
581 ResetTextPickerDefaultTextStyle };
582
583 return &modifier;
584 }
585
GetCJUITextPickerModifier()586 const CJUITextPickerModifier* GetCJUITextPickerModifier()
587 {
588 static const CJUITextPickerModifier modifier = { SetTextPickerBackgroundColor, SetTextPickerCanLoop,
589 GetTextPickerSelectedIndex, SetTextPickerSelectedIndex, GetTextPickerTextStyle, SetTextPickerTextStyle,
590 GetTextPickerSelectedTextStyle, SetTextPickerSelectedTextStyle, GetTextPickerDisappearTextStyle,
591 SetTextPickerDisappearTextStyle, SetTextPickerDefaultPickerItemHeight, ResetTextPickerCanLoop,
592 ResetTextPickerSelectedIndex, ResetTextPickerTextStyle, ResetTextPickerSelectedTextStyle,
593 ResetTextPickerDisappearTextStyle, ResetTextPickerDefaultPickerItemHeight, ResetTextPickerBackgroundColor,
594 GetTextPickerRangeStr, GetTextPickerSingleRange, SetTextPickerRangeStr, GetTextPickerValue, SetTextPickerValue,
595 SetTextPickerDivider, ResetTextPickerDivider, SetTextPickerGradientHeight, ResetTextPickerGradientHeight,
596 GetTextPickerSelectedSize, GetTextPickerCanLoop, GetTextPickerDefaultPickerItemHeight };
597
598 return &modifier;
599 }
600
GetPickerTextStyle(uint32_t color,ArkUI_CharPtr fontInfo,int32_t styleVal,NG::PickerTextStyle & textStyle)601 void GetPickerTextStyle(uint32_t color, ArkUI_CharPtr fontInfo, int32_t styleVal, NG::PickerTextStyle& textStyle)
602 {
603 textStyle.textColor = Color(color);
604
605 std::vector<std::string> res;
606 std::string fontValues = std::string(fontInfo);
607 StringUtils::StringSplitter(fontValues, DEFAULT_DELIMITER, res);
608
609 if (res.size() != SIZE_OF_THREE) {
610 return;
611 }
612
613 if (res[POS_0] != "-1") {
614 textStyle.fontSize = StringUtils::StringToCalcDimension(res[POS_0], false, DimensionUnit::FP);
615 } else {
616 textStyle.fontSize = Dimension(-1);
617 }
618
619 if (res[POS_1] != "-1") {
620 textStyle.fontWeight = StringUtils::StringToFontWeight(res[POS_1], FontWeight::NORMAL);
621 }
622
623 if (res[POS_2] != "-1") {
624 textStyle.fontFamily = Framework::ConvertStrToFontFamilies(res[POS_2]);
625 }
626 textStyle.fontStyle = static_cast<Ace::FontStyle>(styleVal);
627 }
628
SetSelectedIndexSingle(FrameNode * frameNode,uint32_t * selectedValues,const int32_t size)629 void SetSelectedIndexSingle(FrameNode* frameNode, uint32_t* selectedValues, const int32_t size)
630 {
631 std::vector<NG::RangeContent> rangeResult;
632 TextPickerModelNG::GetSingleRange(frameNode, rangeResult);
633 if (selectedValues[0] >= rangeResult.size()) {
634 TextPickerModelNG::SetSelected(frameNode, 0);
635 } else {
636 TextPickerModelNG::SetSelected(frameNode, selectedValues[0]);
637 }
638 }
639
SetSelectedIndexMultiInternal(FrameNode * frameNode,uint32_t count,std::vector<NG::TextCascadePickerOptions> & options,std::vector<uint32_t> & selectedValues)640 void SetSelectedIndexMultiInternal(FrameNode* frameNode, uint32_t count,
641 std::vector<NG::TextCascadePickerOptions>& options, std::vector<uint32_t>& selectedValues)
642 {
643 if (!TextPickerModelNG::IsCascade(frameNode)) {
644 NodeModifier::SetSelectedInternal(count, options, selectedValues);
645 } else {
646 TextPickerModelNG::SetHasSelectAttr(frameNode, true);
647 NodeModifier::ProcessCascadeSelected(options, 0, selectedValues);
648 uint32_t maxCount = TextPickerModelNG::GetMaxCount(frameNode);
649 if (selectedValues.size() < maxCount) {
650 auto differ = maxCount - selectedValues.size();
651 for (uint32_t i = 0; i < differ; i++) {
652 selectedValues.emplace_back(0);
653 }
654 }
655 }
656 }
657
SetSelectedIndexSingleInternal(const std::vector<NG::TextCascadePickerOptions> & options,uint32_t count,uint32_t & selectedValue,std::vector<uint32_t> & selectedValues)658 void SetSelectedIndexSingleInternal(const std::vector<NG::TextCascadePickerOptions>& options, uint32_t count,
659 uint32_t& selectedValue, std::vector<uint32_t>& selectedValues)
660 {
661 if (options.size() > 0) {
662 if (selectedValue >= options[0].rangeResult.size()) {
663 selectedValue = 0;
664 }
665 selectedValues.emplace_back(selectedValue);
666 for (uint32_t i = 1; i < count; i++) {
667 selectedValues.emplace_back(0);
668 }
669 } else {
670 for (uint32_t i = 0; i < count; i++) {
671 selectedValues.emplace_back(0);
672 }
673 }
674 }
675
SetSelectedInternal(uint32_t count,std::vector<NG::TextCascadePickerOptions> & options,std::vector<uint32_t> & selectedValues)676 void SetSelectedInternal(
677 uint32_t count, std::vector<NG::TextCascadePickerOptions>& options, std::vector<uint32_t>& selectedValues)
678 {
679 for (uint32_t i = 0; i < count; i++) {
680 uint32_t val = selectedValues.size() > 0 ? selectedValues.size() - 1 : 0;
681 if (i > val) {
682 selectedValues.emplace_back(0);
683 } else {
684 if (selectedValues[i] >= options[i].rangeResult.size()) {
685 selectedValues[i] = 0;
686 }
687 }
688 }
689 }
690
SetSelectedIndexMulti(FrameNode * frameNode,uint32_t * inputs,const int32_t size)691 void SetSelectedIndexMulti(FrameNode* frameNode, uint32_t* inputs, const int32_t size)
692 {
693 std::vector<NG::TextCascadePickerOptions> options;
694 TextPickerModelNG::GetMultiOptions(frameNode, options);
695
696 auto count = TextPickerModelNG::IsCascade(frameNode) ? TextPickerModelNG::GetMaxCount(frameNode) : options.size();
697 std::vector<uint32_t> selectedValues;
698
699 if (size >= 0) {
700 selectedValues.assign(inputs, inputs + size);
701 SetSelectedIndexMultiInternal(frameNode, count, options, selectedValues);
702 } else {
703 TextPickerModelNG::SetHasSelectAttr(frameNode, true);
704 SetSelectedIndexSingleInternal(options, count, inputs[0], selectedValues);
705 }
706 TextPickerModelNG::SetSelecteds(frameNode, selectedValues);
707 }
708
ProcessCascadeSelected(const std::vector<NG::TextCascadePickerOptions> & options,uint32_t index,std::vector<uint32_t> & selectedValues)709 void ProcessCascadeSelected(
710 const std::vector<NG::TextCascadePickerOptions>& options, uint32_t index, std::vector<uint32_t>& selectedValues)
711 {
712 const size_t size = options.size();
713 if (size == 0) {
714 return;
715 }
716 std::vector<std::string> rangeResultValue;
717 for (size_t i = 0; i < size; i++) {
718 rangeResultValue.emplace_back(options[i].rangeResult[0]);
719 }
720 uint32_t val = selectedValues.size() > 0 ? selectedValues.size() - 1 : 0;
721 if (index > val) {
722 selectedValues.emplace_back(0);
723 }
724 if (selectedValues[index] >= rangeResultValue.size()) {
725 selectedValues[index] = 0;
726 }
727 if ((selectedValues[index] <= size - 1) && (options[selectedValues[index]].children.size() > 0)) {
728 ProcessCascadeSelected(options[selectedValues[index]].children, index + 1, selectedValues);
729 }
730 }
731
SetTextPickerOnChange(ArkUINodeHandle node,void * extraParam)732 void SetTextPickerOnChange(ArkUINodeHandle node, void* extraParam)
733 {
734 auto* frameNode = reinterpret_cast<FrameNode*>(node);
735 CHECK_NULL_VOID(frameNode);
736 auto onChangeEvent = [node, extraParam](
737 const std::vector<std::string>& value, const std::vector<double>& indexVector) {
738 ArkUINodeEvent event;
739 event.kind = COMPONENT_ASYNC_EVENT;
740 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
741 event.componentAsyncEvent.subKind = ON_TEXT_PICKER_CHANGE;
742 for (size_t i = 0; i < indexVector.size() && i < MAX_SIZE; i++) {
743 event.componentAsyncEvent.data[i].i32 = static_cast<int32_t>(indexVector[i]);
744 }
745 SendArkUIAsyncEvent(&event);
746 };
747 TextPickerModelNG::SetOnCascadeChange(frameNode, std::move(onChangeEvent));
748 }
749
SetTextPickerOnScrollStop(ArkUINodeHandle node,void * extraParam)750 void SetTextPickerOnScrollStop(ArkUINodeHandle node, void* extraParam)
751 {
752 auto* frameNode = reinterpret_cast<FrameNode*>(node);
753 CHECK_NULL_VOID(frameNode);
754 auto onScrollStopEvent = [node, extraParam](
755 const std::vector<std::string>& value, const std::vector<double>& indexVector) {
756 ArkUINodeEvent event;
757 event.kind = COMPONENT_ASYNC_EVENT;
758 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
759 event.componentAsyncEvent.subKind = ON_TEXT_PICKER_SCROLL_STOP;
760 for (size_t i = 0; i < indexVector.size() && i < MAX_SIZE; i++) {
761 event.componentAsyncEvent.data[i].i32 = static_cast<int32_t>(indexVector[i]);
762 }
763 SendArkUIAsyncEvent(&event);
764 };
765 TextPickerModelNG::SetOnScrollStop(frameNode, std::move(onScrollStopEvent));
766 }
767 } // namespace NodeModifier
768 } // namespace OHOS::Ace::NG
769