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