1 /*
2 * Copyright (c) 2022-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/toggle/toggle_model_ng.h"
17
18 #include "core/components/toggle/toggle_theme.h"
19 #include "core/components_ng/base/view_abstract_model.h"
20 #include "core/components_ng/pattern/button/toggle_button_model_ng.h"
21 #include "core/components_ng/pattern/button/toggle_button_pattern.h"
22 #include "core/components_ng/pattern/checkbox/checkbox_model_ng.h"
23 #include "core/components_ng/pattern/checkbox/toggle_checkbox_pattern.h"
24 #include "core/components_ng/pattern/toggle/switch_pattern.h"
25
26 namespace OHOS::Ace::NG {
27
28 constexpr uint32_t DEFAULT_COLOR = 0xffffffff;
29
Create(NG::ToggleType toggleType,bool isOn)30 void ToggleModelNG::Create(NG::ToggleType toggleType, bool isOn)
31 {
32 auto* stack = ViewStackProcessor::GetInstance();
33 int nodeId = stack->ClaimNodeId();
34 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TOGGLE_ETS_TAG, nodeId);
35 auto childFrameNode = FrameNode::GetFrameNode(V2::TOGGLE_ETS_TAG, nodeId);
36 if (!childFrameNode) {
37 auto frameNode = CreateFrameNode(nodeId, toggleType, isOn);
38 stack->Push(frameNode);
39 return;
40 }
41 auto pattern = childFrameNode->GetPattern();
42 if (AceType::InstanceOf<SwitchPattern>(pattern) && toggleType == ToggleType::SWITCH) {
43 UpdateSwitchIsOn(childFrameNode, isOn);
44 stack->Push(childFrameNode);
45 } else if (AceType::InstanceOf<ToggleCheckBoxPattern>(pattern) && toggleType == ToggleType::CHECKBOX) {
46 UpdateCheckboxIsOn(childFrameNode, isOn);
47 stack->Push(childFrameNode);
48 } else if (AceType::InstanceOf<ToggleButtonPattern>(pattern) && toggleType == ToggleType::BUTTON) {
49 UpdateToggleButtonIsOn(childFrameNode, isOn);
50 stack->Push(childFrameNode);
51 } else {
52 ReCreateFrameNode(childFrameNode, nodeId, toggleType, isOn);
53 }
54 }
55
ReCreateFrameNode(const RefPtr<FrameNode> & childFrameNode,int32_t nodeId,ToggleType toggleType,bool isOn)56 void ToggleModelNG::ReCreateFrameNode(
57 const RefPtr<FrameNode>& childFrameNode, int32_t nodeId, ToggleType toggleType, bool isOn)
58 {
59 auto parentFrame = childFrameNode->GetParent();
60 CHECK_NULL_VOID(parentFrame);
61 auto index = RemoveNode(childFrameNode, nodeId);
62 childFrameNode->SetUndefinedNodeId();
63 auto* stack = ViewStackProcessor::GetInstance();
64 auto frameNode = CreateFrameNode(nodeId, toggleType, isOn);
65 stack->Push(frameNode);
66 ReplaceAllChild(childFrameNode);
67 AddNewChild(parentFrame, nodeId, index, toggleType);
68 }
69
CreateFrameNode(int32_t nodeId,ToggleType toggleType,bool isOn)70 RefPtr<FrameNode> ToggleModelNG::CreateFrameNode(int32_t nodeId, ToggleType toggleType, bool isOn)
71 {
72 switch (toggleType) {
73 case ToggleType::CHECKBOX: {
74 return CreateCheckboxFrameNode(nodeId, isOn);
75 }
76 case ToggleType::SWITCH: {
77 return CreateSwitchFrameNode(nodeId, isOn);
78 }
79 case ToggleType::BUTTON: {
80 return CreateButtonFrameNode(nodeId, isOn);
81 }
82 default: {
83 return CreateSwitchFrameNode(nodeId, isOn);
84 }
85 }
86 }
87
SetSelectedColor(const std::optional<Color> & selectedColor)88 void ToggleModelNG::SetSelectedColor(const std::optional<Color>& selectedColor)
89 {
90 auto* stack = ViewStackProcessor::GetInstance();
91 CHECK_NULL_VOID(stack);
92 auto pipeline = PipelineBase::GetCurrentContext();
93 CHECK_NULL_VOID(pipeline);
94 auto frameNode = stack->GetMainFrameNode();
95 CHECK_NULL_VOID(frameNode);
96 Color color;
97 if (selectedColor.has_value()) {
98 color = selectedColor.value();
99 }
100
101 auto checkboxPattern = frameNode->GetPattern<ToggleCheckBoxPattern>();
102 if (checkboxPattern) {
103 if (!selectedColor.has_value()) {
104 CheckBoxModelNG::ResetSelectedColor(frameNode);
105 } else {
106 CheckBoxModelNG::SetSelectedColor(frameNode, color);
107 }
108 return;
109 }
110 auto buttonPattern = frameNode->GetPattern<ToggleButtonPattern>();
111 if (buttonPattern) {
112 if (!selectedColor.has_value()) {
113 ToggleButtonModelNG::ResetSelectedColor();
114 } else {
115 ToggleButtonModelNG::SetSelectedColor(color);
116 }
117 return;
118 }
119
120 if (!selectedColor.has_value()) {
121 ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SwitchPaintProperty, SelectedColor, PROPERTY_UPDATE_RENDER);
122 } else {
123 ACE_UPDATE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColor, color);
124 }
125 }
126
SetSwitchPointColor(const std::optional<Color> & switchPointColor)127 void ToggleModelNG::SetSwitchPointColor(const std::optional<Color>& switchPointColor)
128 {
129 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
130 CHECK_NULL_VOID(frameNode);
131 auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
132 if (paintProperty) {
133 if (switchPointColor.has_value()) {
134 paintProperty->UpdateSwitchPointColor(switchPointColor.value());
135 } else {
136 paintProperty->ResetSwitchPointColor();
137 }
138 }
139 }
OnChange(ChangeEvent && onChange)140 void ToggleModelNG::OnChange(ChangeEvent&& onChange)
141 {
142 auto* stack = ViewStackProcessor::GetInstance();
143 CHECK_NULL_VOID(stack);
144 auto frameNode = stack->GetMainFrameNode();
145 CHECK_NULL_VOID(frameNode);
146 auto checkboxPattern = frameNode->GetPattern<ToggleCheckBoxPattern>();
147 if (checkboxPattern) {
148 auto eventHub = frameNode->GetEventHub<CheckBoxEventHub>();
149 CHECK_NULL_VOID(eventHub);
150 eventHub->SetOnChange(std::move(onChange));
151 return;
152 }
153 auto buttonPattern = frameNode->GetPattern<ToggleButtonPattern>();
154 if (buttonPattern) {
155 auto eventHub = frameNode->GetEventHub<ToggleButtonEventHub>();
156 CHECK_NULL_VOID(eventHub);
157 eventHub->SetOnChange(std::move(onChange));
158 return;
159 }
160 auto eventHub = frameNode->GetEventHub<SwitchEventHub>();
161 CHECK_NULL_VOID(eventHub);
162 eventHub->SetOnChange(std::move(onChange));
163 }
164
OnChange(FrameNode * frameNode,ChangeEvent && onChange)165 void ToggleModelNG::OnChange(FrameNode* frameNode, ChangeEvent&& onChange)
166 {
167 CHECK_NULL_VOID(frameNode);
168 auto checkboxPattern = AceType::DynamicCast<ToggleCheckBoxPattern>(frameNode->GetPattern());
169 if (checkboxPattern) {
170 auto eventHub = frameNode->GetEventHub<CheckBoxEventHub>();
171 CHECK_NULL_VOID(eventHub);
172 eventHub->SetOnChange(std::move(onChange));
173 return;
174 }
175 auto buttonPattern = AceType::DynamicCast<ToggleButtonPattern>(frameNode->GetPattern());
176 if (buttonPattern) {
177 auto eventHub = frameNode->GetEventHub<ToggleButtonEventHub>();
178 CHECK_NULL_VOID(eventHub);
179 eventHub->SetOnChange(std::move(onChange));
180 return;
181 }
182 auto eventHub = frameNode->GetEventHub<SwitchEventHub>();
183 CHECK_NULL_VOID(eventHub);
184 eventHub->SetOnChange(std::move(onChange));
185 }
186
SetBuilderFunc(FrameNode * frameNode,NG::SwitchMakeCallback && makeFunc)187 void ToggleModelNG::SetBuilderFunc(FrameNode* frameNode, NG::SwitchMakeCallback&& makeFunc)
188 {
189 CHECK_NULL_VOID(frameNode);
190 auto checkboxPattern = AceType::DynamicCast<ToggleCheckBoxPattern>(frameNode->GetPattern());
191 if (checkboxPattern) {
192 checkboxPattern->SetToggleBuilderFunc(std::move(makeFunc));
193 return;
194 }
195 auto buttonPattern = AceType::DynamicCast<ToggleButtonPattern>(frameNode->GetPattern());
196 if (buttonPattern) {
197 buttonPattern->SetToggleBuilderFunc(std::move(makeFunc));
198 return;
199 }
200 auto pattern = frameNode->GetPattern<SwitchPattern>();
201 CHECK_NULL_VOID(pattern);
202 pattern->SetBuilderFunc(std::move(makeFunc));
203 }
204
SetChangeValue(FrameNode * frameNode,bool value)205 void ToggleModelNG::SetChangeValue(FrameNode* frameNode, bool value)
206 {
207 CHECK_NULL_VOID(frameNode);
208 auto checkboxPattern = AceType::DynamicCast<ToggleCheckBoxPattern>(frameNode->GetPattern());
209 if (checkboxPattern) {
210 checkboxPattern->SetCheckBoxSelect(std::move(value));
211 return;
212 }
213 auto buttonPattern = AceType::DynamicCast<ToggleButtonPattern>(frameNode->GetPattern());
214 if (buttonPattern) {
215 buttonPattern->SetButtonPress(std::move(value));
216 return;
217 }
218 auto pattern = frameNode->GetPattern<SwitchPattern>();
219 CHECK_NULL_VOID(pattern);
220 pattern->SetSwitchIsOn(value);
221 }
222
SetWidth(const Dimension & width)223 void ToggleModelNG::SetWidth(const Dimension& width)
224 {
225 NG::ViewAbstract::SetWidth(NG::CalcLength(width));
226 }
227
SetHeight(const Dimension & height)228 void ToggleModelNG::SetHeight(const Dimension& height)
229 {
230 NG::ViewAbstract::SetHeight(NG::CalcLength(height));
231 }
232
SetBackgroundColor(const Color & color,bool flag)233 void ToggleModelNG::SetBackgroundColor(const Color& color, bool flag)
234 {
235 ToggleButtonModelNG::SetBackgroundColor(color, flag);
236 }
237
IsToggle()238 bool ToggleModelNG::IsToggle()
239 {
240 return false;
241 }
242
SetPadding(const NG::PaddingPropertyF &,const NG::PaddingProperty & newArgs)243 void ToggleModelNG::SetPadding(const NG::PaddingPropertyF& /*args*/, const NG::PaddingProperty& newArgs)
244 {
245 NG::ViewAbstract::SetPadding(newArgs);
246 }
CreateCheckboxFrameNode(int32_t nodeId,bool isOn)247 RefPtr<FrameNode> ToggleModelNG::CreateCheckboxFrameNode(int32_t nodeId, bool isOn)
248 {
249 auto frameNode =
250 FrameNode::CreateFrameNode(V2::CHECKBOX_ETS_TAG, nodeId, AceType::MakeRefPtr<ToggleCheckBoxPattern>());
251 UpdateCheckboxIsOn(frameNode, isOn);
252 return frameNode;
253 }
254
CreateSwitchFrameNode(int32_t nodeId,bool isOn)255 RefPtr<FrameNode> ToggleModelNG::CreateSwitchFrameNode(int32_t nodeId, bool isOn)
256 {
257 auto frameNode = FrameNode::CreateFrameNode(V2::TOGGLE_ETS_TAG, nodeId, AceType::MakeRefPtr<SwitchPattern>());
258 UpdateSwitchIsOn(frameNode, isOn);
259 return frameNode;
260 }
261
CreateButtonFrameNode(int32_t nodeId,bool isOn)262 RefPtr<FrameNode> ToggleModelNG::CreateButtonFrameNode(int32_t nodeId, bool isOn)
263 {
264 auto frameNode = FrameNode::CreateFrameNode(V2::TOGGLE_ETS_TAG, nodeId, AceType::MakeRefPtr<ToggleButtonPattern>());
265 UpdateToggleButtonIsOn(frameNode, isOn);
266 return frameNode;
267 }
268
ReplaceAllChild(const RefPtr<FrameNode> & oldFrameNode)269 void ToggleModelNG::ReplaceAllChild(const RefPtr<FrameNode>& oldFrameNode)
270 {
271 auto currentNode = ViewStackProcessor::GetInstance()->GetMainElementNode();
272 CHECK_NULL_VOID(currentNode);
273 const auto& children = oldFrameNode->GetChildren();
274 auto switchPattern = oldFrameNode->GetPattern<SwitchPattern>();
275 auto checkboxPattern = oldFrameNode->GetPattern<CheckBoxPattern>();
276 auto toggleButtonPattern = oldFrameNode->GetPattern<ToggleButtonPattern>();
277 for (const auto& child : children) {
278 if (!child) {
279 continue;
280 }
281 if (switchPattern && switchPattern->UseContentModifier() && switchPattern->GetBuilderId() == child->GetId()) {
282 continue;
283 }
284 if (checkboxPattern && checkboxPattern->UseContentModifier()) {
285 auto modifierNode = checkboxPattern->GetContentModifierNode();
286 if (modifierNode && modifierNode->GetId() == child->GetId()) {
287 continue;
288 }
289 }
290 if (toggleButtonPattern && toggleButtonPattern->UseContentModifier() &&
291 toggleButtonPattern->GetBuilderId() == child->GetId()) {
292 continue;
293 }
294 child->MountToParent(currentNode);
295 }
296 oldFrameNode->RemoveAllChildInRenderTree();
297 }
298
AddNewChild(const RefPtr<UINode> & parentFrame,int32_t nodeId,int32_t index,ToggleType toggleType)299 void ToggleModelNG::AddNewChild(const RefPtr<UINode>& parentFrame, int32_t nodeId, int32_t index, ToggleType toggleType)
300 {
301 auto newFrameNode = FrameNode::GetFrameNode(V2::TOGGLE_ETS_TAG, nodeId);
302 parentFrame->AddChild(newFrameNode, index);
303 CHECK_NULL_VOID(newFrameNode);
304 const auto& children = newFrameNode->GetChildren();
305 for (const auto& child : children) {
306 if (!child) {
307 continue;
308 }
309 auto childNode = AceType::DynamicCast<FrameNode>(child);
310 CHECK_NULL_VOID(childNode);
311 auto accessibilityProperty = childNode->GetAccessibilityProperty<AccessibilityProperty>();
312 CHECK_NULL_VOID(accessibilityProperty);
313 if (toggleType == ToggleType::CHECKBOX || toggleType == ToggleType::SWITCH) {
314 accessibilityProperty->SetAccessibilityLevel(AccessibilityProperty::Level::NO_STR);
315 } else {
316 accessibilityProperty->SetAccessibilityLevel(AccessibilityProperty::Level::YES_STR);
317 }
318 }
319 newFrameNode->MarkModifyDone();
320 }
321
RemoveNode(const RefPtr<FrameNode> & childFrameNode,int32_t nodeId)322 int32_t ToggleModelNG::RemoveNode(const RefPtr<FrameNode>& childFrameNode, int32_t nodeId)
323 {
324 ElementRegister::GetInstance()->RemoveItemSilently(nodeId);
325 auto parentFrame = childFrameNode->GetParent();
326 CHECK_NULL_RETURN(parentFrame, 0);
327 return parentFrame->RemoveChildAndReturnIndex(childFrameNode);
328 }
329
OnChangeEvent(ChangeEvent && onChangeEvent)330 void ToggleModelNG::OnChangeEvent(ChangeEvent&& onChangeEvent)
331 {
332 auto* stack = ViewStackProcessor::GetInstance();
333 CHECK_NULL_VOID(stack);
334 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
335 CHECK_NULL_VOID(frameNode);
336 auto checkboxPattern = stack->GetMainFrameNodePattern<ToggleCheckBoxPattern>();
337 if (checkboxPattern) {
338 auto eventHub = frameNode->GetEventHub<CheckBoxEventHub>();
339 CHECK_NULL_VOID(eventHub);
340 eventHub->SetChangeEvent(std::move(onChangeEvent));
341 return;
342 }
343 auto buttonPattern = stack->GetMainFrameNodePattern<ToggleButtonPattern>();
344 if (buttonPattern) {
345 auto eventHub = frameNode->GetEventHub<ToggleButtonEventHub>();
346 CHECK_NULL_VOID(eventHub);
347 eventHub->SetOnChangeEvent(std::move(onChangeEvent));
348 return;
349 }
350 auto eventHub = frameNode->GetEventHub<SwitchEventHub>();
351 CHECK_NULL_VOID(eventHub);
352 eventHub->SetOnChangeEvent(std::move(onChangeEvent));
353 }
354
SetResponseRegion(const std::vector<DimensionRect> & responseRegion)355 void ToggleModelNG::SetResponseRegion(const std::vector<DimensionRect>& responseRegion)
356 {
357 NG::ViewAbstract::SetResponseRegion(responseRegion);
358 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
359 CHECK_NULL_VOID(frameNode);
360 auto pattern = frameNode->GetPattern<SwitchPattern>();
361 CHECK_NULL_VOID(pattern);
362 pattern->SetIsUserSetResponseRegion(true);
363 }
364
SetHoverEffect(HoverEffectType hoverEffect)365 void ToggleModelNG::SetHoverEffect(HoverEffectType hoverEffect)
366 {
367 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
368 CHECK_NULL_VOID(frameNode);
369 auto pattern = frameNode->GetPattern<SwitchPattern>();
370 if (pattern) {
371 pattern->SetShowHoverEffect(hoverEffect != HoverEffectType::NONE);
372 }
373 if (hoverEffect == HoverEffectType::BOARD) {
374 return;
375 }
376 NG::ViewAbstract::SetHoverEffect(hoverEffect);
377 }
378
Pop()379 void ToggleModelNG::Pop()
380 {
381 ViewStackProcessor::GetInstance()->PopContainer();
382 }
383
SetPointRadius(const Dimension & switchPointRadius)384 void ToggleModelNG::SetPointRadius(const Dimension& switchPointRadius)
385 {
386 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
387 CHECK_NULL_VOID(frameNode);
388 auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
389 if (paintProperty) {
390 paintProperty->UpdatePointRadius(switchPointRadius);
391 }
392 }
393
ResetPointRadius()394 void ToggleModelNG::ResetPointRadius()
395 {
396 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
397 CHECK_NULL_VOID(frameNode);
398 auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
399 if (paintProperty) {
400 paintProperty->ResetPointRadius();
401 paintProperty->UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER);
402 }
403 }
404
SetPointRadius(FrameNode * frameNode,const Dimension & switchPointRadius)405 void ToggleModelNG::SetPointRadius(FrameNode* frameNode, const Dimension& switchPointRadius)
406 {
407 CHECK_NULL_VOID(frameNode);
408 auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
409 if (paintProperty) {
410 paintProperty->UpdatePointRadius(switchPointRadius);
411 }
412 }
413
ResetPointRadius(FrameNode * frameNode)414 void ToggleModelNG::ResetPointRadius(FrameNode* frameNode)
415 {
416 CHECK_NULL_VOID(frameNode);
417 auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
418 if (paintProperty) {
419 paintProperty->ResetPointRadius();
420 paintProperty->UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER);
421 }
422 }
423
SetUnselectedColor(const Color & unselectedColor)424 void ToggleModelNG::SetUnselectedColor(const Color& unselectedColor)
425 {
426 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
427 CHECK_NULL_VOID(frameNode);
428 auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
429 if (paintProperty) {
430 paintProperty->UpdateUnselectedColor(unselectedColor);
431 }
432 }
433
SetUnselectedColor(FrameNode * frameNode,const Color & unselectedColor)434 void ToggleModelNG::SetUnselectedColor(FrameNode* frameNode, const Color& unselectedColor)
435 {
436 CHECK_NULL_VOID(frameNode);
437 auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
438 if (paintProperty) {
439 paintProperty->UpdateUnselectedColor(unselectedColor);
440 }
441 }
442
SetTrackBorderRadius(const Dimension & borderRadius)443 void ToggleModelNG::SetTrackBorderRadius(const Dimension& borderRadius)
444 {
445 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
446 CHECK_NULL_VOID(frameNode);
447 auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
448 if (paintProperty) {
449 paintProperty->UpdateTrackBorderRadius(borderRadius);
450 }
451 }
452
ResetTrackBorderRadius()453 void ToggleModelNG::ResetTrackBorderRadius()
454 {
455 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
456 CHECK_NULL_VOID(frameNode);
457 auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
458 if (paintProperty) {
459 paintProperty->ResetTrackBorderRadius();
460 paintProperty->UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER);
461 }
462 }
463
SetTrackBorderRadius(FrameNode * frameNode,const Dimension & borderRadius)464 void ToggleModelNG::SetTrackBorderRadius(FrameNode* frameNode, const Dimension& borderRadius)
465 {
466 CHECK_NULL_VOID(frameNode);
467 auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
468 if (paintProperty) {
469 paintProperty->UpdateTrackBorderRadius(borderRadius);
470 }
471 }
472
ResetTrackBorderRadius(FrameNode * frameNode)473 void ToggleModelNG::ResetTrackBorderRadius(FrameNode* frameNode)
474 {
475 CHECK_NULL_VOID(frameNode);
476 auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
477 if (paintProperty) {
478 paintProperty->ResetTrackBorderRadius();
479 paintProperty->UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER);
480 }
481 }
482
SetSelectedColor(FrameNode * frameNode,const std::optional<Color> & selectedColor)483 void ToggleModelNG::SetSelectedColor(FrameNode* frameNode, const std::optional<Color>& selectedColor)
484 {
485 CHECK_NULL_VOID(frameNode);
486
487 auto pipeline = PipelineBase::GetCurrentContextSafely();
488 CHECK_NULL_VOID(pipeline);
489 Color color;
490 if (selectedColor.has_value()) {
491 color = selectedColor.value();
492 }
493
494 auto checkboxPattern = AceType::DynamicCast<ToggleCheckBoxPattern>(frameNode->GetPattern());
495 if (checkboxPattern) {
496 if (!selectedColor.has_value()) {
497 auto theme = pipeline->GetTheme<CheckboxTheme>(frameNode->GetThemeScopeId());
498 CHECK_NULL_VOID(theme);
499 color = theme->GetActiveColor();
500 }
501 CheckBoxModelNG checkBoxModelNG;
502 checkBoxModelNG.SetSelectedColor(frameNode, color);
503 return;
504 }
505
506 auto buttonPattern = AceType::DynamicCast<ToggleButtonPattern>(frameNode->GetPattern());
507 if (buttonPattern) {
508 if (!selectedColor.has_value()) {
509 auto theme = pipeline->GetTheme<ToggleTheme>(frameNode->GetThemeScopeId());
510 CHECK_NULL_VOID(theme);
511 color = theme->GetCheckedColor();
512 }
513 ToggleButtonModelNG::SetSelectedColor(frameNode, color);
514 return;
515 }
516
517 if (!selectedColor.has_value()) {
518 auto theme = pipeline->GetTheme<SwitchTheme>(frameNode->GetThemeScopeId());
519 CHECK_NULL_VOID(theme);
520 color = theme->GetActiveColor();
521 }
522
523 ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColor, color, frameNode);
524 }
525
SetSwitchPointColor(FrameNode * frameNode,const std::optional<Color> & switchPointColor)526 void ToggleModelNG::SetSwitchPointColor(FrameNode* frameNode, const std::optional<Color>& switchPointColor)
527 {
528 CHECK_NULL_VOID(frameNode);
529 auto pipeline = PipelineBase::GetCurrentContextSafely();
530 CHECK_NULL_VOID(pipeline);
531 Color color;
532 if (switchPointColor.has_value()) {
533 color = switchPointColor.value();
534 }
535
536 if (!switchPointColor.has_value()) {
537 auto theme = pipeline->GetTheme<SwitchTheme>(frameNode->GetThemeScopeId());
538 CHECK_NULL_VOID(theme);
539 color = theme->GetPointColor();
540 }
541 ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SwitchPointColor, color, frameNode);
542 }
543
SetBackgroundColor(FrameNode * frameNode,const Color & color)544 void ToggleModelNG::SetBackgroundColor(FrameNode* frameNode, const Color& color)
545 {
546 ToggleButtonModelNG::SetBackgroundColor(frameNode, color);
547 }
548
SetHeight(FrameNode * frameNode,const Dimension & height)549 void ToggleModelNG::SetHeight(FrameNode* frameNode, const Dimension& height)
550 {
551 NG::ViewAbstract::SetHeight(frameNode, NG::CalcLength(height));
552 }
553
SetPadding(FrameNode * frameNode,const NG::PaddingPropertyF &,const NG::PaddingProperty & newArgs)554 void ToggleModelNG::SetPadding(
555 FrameNode* frameNode, const NG::PaddingPropertyF& /*args*/, const NG::PaddingProperty& newArgs)
556 {
557 NG::ViewAbstract::SetPadding(frameNode, newArgs);
558 }
559
SetResponseRegion(FrameNode * frameNode,const std::vector<DimensionRect> & responseRegion)560 void ToggleModelNG::SetResponseRegion(FrameNode* frameNode, const std::vector<DimensionRect>& responseRegion)
561 {
562 CHECK_NULL_VOID(frameNode);
563 NG::ViewAbstract::SetResponseRegion(frameNode, responseRegion);
564 auto pattern = frameNode->GetPattern<SwitchPattern>();
565 CHECK_NULL_VOID(pattern);
566 pattern->SetIsUserSetResponseRegion(true);
567 }
568
SetHoverEffect(FrameNode * frameNode,HoverEffectType hoverEffect)569 void ToggleModelNG::SetHoverEffect(FrameNode* frameNode, HoverEffectType hoverEffect)
570 {
571 CHECK_NULL_VOID(frameNode);
572 auto pattern = frameNode->GetPattern<SwitchPattern>();
573 if (pattern) {
574 pattern->SetShowHoverEffect(hoverEffect != HoverEffectType::NONE);
575 }
576 if (hoverEffect == HoverEffectType::BOARD) {
577 return;
578 }
579 NG::ViewAbstract::SetHoverEffect(frameNode, hoverEffect);
580 }
581
SetToggleState(FrameNode * frameNode,bool isOn)582 void ToggleModelNG::SetToggleState(FrameNode* frameNode, bool isOn)
583 {
584 CHECK_NULL_VOID(frameNode);
585 auto refNode = AceType::Claim(frameNode);
586 CHECK_NULL_VOID(refNode);
587 auto pattern = frameNode->GetPattern();
588 CHECK_NULL_VOID(pattern);
589 if (AceType::InstanceOf<SwitchPattern>(pattern)) {
590 UpdateSwitchIsOn(refNode, isOn);
591 } else if (AceType::InstanceOf<CheckBoxPattern>(pattern)) {
592 UpdateCheckboxIsOn(refNode, isOn);
593 } else if (AceType::InstanceOf<ButtonPattern>(pattern)) {
594 UpdateToggleButtonIsOn(refNode, isOn);
595 }
596 }
597
GetSelectedColor(FrameNode * frameNode)598 Color ToggleModelNG::GetSelectedColor(FrameNode* frameNode)
599 {
600 Color value;
601 ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
602 SwitchPaintProperty, SelectedColor, value, frameNode, Color(DEFAULT_COLOR));
603 return value;
604 }
605
GetSwitchPointColor(FrameNode * frameNode)606 Color ToggleModelNG::GetSwitchPointColor(FrameNode* frameNode)
607 {
608 Color value;
609 ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
610 SwitchPaintProperty, SwitchPointColor, value, frameNode, Color(DEFAULT_COLOR));
611 return value;
612 }
613
SetSwitchIsOn(FrameNode * frameNode,bool isOn)614 void ToggleModelNG::SetSwitchIsOn(FrameNode* frameNode, bool isOn)
615 {
616 CHECK_NULL_VOID(frameNode);
617 auto eventHub = frameNode->GetEventHub<SwitchEventHub>();
618 CHECK_NULL_VOID(eventHub);
619 eventHub->SetCurrentUIState(UI_STATE_SELECTED, isOn);
620 ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, IsOn, isOn, frameNode);
621 }
622
UpdateSwitchIsOn(const RefPtr<FrameNode> & frameNode,bool isOn)623 void ToggleModelNG::UpdateSwitchIsOn(const RefPtr<FrameNode>& frameNode, bool isOn)
624 {
625 CHECK_NULL_VOID(frameNode);
626 auto eventHub = frameNode->GetEventHub<SwitchEventHub>();
627 CHECK_NULL_VOID(eventHub);
628 eventHub->SetCurrentUIState(UI_STATE_SELECTED, isOn);
629 auto paintProperty = frameNode->GetPaintPropertyPtr<SwitchPaintProperty>();
630 CHECK_NULL_VOID(paintProperty);
631 if (paintProperty->HasIsOn() && paintProperty->GetIsOn().value() != isOn) {
632 TAG_LOGI(AceLogTag::ACE_SELECT_COMPONENT, "switch update isOn %{public}d", isOn);
633 }
634 paintProperty->UpdateIsOn(isOn);
635 }
636
UpdateCheckboxIsOn(const RefPtr<FrameNode> & frameNode,bool isOn)637 void ToggleModelNG::UpdateCheckboxIsOn(const RefPtr<FrameNode>& frameNode, bool isOn)
638 {
639 CHECK_NULL_VOID(frameNode);
640 auto eventHub = frameNode->GetEventHub<CheckBoxEventHub>();
641 CHECK_NULL_VOID(eventHub);
642 eventHub->SetCurrentUIState(UI_STATE_SELECTED, isOn);
643 ACE_UPDATE_NODE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxSelect, isOn, frameNode);
644 }
645
UpdateToggleButtonIsOn(const RefPtr<FrameNode> & frameNode,bool isOn)646 void ToggleModelNG::UpdateToggleButtonIsOn(const RefPtr<FrameNode>& frameNode, bool isOn)
647 {
648 CHECK_NULL_VOID(frameNode);
649 auto eventHub = frameNode->GetEventHub<ToggleButtonEventHub>();
650 CHECK_NULL_VOID(eventHub);
651 eventHub->SetCurrentUIState(UI_STATE_SELECTED, isOn);
652 ACE_UPDATE_NODE_PAINT_PROPERTY(ToggleButtonPaintProperty, IsOn, isOn, frameNode);
653 }
654
GetSwitchIsOn(FrameNode * frameNode)655 bool ToggleModelNG::GetSwitchIsOn(FrameNode* frameNode)
656 {
657 bool value = false;
658 CHECK_NULL_RETURN(frameNode, value);
659 ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(SwitchPaintProperty, IsOn, value, frameNode, value);
660 return value;
661 }
662
GetUnselectedColor(FrameNode * frameNode)663 Color ToggleModelNG::GetUnselectedColor(FrameNode* frameNode)
664 {
665 Color value;
666 ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
667 SwitchPaintProperty, UnselectedColor, value, frameNode, Color(DEFAULT_COLOR));
668 return value;
669 }
670 } // namespace OHOS::Ace::NG
671