• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
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     CHECK_NULL_VOID(frameNode);
481     auto select = AceType::Claim(frameNode);
482     SetSelectDefaultSize(select);
483     auto pattern = select->GetPattern<SelectPattern>();
484 
485     CHECK_NULL_VOID(pattern);
486     auto* pipeline = frameNode->GetContextWithCheck();
487     CHECK_NULL_VOID(pipeline);
488     if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
489         pattern->SetSelectDefaultTheme();
490 
491         NG::PaddingProperty paddings;
492         paddings.top = std::nullopt;
493         paddings.bottom = std::nullopt;
494         paddings.left = NG::CalcLength(SELECT_MARGIN_VP);
495         paddings.right = NG::CalcLength(SELECT_MARGIN_VP);
496         ViewAbstract::SetPadding(paddings);
497     }
498 
499     pattern->BuildChild();
500     // create menu node
501     if (!pattern->GetMenuNode()) {
502         auto menuWrapper = MenuView::Create(params, select->GetId(), V2::SELECT_ETS_TAG);
503         pattern->SetMenuNode(menuWrapper);
504         pattern->InitSelected();
505     } else {
506         auto menuNode = pattern->GetMenuNode();
507         CHECK_NULL_VOID(menuNode);
508         auto menuPattern = menuNode->GetPattern<MenuPattern>();
509         CHECK_NULL_VOID(menuPattern);
510         menuPattern->UpdateSelectParam(params);
511     }
512     // store option pointers in select
513     auto menuContainer = pattern->GetMenuNode();
514     CHECK_NULL_VOID(menuContainer);
515     pattern->ClearOptions();
516     auto menuPattern = menuContainer->GetPattern<MenuPattern>();
517     CHECK_NULL_VOID(menuPattern);
518     auto options = menuPattern->GetOptions();
519     menuPattern->SetSelectProperties(params);
520     for (auto&& option : options) {
521         pattern->AddOptionNode(option);
522     }
523 
524     // delete menu when select node destroy
525     auto destructor = [id = select->GetId(), frameNode]() {
526         auto* pipeline = frameNode->GetContextWithCheck();
527         CHECK_NULL_VOID(pipeline);
528         auto overlayManager = pipeline->GetOverlayManager();
529         CHECK_NULL_VOID(overlayManager);
530         overlayManager->DeleteMenu(id);
531     };
532     select->PushDestroyCallbackWithTag(destructor, V2::SELECT_ETS_TAG);
533 }
534 
SetArrowPosition(FrameNode * frameNode,const ArrowPosition value)535 void SelectModelNG::SetArrowPosition(FrameNode* frameNode, const ArrowPosition value)
536 {
537     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
538     CHECK_NULL_VOID(pattern);
539     pattern->SetArrowPosition(value);
540 }
541 
SetSpace(FrameNode * frameNode,const Dimension & value)542 void SelectModelNG::SetSpace(FrameNode* frameNode, const Dimension& value)
543 {
544     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
545     CHECK_NULL_VOID(pattern);
546     pattern->SetSpace(value);
547 }
548 
SetMenuAlign(FrameNode * frameNode,const MenuAlign & menuAlign)549 void SelectModelNG::SetMenuAlign(FrameNode* frameNode, const MenuAlign& menuAlign)
550 {
551     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
552     CHECK_NULL_VOID(pattern);
553     pattern->SetMenuAlign(menuAlign);
554 }
555 
SetValue(FrameNode * frameNode,const std::string & value)556 void SelectModelNG::SetValue(FrameNode* frameNode, const std::string& value)
557 {
558     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
559     CHECK_NULL_VOID(pattern);
560     pattern->SetValue(value);
561 }
562 
SetSelected(FrameNode * frameNode,int32_t idx)563 void SelectModelNG::SetSelected(FrameNode* frameNode, int32_t idx)
564 {
565     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
566     CHECK_NULL_VOID(pattern);
567     pattern->SetSelected(idx);
568 }
569 
SetFontSize(FrameNode * frameNode,const Dimension & value)570 void SelectModelNG::SetFontSize(FrameNode* frameNode, const Dimension& value)
571 {
572     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
573     CHECK_NULL_VOID(pattern);
574     pattern->SetFontSize(value);
575 }
576 
SetFontWeight(FrameNode * frameNode,const FontWeight & value)577 void SelectModelNG::SetFontWeight(FrameNode* frameNode, const FontWeight& value)
578 {
579     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
580     CHECK_NULL_VOID(pattern);
581     pattern->SetFontWeight(value);
582 }
583 
SetFontFamily(FrameNode * frameNode,const std::vector<std::string> & value)584 void SelectModelNG::SetFontFamily(FrameNode* frameNode, const std::vector<std::string>& value)
585 {
586     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
587     CHECK_NULL_VOID(pattern);
588     pattern->SetFontFamily(value);
589 }
590 
SetItalicFontStyle(FrameNode * frameNode,const Ace::FontStyle & value)591 void SelectModelNG::SetItalicFontStyle(FrameNode* frameNode, const Ace::FontStyle& value)
592 {
593     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
594     CHECK_NULL_VOID(pattern);
595     pattern->SetItalicFontStyle(value);
596 }
597 
SetFontColor(FrameNode * frameNode,const Color & color)598 void SelectModelNG::SetFontColor(FrameNode* frameNode, const Color& color)
599 {
600     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
601     CHECK_NULL_VOID(pattern);
602     pattern->SetFontColor(color);
603 }
604 
SetSelectedOptionBgColor(FrameNode * frameNode,const Color & color)605 void SelectModelNG::SetSelectedOptionBgColor(FrameNode* frameNode, const Color& color)
606 {
607     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
608     CHECK_NULL_VOID(pattern);
609     pattern->SetSelectedOptionBgColor(color);
610 }
611 
SetOptionFontSize(FrameNode * frameNode,const Dimension & value)612 void SelectModelNG::SetOptionFontSize(FrameNode* frameNode, const Dimension& value)
613 {
614     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
615     CHECK_NULL_VOID(pattern);
616     pattern->SetOptionFontSize(value);
617 }
618 
SetOptionFontWeight(FrameNode * frameNode,const FontWeight & value)619 void SelectModelNG::SetOptionFontWeight(FrameNode* frameNode, const FontWeight& value)
620 {
621     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
622     CHECK_NULL_VOID(pattern);
623     pattern->SetOptionFontWeight(value);
624 }
625 
SetOptionFontFamily(FrameNode * frameNode,const std::vector<std::string> & value)626 void SelectModelNG::SetOptionFontFamily(FrameNode* frameNode, const std::vector<std::string>& value)
627 {
628     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
629     CHECK_NULL_VOID(pattern);
630     pattern->SetOptionFontFamily(value);
631 }
632 
SetOptionItalicFontStyle(FrameNode * frameNode,const Ace::FontStyle & value)633 void SelectModelNG::SetOptionItalicFontStyle(FrameNode* frameNode, const Ace::FontStyle& value)
634 {
635     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
636     CHECK_NULL_VOID(pattern);
637     pattern->SetOptionItalicFontStyle(value);
638 }
639 
SetOptionBgColor(FrameNode * frameNode,const Color & color)640 void SelectModelNG::SetOptionBgColor(FrameNode* frameNode, const Color& color)
641 {
642     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
643     CHECK_NULL_VOID(pattern);
644     pattern->SetOptionBgColor(color);
645 }
646 
SetSelectedOptionFontColor(FrameNode * frameNode,const Color & color)647 void SelectModelNG::SetSelectedOptionFontColor(FrameNode* frameNode, const Color& color)
648 {
649     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
650     CHECK_NULL_VOID(pattern);
651     pattern->SetSelectedOptionFontColor(color);
652 }
653 
SetSelectedOptionFontSize(FrameNode * frameNode,const Dimension & value)654 void SelectModelNG::SetSelectedOptionFontSize(FrameNode* frameNode, const Dimension& value)
655 {
656     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
657     CHECK_NULL_VOID(pattern);
658     pattern->SetSelectedOptionFontSize(value);
659 }
660 
SetSelectedOptionFontWeight(FrameNode * frameNode,const FontWeight & value)661 void SelectModelNG::SetSelectedOptionFontWeight(FrameNode* frameNode, const FontWeight& value)
662 {
663     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
664     CHECK_NULL_VOID(pattern);
665     pattern->SetSelectedOptionFontWeight(value);
666 }
667 
SetSelectedOptionFontFamily(FrameNode * frameNode,const std::vector<std::string> & value)668 void SelectModelNG::SetSelectedOptionFontFamily(FrameNode* frameNode, const std::vector<std::string>& value)
669 {
670     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
671     CHECK_NULL_VOID(pattern);
672     pattern->SetSelectedOptionFontFamily(value);
673 }
674 
SetSelectedOptionItalicFontStyle(FrameNode * frameNode,const Ace::FontStyle & value)675 void SelectModelNG::SetSelectedOptionItalicFontStyle(FrameNode* frameNode, const Ace::FontStyle& value)
676 {
677     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
678     CHECK_NULL_VOID(pattern);
679     pattern->SetSelectedOptionItalicFontStyle(value);
680 }
681 
SetOptionFontColor(FrameNode * frameNode,const Color & color)682 void SelectModelNG::SetOptionFontColor(FrameNode* frameNode, const Color& color)
683 {
684     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
685     CHECK_NULL_VOID(pattern);
686     pattern->SetOptionFontColor(color);
687 }
688 
SetOptionWidth(FrameNode * frameNode,const Dimension & value)689 void SelectModelNG::SetOptionWidth(FrameNode* frameNode, const Dimension& value)
690 {
691     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
692     CHECK_NULL_VOID(pattern);
693     pattern->SetOptionWidth(value);
694 }
695 
SetOptionHeight(FrameNode * frameNode,const Dimension & value)696 void SelectModelNG::SetOptionHeight(FrameNode* frameNode, const Dimension& value)
697 {
698     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
699     CHECK_NULL_VOID(pattern);
700     pattern->SetOptionHeight(value);
701 }
702 
SetOptionWidthFitTrigger(FrameNode * frameNode,bool isFitTrigger)703 void SelectModelNG::SetOptionWidthFitTrigger(FrameNode* frameNode, bool isFitTrigger)
704 {
705     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
706     CHECK_NULL_VOID(pattern);
707     pattern->SetOptionWidthFitTrigger(isFitTrigger);
708 }
709 
SetHasOptionWidth(FrameNode * frameNode,bool hasOptionWidth)710 void SelectModelNG::SetHasOptionWidth(FrameNode* frameNode, bool hasOptionWidth)
711 {
712     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
713     CHECK_NULL_VOID(pattern);
714     pattern->SetHasOptionWidth(hasOptionWidth);
715 }
716 
SetMenuBackgroundColor(const Color & color)717 void SelectModelNG::SetMenuBackgroundColor(const Color& color)
718 {
719     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
720     CHECK_NULL_VOID(pattern);
721     pattern->SetMenuBackgroundColor(color);
722 }
723 
SetMenuBackgroundBlurStyle(const BlurStyleOption & blurStyle)724 void SelectModelNG::SetMenuBackgroundBlurStyle(const BlurStyleOption& blurStyle)
725 {
726     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
727     CHECK_NULL_VOID(pattern);
728     pattern->SetMenuBackgroundBlurStyle(blurStyle);
729 }
730 
ResetBuilderFunc(FrameNode * frameNode)731 void SelectModelNG::ResetBuilderFunc(FrameNode* frameNode)
732 {
733     CHECK_NULL_VOID(frameNode);
734     auto pattern = frameNode->GetPattern<SelectPattern>();
735     CHECK_NULL_VOID(pattern);
736     auto menuNode = pattern->GetMenuNode();
737     CHECK_NULL_VOID(menuNode);
738     auto menuPattern = menuNode->GetPattern<MenuPattern>();
739     CHECK_NULL_VOID(menuPattern);
740     menuPattern->ResetBuilderFunc();
741 }
742 
SetBuilderFunc(FrameNode * frameNode,NG::SelectMakeCallback && makeFunc)743 void SelectModelNG::SetBuilderFunc(FrameNode* frameNode, NG::SelectMakeCallback&& makeFunc)
744 {
745     CHECK_NULL_VOID(frameNode);
746     auto pattern = frameNode->GetPattern<SelectPattern>();
747     CHECK_NULL_VOID(pattern);
748     auto menuNode = pattern->GetMenuNode();
749     CHECK_NULL_VOID(menuNode);
750     auto menuPattern = menuNode->GetPattern<MenuPattern>();
751     CHECK_NULL_VOID(menuPattern);
752     menuPattern->SetBuilderFunc(std::move(makeFunc));
753 }
754 
SetChangeValue(FrameNode * frameNode,int index,const std::string & value)755 void SelectModelNG::SetChangeValue(FrameNode* frameNode, int index, const std::string& value)
756 {
757     CHECK_NULL_VOID(frameNode);
758     auto pattern = frameNode->GetPattern<SelectPattern>();
759     CHECK_NULL_VOID(pattern);
760     pattern->SetItemSelected(index, value);
761 }
762 
SetMenuBackgroundColor(FrameNode * frameNode,const Color & color)763 void SelectModelNG::SetMenuBackgroundColor(FrameNode* frameNode, const Color& color)
764 {
765     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
766     CHECK_NULL_VOID(pattern);
767     pattern->SetMenuBackgroundColor(color);
768 }
769 
SetMenuBackgroundBlurStyle(FrameNode * frameNode,const BlurStyleOption & blurStyle)770 void SelectModelNG::SetMenuBackgroundBlurStyle(FrameNode* frameNode, const BlurStyleOption& blurStyle)
771 {
772     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>(frameNode);
773     CHECK_NULL_VOID(pattern);
774     pattern->SetMenuBackgroundBlurStyle(blurStyle);
775 }
776 
SetOnSelect(FrameNode * frameNode,NG::SelectEvent && onSelect)777 void SelectModelNG::SetOnSelect(FrameNode* frameNode, NG::SelectEvent&& onSelect)
778 {
779     CHECK_NULL_VOID(frameNode);
780     auto hub = frameNode->GetEventHub<SelectEventHub>();
781     CHECK_NULL_VOID(hub);
782     hub->SetSelectEvent(std::move(onSelect));
783 }
784 
SetLayoutDirection(TextDirection value)785 void SelectModelNG::SetLayoutDirection(TextDirection value)
786 {
787     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SelectPattern>();
788     CHECK_NULL_VOID(pattern);
789     pattern->SetLayoutDirection(value);
790 }
791 } // namespace OHOS::Ace::NG
792