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