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
16 #include "core/components_ng/pattern/select/select_model_ng.h"
17
18 #include "base/memory/referenced.h"
19 #include "base/utils/utils.h"
20 #include "core/components_ng/base/view_stack_processor.h"
21 #include "core/components_ng/pattern/menu/menu_pattern.h"
22 #include "core/components_ng/pattern/menu/menu_view.h"
23 #include "core/components_ng/pattern/select/select_pattern.h"
24 #include "core/components_ng/pattern/select/select_properties.h"
25 #include "core/components_ng/property/calc_length.h"
26 #include "core/components_v2/inspector/inspector_constants.h"
27 #include "core/pipeline_ng/pipeline_context.h"
28
29 namespace OHOS::Ace::NG {
30 namespace {
SetSelectDefaultSize(const RefPtr<FrameNode> & select)31 void SetSelectDefaultSize(const RefPtr<FrameNode>& select)
32 {
33 auto* pipeline = select->GetContextWithCheck();
34 CHECK_NULL_VOID(pipeline);
35 auto theme = pipeline->GetTheme<SelectTheme>();
36 CHECK_NULL_VOID(theme);
37
38 auto layoutProperty = select->GetLayoutProperty();
39 CHECK_NULL_VOID(layoutProperty);
40 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
41 layoutProperty->UpdateCalcMinSize(CalcSize(CalcLength(theme->GetSelectMinWidth()), std::nullopt));
42 } else {
43 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
44 CHECK_NULL_VOID(pattern);
45 layoutProperty->UpdateCalcMinSize(CalcSize(CalcLength(theme->GetSelectMinWidth(pattern->GetControlSize())),
46 CalcLength(theme->GetSelectDefaultHeight(pattern->GetControlSize()))));
47 }
48 }
49
50 static constexpr Dimension SELECT_MARGIN_VP = 8.0_vp;
51 } // namespace
52
Create(const std::vector<SelectParam> & params)53 void SelectModelNG::Create(const std::vector<SelectParam>& params)
54 {
55 auto* stack = ViewStackProcessor::GetInstance();
56 int32_t nodeId = (stack == nullptr ? 0 : stack->ClaimNodeId());
57 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::SELECT_ETS_TAG, nodeId);
58 auto select = FrameNode::GetOrCreateFrameNode(
59 V2::SELECT_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<SelectPattern>(); });
60 ViewStackProcessor::GetInstance()->Push(select);
61
62 InitSelect(AceType::RawPtr(select), params);
63 }
64
SetSelected(int32_t idx)65 void SelectModelNG::SetSelected(int32_t idx)
66 {
67 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
68 CHECK_NULL_VOID(pattern);
69 pattern->SetSelected(idx);
70 }
71
SetValue(const std::string & value)72 void SelectModelNG::SetValue(const std::string& value)
73 {
74 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
75 CHECK_NULL_VOID(pattern);
76 pattern->SetValue(value);
77 }
78
SetFontSize(const Dimension & value)79 void SelectModelNG::SetFontSize(const Dimension& value)
80 {
81 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
82 CHECK_NULL_VOID(pattern);
83 pattern->SetFontSize(value);
84 }
85
SetFontWeight(const FontWeight & value)86 void SelectModelNG::SetFontWeight(const FontWeight& value)
87 {
88 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
89 CHECK_NULL_VOID(pattern);
90 pattern->SetFontWeight(value);
91 }
92
SetFontFamily(const std::vector<std::string> & value)93 void SelectModelNG::SetFontFamily(const std::vector<std::string>& value)
94 {
95 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
96 CHECK_NULL_VOID(pattern);
97 pattern->SetFontFamily(value);
98 }
99
SetItalicFontStyle(const Ace::FontStyle & value)100 void SelectModelNG::SetItalicFontStyle(const Ace::FontStyle& value)
101 {
102 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
103 CHECK_NULL_VOID(pattern);
104 pattern->SetItalicFontStyle(value);
105 }
106
SetFontColor(const Color & color)107 void SelectModelNG::SetFontColor(const Color& color)
108 {
109 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
110 CHECK_NULL_VOID(pattern);
111 pattern->SetFontColor(color);
112 }
113
SetSelectedOptionBgColor(const Color & color)114 void SelectModelNG::SetSelectedOptionBgColor(const Color& color)
115 {
116 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
117 CHECK_NULL_VOID(pattern);
118 pattern->SetSelectedOptionBgColor(color);
119 }
120
SetSelectedOptionFontSize(const Dimension & value)121 void SelectModelNG::SetSelectedOptionFontSize(const Dimension& value)
122 {
123 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
124 CHECK_NULL_VOID(pattern);
125 pattern->SetSelectedOptionFontSize(value);
126 }
127
SetSelectedOptionFontWeight(const FontWeight & value)128 void SelectModelNG::SetSelectedOptionFontWeight(const FontWeight& value)
129 {
130 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
131 CHECK_NULL_VOID(pattern);
132 pattern->SetSelectedOptionFontWeight(value);
133 }
134
SetSelectedOptionFontFamily(const std::vector<std::string> & value)135 void SelectModelNG::SetSelectedOptionFontFamily(const std::vector<std::string>& value)
136 {
137 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
138 CHECK_NULL_VOID(pattern);
139 pattern->SetSelectedOptionFontFamily(value);
140 }
141
SetSelectedOptionItalicFontStyle(const Ace::FontStyle & value)142 void SelectModelNG::SetSelectedOptionItalicFontStyle(const Ace::FontStyle& value)
143 {
144 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
145 CHECK_NULL_VOID(pattern);
146 pattern->SetSelectedOptionItalicFontStyle(value);
147 }
148
SetSelectedOptionFontColor(const Color & color)149 void SelectModelNG::SetSelectedOptionFontColor(const Color& color)
150 {
151 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
152 CHECK_NULL_VOID(pattern);
153 pattern->SetSelectedOptionFontColor(color);
154 }
155
SetOptionBgColor(const Color & color)156 void SelectModelNG::SetOptionBgColor(const Color& color)
157 {
158 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
159 CHECK_NULL_VOID(pattern);
160 pattern->SetOptionBgColor(color);
161 }
162
SetOptionFontSize(const Dimension & value)163 void SelectModelNG::SetOptionFontSize(const Dimension& value)
164 {
165 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
166 CHECK_NULL_VOID(pattern);
167 pattern->SetOptionFontSize(value);
168 }
169
SetOptionFontWeight(const FontWeight & value)170 void SelectModelNG::SetOptionFontWeight(const FontWeight& value)
171 {
172 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
173 CHECK_NULL_VOID(pattern);
174 pattern->SetOptionFontWeight(value);
175 }
176
SetOptionFontFamily(const std::vector<std::string> & value)177 void SelectModelNG::SetOptionFontFamily(const std::vector<std::string>& value)
178 {
179 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
180 CHECK_NULL_VOID(pattern);
181 pattern->SetOptionFontFamily(value);
182 }
183
SetOptionItalicFontStyle(const Ace::FontStyle & value)184 void SelectModelNG::SetOptionItalicFontStyle(const Ace::FontStyle& value)
185 {
186 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
187 CHECK_NULL_VOID(pattern);
188 pattern->SetOptionItalicFontStyle(value);
189 }
190
SetOptionFontColor(const Color & color)191 void SelectModelNG::SetOptionFontColor(const Color& color)
192 {
193 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
194 CHECK_NULL_VOID(pattern);
195 pattern->SetOptionFontColor(color);
196 }
197
SetOnSelect(NG::SelectEvent && onSelect)198 void SelectModelNG::SetOnSelect(NG::SelectEvent&& onSelect)
199 {
200 auto hub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<SelectEventHub>();
201 CHECK_NULL_VOID(hub);
202 hub->SetSelectEvent(std::move(onSelect));
203 }
204
SetWidth(Dimension & value)205 void SelectModelNG::SetWidth(Dimension& value)
206 {
207 if (LessNotEqual(value.Value(), 0.0)) {
208 value.SetValue(0.0);
209 }
210 ViewAbstract::SetWidth(NG::CalcLength(value));
211 }
212
SetHeight(Dimension & value)213 void SelectModelNG::SetHeight(Dimension& value)
214 {
215 if (LessNotEqual(value.Value(), 0.0)) {
216 value.SetValue(0.0);
217 }
218 ViewAbstract::SetHeight(NG::CalcLength(value));
219 }
220
SetSize(Dimension & width,Dimension & height)221 void SelectModelNG::SetSize(Dimension& width, Dimension& height)
222 {
223 if (LessNotEqual(width.Value(), 0.0)) {
224 width.SetValue(0.0);
225 }
226
227 if (LessNotEqual(height.Value(), 0.0)) {
228 height.SetValue(0.0);
229 }
230 ViewAbstract::SetWidth(NG::CalcLength(width));
231 ViewAbstract::SetHeight(NG::CalcLength(height));
232 }
233
SetPaddings(const std::optional<CalcDimension> & top,const std::optional<CalcDimension> & bottom,const std::optional<CalcDimension> & left,const std::optional<CalcDimension> & right)234 void SelectModelNG::SetPaddings(const std::optional<CalcDimension>& top, const std::optional<CalcDimension>& bottom,
235 const std::optional<CalcDimension>& left, const std::optional<CalcDimension>& right)
236 {
237 NG::PaddingProperty paddings;
238 if (top.has_value()) {
239 if (top.value().Unit() == DimensionUnit::CALC) {
240 paddings.top =
241 NG::CalcLength(top.value().IsNonNegative() ? top.value().CalcValue() : CalcDimension().CalcValue());
242 } else {
243 paddings.top = NG::CalcLength(top.value().IsNonNegative() ? top.value() : CalcDimension());
244 }
245 }
246 if (bottom.has_value()) {
247 if (bottom.value().Unit() == DimensionUnit::CALC) {
248 paddings.bottom = NG::CalcLength(
249 bottom.value().IsNonNegative() ? bottom.value().CalcValue() : CalcDimension().CalcValue());
250 } else {
251 paddings.bottom = NG::CalcLength(bottom.value().IsNonNegative() ? bottom.value() : CalcDimension());
252 }
253 }
254 if (left.has_value()) {
255 if (left.value().Unit() == DimensionUnit::CALC) {
256 paddings.left = NG::CalcLength(
257 left.value().IsNonNegative() ? left.value().CalcValue() : CalcDimension().CalcValue());
258 } else {
259 paddings.left = NG::CalcLength(left.value().IsNonNegative() ? left.value() : CalcDimension());
260 }
261 }
262 if (right.has_value()) {
263 if (right.value().Unit() == DimensionUnit::CALC) {
264 paddings.right = NG::CalcLength(
265 right.value().IsNonNegative() ? right.value().CalcValue() : CalcDimension().CalcValue());
266 } else {
267 paddings.right = NG::CalcLength(right.value().IsNonNegative() ? right.value() : CalcDimension());
268 }
269 }
270 ViewAbstract::SetPadding(paddings);
271 }
272
SetPadding(const CalcDimension & value)273 void SelectModelNG::SetPadding(const CalcDimension& value)
274 {
275 if (value.Unit() == DimensionUnit::CALC) {
276 // padding must great or equal zero.
277 ViewAbstract::SetPadding(
278 NG::CalcLength(value.IsNonNegative() ? value.CalcValue() : CalcDimension().CalcValue()));
279 } else {
280 // padding must great or equal zero.
281 ViewAbstract::SetPadding(NG::CalcLength(value.IsNonNegative() ? value : CalcDimension()));
282 }
283 }
284
SetPaddingLeft(const CalcDimension & leftValue)285 void SelectModelNG::SetPaddingLeft(const CalcDimension& leftValue)
286 {
287 NG::PaddingProperty paddings;
288 paddings.top = std::nullopt;
289 paddings.bottom = std::nullopt;
290
291 if (!NearEqual(leftValue.Value(), 0.0)) {
292 if (leftValue.Unit() == DimensionUnit::CALC) {
293 paddings.left = NG::CalcLength(
294 leftValue.IsNonNegative() ? leftValue.CalcValue() : CalcDimension().CalcValue());
295 } else {
296 paddings.left = NG::CalcLength(leftValue.IsNonNegative() ? leftValue : CalcDimension());
297 }
298 }
299 paddings.right = std::nullopt;
300 ViewAbstract::SetPadding(paddings);
301 }
302
SetPaddingTop(const CalcDimension & topValue)303 void SelectModelNG::SetPaddingTop(const CalcDimension& topValue)
304 {
305 NG::PaddingProperty paddings;
306 if (!NearEqual(topValue.Value(), 0.0)) {
307 if (topValue.Unit() == DimensionUnit::CALC) {
308 paddings.top = NG::CalcLength(
309 topValue.IsNonNegative() ? topValue.CalcValue() : CalcDimension().CalcValue());
310 } else {
311 paddings.top = NG::CalcLength(topValue.IsNonNegative() ? topValue : CalcDimension());
312 }
313 }
314 paddings.bottom = std::nullopt;
315 paddings.left = std::nullopt;
316 paddings.right = std::nullopt;
317 ViewAbstract::SetPadding(paddings);
318 }
319
SetPaddingRight(const CalcDimension & rightValue)320 void SelectModelNG::SetPaddingRight(const CalcDimension& rightValue)
321 {
322 NG::PaddingProperty paddings;
323 paddings.top = std::nullopt;
324 paddings.bottom = std::nullopt;
325 paddings.left = std::nullopt;
326 if (!NearEqual(rightValue.Value(), 0.0)) {
327 if (rightValue.Unit() == DimensionUnit::CALC) {
328 paddings.right = NG::CalcLength(
329 rightValue.IsNonNegative() ? rightValue.CalcValue() : CalcDimension().CalcValue());
330 } else {
331 paddings.right = NG::CalcLength(rightValue.IsNonNegative() ? rightValue : CalcDimension());
332 }
333 }
334 ViewAbstract::SetPadding(paddings);
335 }
336
SetPaddingBottom(const CalcDimension & buttomValue)337 void SelectModelNG::SetPaddingBottom(const CalcDimension& buttomValue)
338 {
339 NG::PaddingProperty paddings;
340 paddings.top = std::nullopt;
341 if (!NearEqual(buttomValue.Value(), 0.0)) {
342 if (buttomValue.Unit() == DimensionUnit::CALC) {
343 paddings.bottom = NG::CalcLength(
344 buttomValue.IsNonNegative() ? buttomValue.CalcValue() : CalcDimension().CalcValue());
345 } else {
346 paddings.bottom = NG::CalcLength(
347 buttomValue.IsNonNegative() ? buttomValue : CalcDimension());
348 }
349 }
350 paddings.left = std::nullopt;
351 paddings.right = std::nullopt;
352 ViewAbstract::SetPadding(paddings);
353 }
354
SetSpace(const Dimension & value)355 void SelectModelNG::SetSpace(const Dimension& value)
356 {
357 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
358 CHECK_NULL_VOID(pattern);
359 pattern->SetSpace(value);
360 }
361
SetArrowPosition(const ArrowPosition value)362 void SelectModelNG::SetArrowPosition(const ArrowPosition value)
363 {
364 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
365 CHECK_NULL_VOID(pattern);
366 pattern->SetArrowPosition(value);
367 }
368
SetMenuAlign(const MenuAlign & menuAlign)369 void SelectModelNG::SetMenuAlign(const MenuAlign& menuAlign)
370 {
371 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
372 CHECK_NULL_VOID(pattern);
373 pattern->SetMenuAlign(menuAlign);
374 }
375
SetSelectChangeEvent(NG::SelectChangeEvent && selectChangeEvent)376 void SelectModelNG::SetSelectChangeEvent(NG::SelectChangeEvent&& selectChangeEvent)
377 {
378 auto hub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<SelectEventHub>();
379 CHECK_NULL_VOID(hub);
380 hub->SetSelectChangeEvent(std::move(selectChangeEvent));
381 }
382
SetValueChangeEvent(NG::ValueChangeEvent && valueChangeEvent)383 void SelectModelNG::SetValueChangeEvent(NG::ValueChangeEvent&& valueChangeEvent)
384 {
385 auto hub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<SelectEventHub>();
386 CHECK_NULL_VOID(hub);
387 hub->SetValueChangeEvent(std::move(valueChangeEvent));
388 }
389
SetOptionWidth(const Dimension & value)390 void SelectModelNG::SetOptionWidth(const Dimension& value)
391 {
392 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
393 CHECK_NULL_VOID(pattern);
394 pattern->SetOptionWidth(value);
395 }
396
SetOptionHeight(const Dimension & value)397 void SelectModelNG::SetOptionHeight(const Dimension& value)
398 {
399 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
400 CHECK_NULL_VOID(pattern);
401 pattern->SetOptionHeight(value);
402 }
403
SetOptionWidthFitTrigger(bool isFitTrigger)404 void SelectModelNG::SetOptionWidthFitTrigger(bool isFitTrigger)
405 {
406 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
407 CHECK_NULL_VOID(pattern);
408 pattern->SetOptionWidthFitTrigger(isFitTrigger);
409 }
410
SetHasOptionWidth(bool hasOptionWidth)411 void SelectModelNG::SetHasOptionWidth(bool hasOptionWidth)
412 {
413 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
414 CHECK_NULL_VOID(pattern);
415 pattern->SetHasOptionWidth(hasOptionWidth);
416 }
417
SetControlSize(const std::optional<ControlSize> & controlSize)418 void SelectModelNG::SetControlSize(const std::optional<ControlSize>& controlSize)
419 {
420 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
421 return;
422 }
423 if (controlSize.has_value()) {
424 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
425 CHECK_NULL_VOID(pattern);
426 pattern->SetControlSize(controlSize.value());
427 }
428 }
429
SetDivider(const NG::SelectDivider & divider)430 void SelectModelNG::SetDivider(const NG::SelectDivider& divider)
431 {
432 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
433 CHECK_NULL_VOID(pattern);
434 pattern->SetDivider(divider);
435 }
436
SetDivider(FrameNode * frameNode,const NG::SelectDivider & divider)437 void SelectModelNG::SetDivider(FrameNode* frameNode, const NG::SelectDivider& divider)
438 {
439 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
440 CHECK_NULL_VOID(pattern);
441 pattern->SetDivider(divider);
442 }
443
SetControlSize(FrameNode * frameNode,const std::optional<ControlSize> & controlSize)444 void SelectModelNG::SetControlSize(FrameNode* frameNode, const std::optional<ControlSize>& controlSize)
445 {
446 if (controlSize.has_value()) {
447 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
448 CHECK_NULL_VOID(pattern);
449 pattern->SetControlSize(controlSize.value());
450 }
451 }
452
GetControlSize()453 ControlSize SelectModelNG::GetControlSize()
454 {
455 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
456 return ControlSize::NORMAL;
457 }
458 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
459 CHECK_NULL_RETURN(pattern, ControlSize::NORMAL);
460 return pattern->GetControlSize();
461 }
462
GetControlSize(FrameNode * frameNode)463 ControlSize SelectModelNG::GetControlSize(FrameNode* frameNode)
464 {
465 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
466 CHECK_NULL_RETURN(pattern, ControlSize::NORMAL);
467 return pattern->GetControlSize();
468 }
469
CreateFrameNode(int32_t nodeId)470 RefPtr<FrameNode> SelectModelNG::CreateFrameNode(int32_t nodeId)
471 {
472 auto frameNode = FrameNode::GetOrCreateFrameNode(
473 V2::SELECT_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<SelectPattern>(); });
474
475 return frameNode;
476 }
477
InitSelect(FrameNode * frameNode,const std::vector<SelectParam> & params)478 void SelectModelNG::InitSelect(FrameNode* frameNode, const std::vector<SelectParam>& params)
479 {
480 auto select = AceType::Claim(frameNode);
481 SetSelectDefaultSize(select);
482 auto pattern = select->GetPattern<SelectPattern>();
483
484 CHECK_NULL_VOID(pattern);
485 auto* pipeline = frameNode->GetContextWithCheck();
486 CHECK_NULL_VOID(pipeline);
487 if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
488 pattern->SetSelectDefaultTheme();
489
490 NG::PaddingProperty paddings;
491 paddings.top = std::nullopt;
492 paddings.bottom = std::nullopt;
493 paddings.left = NG::CalcLength(SELECT_MARGIN_VP);
494 paddings.right = NG::CalcLength(SELECT_MARGIN_VP);
495 ViewAbstract::SetPadding(paddings);
496 }
497
498 pattern->BuildChild();
499 // create menu node
500 if (!pattern->GetMenuNode()) {
501 auto menuWrapper = MenuView::Create(params, select->GetId(), V2::SELECT_ETS_TAG);
502 pattern->SetMenuNode(menuWrapper);
503 pattern->InitSelected();
504 } else {
505 auto menuNode = pattern->GetMenuNode();
506 CHECK_NULL_VOID(menuNode);
507 auto menuPattern = menuNode->GetPattern<MenuPattern>();
508 CHECK_NULL_VOID(menuPattern);
509 menuPattern->UpdateSelectParam(params);
510 }
511 // store option pointers in select
512 auto menuContainer = pattern->GetMenuNode();
513 CHECK_NULL_VOID(menuContainer);
514 pattern->ClearOptions();
515 auto menuPattern = menuContainer->GetPattern<MenuPattern>();
516 CHECK_NULL_VOID(menuPattern);
517 auto options = menuPattern->GetOptions();
518 menuPattern->SetSelectProperties(params);
519 for (auto&& option : options) {
520 pattern->AddOptionNode(option);
521 }
522
523 // delete menu when select node destroy
524 auto destructor = [id = select->GetId(), frameNode]() {
525 auto* pipeline = frameNode->GetContextWithCheck();
526 CHECK_NULL_VOID(pipeline);
527 auto overlayManager = pipeline->GetOverlayManager();
528 CHECK_NULL_VOID(overlayManager);
529 overlayManager->DeleteMenu(id);
530 };
531 select->PushDestroyCallbackWithTag(destructor, V2::SELECT_ETS_TAG);
532 }
533
SetArrowPosition(FrameNode * frameNode,const ArrowPosition value)534 void SelectModelNG::SetArrowPosition(FrameNode* frameNode, const ArrowPosition value)
535 {
536 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
537 CHECK_NULL_VOID(pattern);
538 pattern->SetArrowPosition(value);
539 }
540
SetSpace(FrameNode * frameNode,const Dimension & value)541 void SelectModelNG::SetSpace(FrameNode* frameNode, const Dimension& value)
542 {
543 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
544 CHECK_NULL_VOID(pattern);
545 pattern->SetSpace(value);
546 }
547
SetMenuAlign(FrameNode * frameNode,const MenuAlign & menuAlign)548 void SelectModelNG::SetMenuAlign(FrameNode* frameNode, const MenuAlign& menuAlign)
549 {
550 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
551 CHECK_NULL_VOID(pattern);
552 pattern->SetMenuAlign(menuAlign);
553 }
554
SetValue(FrameNode * frameNode,const std::string & value)555 void SelectModelNG::SetValue(FrameNode* frameNode, const std::string& value)
556 {
557 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
558 CHECK_NULL_VOID(pattern);
559 pattern->SetValue(value);
560 }
561
SetSelected(FrameNode * frameNode,int32_t idx)562 void SelectModelNG::SetSelected(FrameNode* frameNode, int32_t idx)
563 {
564 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
565 CHECK_NULL_VOID(pattern);
566 pattern->SetSelected(idx);
567 }
568
SetFontSize(FrameNode * frameNode,const Dimension & value)569 void SelectModelNG::SetFontSize(FrameNode* frameNode, const Dimension& value)
570 {
571 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
572 CHECK_NULL_VOID(pattern);
573 pattern->SetFontSize(value);
574 }
575
SetFontWeight(FrameNode * frameNode,const FontWeight & value)576 void SelectModelNG::SetFontWeight(FrameNode* frameNode, const FontWeight& value)
577 {
578 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
579 CHECK_NULL_VOID(pattern);
580 pattern->SetFontWeight(value);
581 }
582
SetFontFamily(FrameNode * frameNode,const std::vector<std::string> & value)583 void SelectModelNG::SetFontFamily(FrameNode* frameNode, const std::vector<std::string>& value)
584 {
585 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
586 CHECK_NULL_VOID(pattern);
587 pattern->SetFontFamily(value);
588 }
589
SetItalicFontStyle(FrameNode * frameNode,const Ace::FontStyle & value)590 void SelectModelNG::SetItalicFontStyle(FrameNode* frameNode, const Ace::FontStyle& value)
591 {
592 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
593 CHECK_NULL_VOID(pattern);
594 pattern->SetItalicFontStyle(value);
595 }
596
SetFontColor(FrameNode * frameNode,const Color & color)597 void SelectModelNG::SetFontColor(FrameNode* frameNode, const Color& color)
598 {
599 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
600 CHECK_NULL_VOID(pattern);
601 pattern->SetFontColor(color);
602 }
603
SetSelectedOptionBgColor(FrameNode * frameNode,const Color & color)604 void SelectModelNG::SetSelectedOptionBgColor(FrameNode* frameNode, const Color& color)
605 {
606 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
607 CHECK_NULL_VOID(pattern);
608 pattern->SetSelectedOptionBgColor(color);
609 }
610
SetOptionFontSize(FrameNode * frameNode,const Dimension & value)611 void SelectModelNG::SetOptionFontSize(FrameNode* frameNode, const Dimension& value)
612 {
613 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
614 CHECK_NULL_VOID(pattern);
615 pattern->SetOptionFontSize(value);
616 }
617
SetOptionFontWeight(FrameNode * frameNode,const FontWeight & value)618 void SelectModelNG::SetOptionFontWeight(FrameNode* frameNode, const FontWeight& value)
619 {
620 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
621 CHECK_NULL_VOID(pattern);
622 pattern->SetOptionFontWeight(value);
623 }
624
SetOptionFontFamily(FrameNode * frameNode,const std::vector<std::string> & value)625 void SelectModelNG::SetOptionFontFamily(FrameNode* frameNode, const std::vector<std::string>& value)
626 {
627 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
628 CHECK_NULL_VOID(pattern);
629 pattern->SetOptionFontFamily(value);
630 }
631
SetOptionItalicFontStyle(FrameNode * frameNode,const Ace::FontStyle & value)632 void SelectModelNG::SetOptionItalicFontStyle(FrameNode* frameNode, const Ace::FontStyle& value)
633 {
634 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
635 CHECK_NULL_VOID(pattern);
636 pattern->SetOptionItalicFontStyle(value);
637 }
638
SetOptionBgColor(FrameNode * frameNode,const Color & color)639 void SelectModelNG::SetOptionBgColor(FrameNode* frameNode, const Color& color)
640 {
641 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
642 CHECK_NULL_VOID(pattern);
643 pattern->SetOptionBgColor(color);
644 }
645
SetSelectedOptionFontColor(FrameNode * frameNode,const Color & color)646 void SelectModelNG::SetSelectedOptionFontColor(FrameNode* frameNode, const Color& color)
647 {
648 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
649 CHECK_NULL_VOID(pattern);
650 pattern->SetSelectedOptionFontColor(color);
651 }
652
SetSelectedOptionFontSize(FrameNode * frameNode,const Dimension & value)653 void SelectModelNG::SetSelectedOptionFontSize(FrameNode* frameNode, const Dimension& value)
654 {
655 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
656 CHECK_NULL_VOID(pattern);
657 pattern->SetSelectedOptionFontSize(value);
658 }
659
SetSelectedOptionFontWeight(FrameNode * frameNode,const FontWeight & value)660 void SelectModelNG::SetSelectedOptionFontWeight(FrameNode* frameNode, const FontWeight& value)
661 {
662 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
663 CHECK_NULL_VOID(pattern);
664 pattern->SetSelectedOptionFontWeight(value);
665 }
666
SetSelectedOptionFontFamily(FrameNode * frameNode,const std::vector<std::string> & value)667 void SelectModelNG::SetSelectedOptionFontFamily(FrameNode* frameNode, const std::vector<std::string>& value)
668 {
669 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
670 CHECK_NULL_VOID(pattern);
671 pattern->SetSelectedOptionFontFamily(value);
672 }
673
SetSelectedOptionItalicFontStyle(FrameNode * frameNode,const Ace::FontStyle & value)674 void SelectModelNG::SetSelectedOptionItalicFontStyle(FrameNode* frameNode, const Ace::FontStyle& value)
675 {
676 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
677 CHECK_NULL_VOID(pattern);
678 pattern->SetSelectedOptionItalicFontStyle(value);
679 }
680
SetOptionFontColor(FrameNode * frameNode,const Color & color)681 void SelectModelNG::SetOptionFontColor(FrameNode* frameNode, const Color& color)
682 {
683 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
684 CHECK_NULL_VOID(pattern);
685 pattern->SetOptionFontColor(color);
686 }
687
SetOptionWidth(FrameNode * frameNode,const Dimension & value)688 void SelectModelNG::SetOptionWidth(FrameNode* frameNode, const Dimension& value)
689 {
690 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
691 CHECK_NULL_VOID(pattern);
692 pattern->SetOptionWidth(value);
693 }
694
SetOptionHeight(FrameNode * frameNode,const Dimension & value)695 void SelectModelNG::SetOptionHeight(FrameNode* frameNode, const Dimension& value)
696 {
697 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
698 CHECK_NULL_VOID(pattern);
699 pattern->SetOptionHeight(value);
700 }
701
SetOptionWidthFitTrigger(FrameNode * frameNode,bool isFitTrigger)702 void SelectModelNG::SetOptionWidthFitTrigger(FrameNode* frameNode, bool isFitTrigger)
703 {
704 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
705 CHECK_NULL_VOID(pattern);
706 pattern->SetOptionWidthFitTrigger(isFitTrigger);
707 }
708
SetHasOptionWidth(FrameNode * frameNode,bool hasOptionWidth)709 void SelectModelNG::SetHasOptionWidth(FrameNode* frameNode, bool hasOptionWidth)
710 {
711 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
712 CHECK_NULL_VOID(pattern);
713 pattern->SetHasOptionWidth(hasOptionWidth);
714 }
715
SetMenuBackgroundColor(const Color & color)716 void SelectModelNG::SetMenuBackgroundColor(const Color& color)
717 {
718 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
719 CHECK_NULL_VOID(pattern);
720 pattern->SetMenuBackgroundColor(color);
721 }
722
SetMenuBackgroundBlurStyle(const BlurStyleOption & blurStyle)723 void SelectModelNG::SetMenuBackgroundBlurStyle(const BlurStyleOption& blurStyle)
724 {
725 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
726 CHECK_NULL_VOID(pattern);
727 pattern->SetMenuBackgroundBlurStyle(blurStyle);
728 }
729
ResetBuilderFunc(FrameNode * frameNode)730 void SelectModelNG::ResetBuilderFunc(FrameNode* frameNode)
731 {
732 CHECK_NULL_VOID(frameNode);
733 auto pattern = frameNode->GetPattern<SelectPattern>();
734 CHECK_NULL_VOID(pattern);
735 auto menuNode = pattern->GetMenuNode();
736 CHECK_NULL_VOID(menuNode);
737 auto menuPattern = menuNode->GetPattern<MenuPattern>();
738 CHECK_NULL_VOID(menuPattern);
739 menuPattern->ResetBuilderFunc();
740 }
741
SetBuilderFunc(FrameNode * frameNode,NG::SelectMakeCallback && makeFunc)742 void SelectModelNG::SetBuilderFunc(FrameNode* frameNode, NG::SelectMakeCallback&& makeFunc)
743 {
744 CHECK_NULL_VOID(frameNode);
745 auto pattern = frameNode->GetPattern<SelectPattern>();
746 CHECK_NULL_VOID(pattern);
747 auto menuNode = pattern->GetMenuNode();
748 CHECK_NULL_VOID(menuNode);
749 auto menuPattern = menuNode->GetPattern<MenuPattern>();
750 CHECK_NULL_VOID(menuPattern);
751 menuPattern->SetBuilderFunc(std::move(makeFunc));
752 }
753
SetChangeValue(FrameNode * frameNode,int index,const std::string & value)754 void SelectModelNG::SetChangeValue(FrameNode* frameNode, int index, const std::string& value)
755 {
756 CHECK_NULL_VOID(frameNode);
757 auto pattern = frameNode->GetPattern<SelectPattern>();
758 CHECK_NULL_VOID(pattern);
759 pattern->SetItemSelected(index, value);
760 }
761
SetMenuBackgroundColor(FrameNode * frameNode,const Color & color)762 void SelectModelNG::SetMenuBackgroundColor(FrameNode* frameNode, const Color& color)
763 {
764 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
765 CHECK_NULL_VOID(pattern);
766 pattern->SetMenuBackgroundColor(color);
767 }
768
SetMenuBackgroundBlurStyle(FrameNode * frameNode,const BlurStyleOption & blurStyle)769 void SelectModelNG::SetMenuBackgroundBlurStyle(FrameNode* frameNode, const BlurStyleOption& blurStyle)
770 {
771 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
772 CHECK_NULL_VOID(pattern);
773 pattern->SetMenuBackgroundBlurStyle(blurStyle);
774 }
775
SetOnSelect(FrameNode * frameNode,NG::SelectEvent && onSelect)776 void SelectModelNG::SetOnSelect(FrameNode* frameNode, NG::SelectEvent&& onSelect)
777 {
778 CHECK_NULL_VOID(frameNode);
779 auto hub = frameNode->GetEventHub<SelectEventHub>();
780 CHECK_NULL_VOID(hub);
781 hub->SetSelectEvent(std::move(onSelect));
782 }
783
SetLayoutDirection(TextDirection value)784 void SelectModelNG::SetLayoutDirection(TextDirection value)
785 {
786 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
787 CHECK_NULL_VOID(pattern);
788 pattern->SetLayoutDirection(value);
789 }
790 } // namespace OHOS::Ace::NG
791