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