• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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