• 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/common/resource/resource_parse_utils.h"
19 #include "core/components/toggle/toggle_theme.h"
20 #include "core/components_ng/base/view_abstract_model.h"
21 #include "core/components_ng/pattern/button/toggle_button_model_ng.h"
22 #include "core/components_ng/pattern/button/toggle_button_pattern.h"
23 #include "core/components_ng/pattern/checkbox/checkbox_model_ng.h"
24 #include "core/components_ng/pattern/checkbox/toggle_checkbox_pattern.h"
25 #include "core/components_ng/pattern/toggle/switch_pattern.h"
26 
27 namespace OHOS::Ace::NG {
28 
29 constexpr uint32_t DEFAULT_COLOR = 0xffffffff;
30 
Create(NG::ToggleType toggleType,bool isOn)31 void ToggleModelNG::Create(NG::ToggleType toggleType, bool isOn)
32 {
33     auto* stack = ViewStackProcessor::GetInstance();
34     int nodeId = stack->ClaimNodeId();
35     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TOGGLE_ETS_TAG, nodeId);
36     auto childFrameNode = FrameNode::GetFrameNode(V2::TOGGLE_ETS_TAG, nodeId);
37     if (!childFrameNode) {
38         auto frameNode = CreateFrameNode(nodeId, toggleType, isOn);
39         stack->Push(frameNode);
40         return;
41     }
42     auto pattern = childFrameNode->GetPattern();
43     if (AceType::InstanceOf<SwitchPattern>(pattern) && toggleType == ToggleType::SWITCH) {
44         UpdateSwitchIsOn(childFrameNode, isOn);
45         stack->Push(childFrameNode);
46     } else if (AceType::InstanceOf<ToggleCheckBoxPattern>(pattern) && toggleType == ToggleType::CHECKBOX) {
47         UpdateCheckboxIsOn(childFrameNode, isOn);
48         stack->Push(childFrameNode);
49     } else if (AceType::InstanceOf<ToggleButtonPattern>(pattern) && toggleType == ToggleType::BUTTON) {
50         UpdateToggleButtonIsOn(childFrameNode, isOn);
51         stack->Push(childFrameNode);
52     } else {
53         ReCreateFrameNode(childFrameNode, nodeId, toggleType, isOn);
54     }
55     auto pros = childFrameNode->GetPaintProperty<SwitchPaintProperty>();
56     if (pros) {
57         pros->ResetUnselectedColorSetByUser();
58         pros->ResetSelectedColorSetByUser();
59         pros->ResetSwitchPointColorSetByUser();
60     }
61 }
62 
ReCreateFrameNode(const RefPtr<FrameNode> & childFrameNode,int32_t nodeId,ToggleType toggleType,bool isOn)63 void ToggleModelNG::ReCreateFrameNode(
64     const RefPtr<FrameNode>& childFrameNode, int32_t nodeId, ToggleType toggleType, bool isOn)
65 {
66     auto parentFrame = childFrameNode->GetParent();
67     CHECK_NULL_VOID(parentFrame);
68     auto index = RemoveNode(childFrameNode, nodeId);
69     childFrameNode->SetUndefinedNodeId();
70     auto* stack = ViewStackProcessor::GetInstance();
71     auto frameNode = CreateFrameNode(nodeId, toggleType, isOn);
72     stack->Push(frameNode);
73     ReplaceAllChild(childFrameNode);
74     AddNewChild(parentFrame, nodeId, index, toggleType);
75 }
76 
CreateFrameNode(int32_t nodeId,ToggleType toggleType,bool isOn)77 RefPtr<FrameNode> ToggleModelNG::CreateFrameNode(int32_t nodeId, ToggleType toggleType, bool isOn)
78 {
79     switch (toggleType) {
80         case ToggleType::CHECKBOX: {
81             return CreateCheckboxFrameNode(nodeId, isOn);
82         }
83         case ToggleType::SWITCH: {
84             return CreateSwitchFrameNode(nodeId, isOn);
85         }
86         case ToggleType::BUTTON: {
87             return CreateButtonFrameNode(nodeId, isOn);
88         }
89         default: {
90             return CreateSwitchFrameNode(nodeId, isOn);
91         }
92     }
93 }
94 
SetSelectedColor(const std::optional<Color> & selectedColor)95 void ToggleModelNG::SetSelectedColor(const std::optional<Color>& selectedColor)
96 {
97     auto* stack = ViewStackProcessor::GetInstance();
98     CHECK_NULL_VOID(stack);
99     auto pipeline = PipelineBase::GetCurrentContext();
100     CHECK_NULL_VOID(pipeline);
101     auto frameNode = stack->GetMainFrameNode();
102     CHECK_NULL_VOID(frameNode);
103     Color color;
104     if (selectedColor.has_value()) {
105         color = selectedColor.value();
106     }
107 
108     auto checkboxPattern = frameNode->GetPattern<ToggleCheckBoxPattern>();
109     if (checkboxPattern) {
110         if (!selectedColor.has_value()) {
111             CheckBoxModelNG::ResetSelectedColor(frameNode);
112         } else {
113             CheckBoxModelNG::SetSelectedColor(frameNode, color);
114         }
115         return;
116     }
117     auto buttonPattern = frameNode->GetPattern<ToggleButtonPattern>();
118     if (buttonPattern) {
119         if (!selectedColor.has_value()) {
120             ToggleButtonModelNG::ResetSelectedColor();
121         } else {
122             ToggleButtonModelNG::SetSelectedColor(color);
123         }
124         return;
125     }
126 
127     if (!selectedColor.has_value()) {
128         ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SwitchPaintProperty, SelectedColor, PROPERTY_UPDATE_RENDER);
129         ACE_UPDATE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColorSetByUser, false);
130     } else {
131         ACE_UPDATE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColor, color);
132         ACE_UPDATE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColorSetByUser, true);
133     }
134 }
135 
SetSwitchPointColor(const std::optional<Color> & switchPointColor)136 void ToggleModelNG::SetSwitchPointColor(const std::optional<Color>& switchPointColor)
137 {
138     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
139     CHECK_NULL_VOID(frameNode);
140     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
141     if (paintProperty) {
142         if (switchPointColor.has_value()) {
143             paintProperty->UpdateSwitchPointColor(switchPointColor.value());
144         } else {
145             paintProperty->ResetSwitchPointColor();
146         }
147     }
148 }
149 
SetSwitchPointColorSetByUser(const bool flag)150 void ToggleModelNG::SetSwitchPointColorSetByUser(const bool flag)
151 {
152     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
153     CHECK_NULL_VOID(frameNode);
154     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
155     if (paintProperty) {
156         paintProperty->UpdateSwitchPointColorSetByUser(flag);
157     }
158 }
159 
OnChange(ChangeEvent && onChange)160 void ToggleModelNG::OnChange(ChangeEvent&& onChange)
161 {
162     auto* stack = ViewStackProcessor::GetInstance();
163     CHECK_NULL_VOID(stack);
164     auto frameNode = stack->GetMainFrameNode();
165     CHECK_NULL_VOID(frameNode);
166     auto checkboxPattern = frameNode->GetPattern<ToggleCheckBoxPattern>();
167     if (checkboxPattern) {
168         auto eventHub = frameNode->GetOrCreateEventHub<CheckBoxEventHub>();
169         CHECK_NULL_VOID(eventHub);
170         eventHub->SetOnChange(std::move(onChange));
171         return;
172     }
173     auto buttonPattern = frameNode->GetPattern<ToggleButtonPattern>();
174     if (buttonPattern) {
175         auto eventHub = frameNode->GetOrCreateEventHub<ToggleButtonEventHub>();
176         CHECK_NULL_VOID(eventHub);
177         eventHub->SetOnChange(std::move(onChange));
178         return;
179     }
180     auto eventHub = frameNode->GetOrCreateEventHub<SwitchEventHub>();
181     CHECK_NULL_VOID(eventHub);
182     eventHub->SetOnChange(std::move(onChange));
183 }
184 
OnChange(FrameNode * frameNode,ChangeEvent && onChange)185 void ToggleModelNG::OnChange(FrameNode* frameNode, ChangeEvent&& onChange)
186 {
187     CHECK_NULL_VOID(frameNode);
188     auto checkboxPattern = AceType::DynamicCast<ToggleCheckBoxPattern>(frameNode->GetPattern());
189     if (checkboxPattern) {
190         auto eventHub = frameNode->GetOrCreateEventHub<CheckBoxEventHub>();
191         CHECK_NULL_VOID(eventHub);
192         eventHub->SetOnChange(std::move(onChange));
193         return;
194     }
195     auto buttonPattern = AceType::DynamicCast<ToggleButtonPattern>(frameNode->GetPattern());
196     if (buttonPattern) {
197         auto eventHub = frameNode->GetOrCreateEventHub<ToggleButtonEventHub>();
198         CHECK_NULL_VOID(eventHub);
199         eventHub->SetOnChange(std::move(onChange));
200         return;
201     }
202     auto eventHub = frameNode->GetOrCreateEventHub<SwitchEventHub>();
203     CHECK_NULL_VOID(eventHub);
204     eventHub->SetOnChange(std::move(onChange));
205 }
206 
SetBuilderFunc(FrameNode * frameNode,NG::SwitchMakeCallback && makeFunc)207 void ToggleModelNG::SetBuilderFunc(FrameNode* frameNode, NG::SwitchMakeCallback&& makeFunc)
208 {
209     CHECK_NULL_VOID(frameNode);
210     auto checkboxPattern = AceType::DynamicCast<ToggleCheckBoxPattern>(frameNode->GetPattern());
211     if (checkboxPattern) {
212         checkboxPattern->SetToggleBuilderFunc(std::move(makeFunc));
213         return;
214     }
215     auto buttonPattern = AceType::DynamicCast<ToggleButtonPattern>(frameNode->GetPattern());
216     if (buttonPattern) {
217         buttonPattern->SetToggleBuilderFunc(std::move(makeFunc));
218         return;
219     }
220     auto pattern = frameNode->GetPattern<SwitchPattern>();
221     CHECK_NULL_VOID(pattern);
222     pattern->SetBuilderFunc(std::move(makeFunc));
223 }
224 
SetChangeValue(FrameNode * frameNode,bool value)225 void ToggleModelNG::SetChangeValue(FrameNode* frameNode, bool value)
226 {
227     CHECK_NULL_VOID(frameNode);
228     auto checkboxPattern = AceType::DynamicCast<ToggleCheckBoxPattern>(frameNode->GetPattern());
229     if (checkboxPattern) {
230         checkboxPattern->SetCheckBoxSelect(std::move(value));
231         return;
232     }
233     auto buttonPattern = AceType::DynamicCast<ToggleButtonPattern>(frameNode->GetPattern());
234     if (buttonPattern) {
235         buttonPattern->SetButtonPress(std::move(value));
236         return;
237     }
238     auto pattern = frameNode->GetPattern<SwitchPattern>();
239     CHECK_NULL_VOID(pattern);
240     pattern->SetSwitchIsOn(value);
241 }
242 
SetWidth(const Dimension & width)243 void ToggleModelNG::SetWidth(const Dimension& width)
244 {
245     NG::ViewAbstract::SetWidth(NG::CalcLength(width));
246 }
247 
SetHeight(const Dimension & height)248 void ToggleModelNG::SetHeight(const Dimension& height)
249 {
250     NG::ViewAbstract::SetHeight(NG::CalcLength(height));
251 }
252 
SetBackgroundColor(const Color & color,bool flag)253 void ToggleModelNG::SetBackgroundColor(const Color& color, bool flag)
254 {
255     ToggleButtonModelNG::SetBackgroundColor(color, flag);
256 }
257 
IsToggle()258 bool ToggleModelNG::IsToggle()
259 {
260     return false;
261 }
262 
SetPadding(const NG::PaddingPropertyF &,const NG::PaddingProperty & newArgs)263 void ToggleModelNG::SetPadding(const NG::PaddingPropertyF& /*args*/, const NG::PaddingProperty& newArgs)
264 {
265     NG::ViewAbstract::SetPadding(newArgs);
266 }
CreateCheckboxFrameNode(int32_t nodeId,bool isOn)267 RefPtr<FrameNode> ToggleModelNG::CreateCheckboxFrameNode(int32_t nodeId, bool isOn)
268 {
269     auto frameNode =
270         FrameNode::CreateFrameNode(V2::CHECKBOX_ETS_TAG, nodeId, AceType::MakeRefPtr<ToggleCheckBoxPattern>());
271     UpdateCheckboxIsOn(frameNode, isOn);
272     return frameNode;
273 }
274 
CreateSwitchFrameNode(int32_t nodeId,bool isOn)275 RefPtr<FrameNode> ToggleModelNG::CreateSwitchFrameNode(int32_t nodeId, bool isOn)
276 {
277     auto frameNode = FrameNode::CreateFrameNode(V2::TOGGLE_ETS_TAG, nodeId, AceType::MakeRefPtr<SwitchPattern>());
278     UpdateSwitchIsOn(frameNode, isOn);
279     return frameNode;
280 }
281 
CreateButtonFrameNode(int32_t nodeId,bool isOn)282 RefPtr<FrameNode> ToggleModelNG::CreateButtonFrameNode(int32_t nodeId, bool isOn)
283 {
284     auto frameNode = FrameNode::CreateFrameNode(V2::TOGGLE_ETS_TAG, nodeId, AceType::MakeRefPtr<ToggleButtonPattern>());
285     UpdateToggleButtonIsOn(frameNode, isOn);
286     return frameNode;
287 }
288 
ReplaceAllChild(const RefPtr<FrameNode> & oldFrameNode)289 void ToggleModelNG::ReplaceAllChild(const RefPtr<FrameNode>& oldFrameNode)
290 {
291     auto currentNode = ViewStackProcessor::GetInstance()->GetMainElementNode();
292     CHECK_NULL_VOID(currentNode);
293     const auto& children = oldFrameNode->GetChildren();
294     auto switchPattern = oldFrameNode->GetPattern<SwitchPattern>();
295     auto checkboxPattern = oldFrameNode->GetPattern<CheckBoxPattern>();
296     auto toggleButtonPattern = oldFrameNode->GetPattern<ToggleButtonPattern>();
297     for (const auto& child : children) {
298         if (!child) {
299             continue;
300         }
301         if (switchPattern && switchPattern->UseContentModifier() && switchPattern->GetBuilderId() == child->GetId()) {
302             continue;
303         }
304         if (checkboxPattern && checkboxPattern->UseContentModifier()) {
305             auto modifierNode = checkboxPattern->GetContentModifierNode();
306             if (modifierNode && modifierNode->GetId() == child->GetId()) {
307                 continue;
308             }
309         }
310         if (toggleButtonPattern && toggleButtonPattern->UseContentModifier() &&
311             toggleButtonPattern->GetBuilderId() == child->GetId()) {
312             continue;
313         }
314         child->MountToParent(currentNode);
315     }
316     oldFrameNode->RemoveAllChildInRenderTree();
317 }
318 
AddNewChild(const RefPtr<UINode> & parentFrame,int32_t nodeId,int32_t index,ToggleType toggleType)319 void ToggleModelNG::AddNewChild(const RefPtr<UINode>& parentFrame, int32_t nodeId, int32_t index, ToggleType toggleType)
320 {
321     auto newFrameNode = FrameNode::GetFrameNode(V2::TOGGLE_ETS_TAG, nodeId);
322     parentFrame->AddChild(newFrameNode, index);
323     CHECK_NULL_VOID(newFrameNode);
324     const auto& children = newFrameNode->GetChildren();
325     for (const auto& child : children) {
326         if (!child) {
327             continue;
328         }
329         auto childNode = AceType::DynamicCast<FrameNode>(child);
330         CHECK_NULL_VOID(childNode);
331         auto accessibilityProperty = childNode->GetAccessibilityProperty<AccessibilityProperty>();
332         CHECK_NULL_VOID(accessibilityProperty);
333         if (toggleType == ToggleType::CHECKBOX || toggleType == ToggleType::SWITCH) {
334             accessibilityProperty->SetAccessibilityLevel(AccessibilityProperty::Level::NO_STR);
335         } else {
336             accessibilityProperty->SetAccessibilityLevel(AccessibilityProperty::Level::YES_STR);
337         }
338     }
339     newFrameNode->MarkModifyDone();
340 }
341 
RemoveNode(const RefPtr<FrameNode> & childFrameNode,int32_t nodeId)342 int32_t ToggleModelNG::RemoveNode(const RefPtr<FrameNode>& childFrameNode, int32_t nodeId)
343 {
344     ElementRegister::GetInstance()->RemoveItemSilently(nodeId);
345     auto parentFrame = childFrameNode->GetParent();
346     CHECK_NULL_RETURN(parentFrame, 0);
347     return parentFrame->RemoveChildAndReturnIndex(childFrameNode);
348 }
349 
OnChangeEvent(ChangeEvent && onChangeEvent)350 void ToggleModelNG::OnChangeEvent(ChangeEvent&& onChangeEvent)
351 {
352     auto* stack = ViewStackProcessor::GetInstance();
353     CHECK_NULL_VOID(stack);
354     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
355     CHECK_NULL_VOID(frameNode);
356     auto checkboxPattern = stack->GetMainFrameNodePattern<ToggleCheckBoxPattern>();
357     if (checkboxPattern) {
358         auto eventHub = frameNode->GetOrCreateEventHub<CheckBoxEventHub>();
359         CHECK_NULL_VOID(eventHub);
360         eventHub->SetChangeEvent(std::move(onChangeEvent));
361         return;
362     }
363     auto buttonPattern = stack->GetMainFrameNodePattern<ToggleButtonPattern>();
364     if (buttonPattern) {
365         auto eventHub = frameNode->GetOrCreateEventHub<ToggleButtonEventHub>();
366         CHECK_NULL_VOID(eventHub);
367         eventHub->SetOnChangeEvent(std::move(onChangeEvent));
368         return;
369     }
370     auto eventHub = frameNode->GetOrCreateEventHub<SwitchEventHub>();
371     CHECK_NULL_VOID(eventHub);
372     eventHub->SetOnChangeEvent(std::move(onChangeEvent));
373 }
374 
SetResponseRegion(const std::vector<DimensionRect> & responseRegion)375 void ToggleModelNG::SetResponseRegion(const std::vector<DimensionRect>& responseRegion)
376 {
377     NG::ViewAbstract::SetResponseRegion(responseRegion);
378     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
379     CHECK_NULL_VOID(frameNode);
380     auto pattern = frameNode->GetPattern<SwitchPattern>();
381     CHECK_NULL_VOID(pattern);
382     pattern->SetIsUserSetResponseRegion(true);
383 }
384 
SetHoverEffect(HoverEffectType hoverEffect)385 void ToggleModelNG::SetHoverEffect(HoverEffectType hoverEffect)
386 {
387     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
388     CHECK_NULL_VOID(frameNode);
389     auto pattern = frameNode->GetPattern<SwitchPattern>();
390     if (pattern) {
391         pattern->SetShowHoverEffect(hoverEffect != HoverEffectType::NONE);
392     }
393     if (hoverEffect == HoverEffectType::BOARD) {
394         return;
395     }
396     NG::ViewAbstract::SetHoverEffect(hoverEffect);
397 }
398 
Pop()399 void ToggleModelNG::Pop()
400 {
401     ViewStackProcessor::GetInstance()->PopContainer();
402 }
403 
SetPointRadius(const Dimension & switchPointRadius)404 void ToggleModelNG::SetPointRadius(const Dimension& switchPointRadius)
405 {
406     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
407     CHECK_NULL_VOID(frameNode);
408     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
409     if (paintProperty) {
410         paintProperty->UpdatePointRadius(switchPointRadius);
411     }
412 }
413 
ResetPointRadius()414 void ToggleModelNG::ResetPointRadius()
415 {
416     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
417     CHECK_NULL_VOID(frameNode);
418     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
419     if (paintProperty) {
420         paintProperty->ResetPointRadius();
421         paintProperty->UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER);
422     }
423 }
424 
SetPointRadius(FrameNode * frameNode,const Dimension & switchPointRadius)425 void ToggleModelNG::SetPointRadius(FrameNode* frameNode, const Dimension& switchPointRadius)
426 {
427     CHECK_NULL_VOID(frameNode);
428     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
429     if (paintProperty) {
430         paintProperty->UpdatePointRadius(switchPointRadius);
431     }
432 }
433 
ResetPointRadius(FrameNode * frameNode)434 void ToggleModelNG::ResetPointRadius(FrameNode* frameNode)
435 {
436     CHECK_NULL_VOID(frameNode);
437     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
438     if (paintProperty) {
439         paintProperty->ResetPointRadius();
440         paintProperty->UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER);
441     }
442 }
443 
SetUnselectedColor(const Color & unselectedColor)444 void ToggleModelNG::SetUnselectedColor(const Color& unselectedColor)
445 {
446     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
447     CHECK_NULL_VOID(frameNode);
448     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
449     if (paintProperty) {
450         paintProperty->UpdateUnselectedColor(unselectedColor);
451     }
452 }
453 
SetUnselectedColorSetByUser(const bool flag)454 void ToggleModelNG::SetUnselectedColorSetByUser(const bool flag)
455 {
456     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
457     CHECK_NULL_VOID(frameNode);
458     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
459     if (paintProperty) {
460         paintProperty->UpdateUnselectedColorSetByUser(flag);
461     }
462 }
463 
SetUnselectedColor(FrameNode * frameNode,const Color & unselectedColor)464 void ToggleModelNG::SetUnselectedColor(FrameNode* frameNode, const Color& unselectedColor)
465 {
466     CHECK_NULL_VOID(frameNode);
467     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
468     if (paintProperty) {
469         paintProperty->UpdateUnselectedColor(unselectedColor);
470     }
471 }
472 
SetUnselectedColorSetByUser(FrameNode * frameNode,const bool flag)473 void ToggleModelNG::SetUnselectedColorSetByUser(FrameNode* frameNode, const bool flag)
474 {
475     ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, UnselectedColorSetByUser, flag, frameNode);
476 }
477 
SetTrackBorderRadius(const Dimension & borderRadius)478 void ToggleModelNG::SetTrackBorderRadius(const Dimension& borderRadius)
479 {
480     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
481     CHECK_NULL_VOID(frameNode);
482     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
483     if (paintProperty) {
484         paintProperty->UpdateTrackBorderRadius(borderRadius);
485     }
486 }
487 
ResetTrackBorderRadius()488 void ToggleModelNG::ResetTrackBorderRadius()
489 {
490     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
491     CHECK_NULL_VOID(frameNode);
492     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
493     if (paintProperty) {
494         paintProperty->ResetTrackBorderRadius();
495         paintProperty->UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER);
496     }
497 }
498 
SetTrackBorderRadius(FrameNode * frameNode,const Dimension & borderRadius)499 void ToggleModelNG::SetTrackBorderRadius(FrameNode* frameNode, const Dimension& borderRadius)
500 {
501     CHECK_NULL_VOID(frameNode);
502     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
503     if (paintProperty) {
504         paintProperty->UpdateTrackBorderRadius(borderRadius);
505     }
506 }
507 
ResetTrackBorderRadius(FrameNode * frameNode)508 void ToggleModelNG::ResetTrackBorderRadius(FrameNode* frameNode)
509 {
510     CHECK_NULL_VOID(frameNode);
511     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
512     if (paintProperty) {
513         paintProperty->ResetTrackBorderRadius();
514         paintProperty->UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER);
515     }
516 }
517 
SetSelectedColor(FrameNode * frameNode,const std::optional<Color> & selectedColor)518 void ToggleModelNG::SetSelectedColor(FrameNode* frameNode, const std::optional<Color>& selectedColor)
519 {
520     CHECK_NULL_VOID(frameNode);
521 
522     auto pipeline = PipelineBase::GetCurrentContextSafely();
523     CHECK_NULL_VOID(pipeline);
524     Color color;
525     if (selectedColor.has_value()) {
526         color = selectedColor.value();
527     }
528 
529     auto checkboxPattern = AceType::DynamicCast<ToggleCheckBoxPattern>(frameNode->GetPattern());
530     if (checkboxPattern) {
531         if (!selectedColor.has_value()) {
532             auto theme = pipeline->GetTheme<CheckboxTheme>(frameNode->GetThemeScopeId());
533             CHECK_NULL_VOID(theme);
534             color = theme->GetActiveColor();
535         }
536         CheckBoxModelNG checkBoxModelNG;
537         checkBoxModelNG.SetSelectedColor(frameNode, color);
538         if (SystemProperties::ConfigChangePerform() && !selectedColor.has_value()) {
539             checkBoxModelNG.SetSelectedColorFlagByUser(frameNode, false);
540         }
541         return;
542     }
543 
544     auto buttonPattern = AceType::DynamicCast<ToggleButtonPattern>(frameNode->GetPattern());
545     if (buttonPattern) {
546         if (!selectedColor.has_value()) {
547             auto theme = pipeline->GetTheme<ToggleTheme>(frameNode->GetThemeScopeId());
548             CHECK_NULL_VOID(theme);
549             color = theme->GetCheckedColor();
550         }
551         ToggleButtonModelNG::SetSelectedColor(frameNode, color);
552         if (SystemProperties::ConfigChangePerform() && !selectedColor.has_value()) {
553             ToggleButtonModelNG::SetSelectedColorSetByUser(frameNode, false);
554         }
555         return;
556     }
557 
558     if (!selectedColor.has_value()) {
559         auto theme = pipeline->GetTheme<SwitchTheme>(frameNode->GetThemeScopeId());
560         CHECK_NULL_VOID(theme);
561         color = theme->GetActiveColor();
562         ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColorSetByUser, false, frameNode);
563     } else {
564         ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColorSetByUser, true, frameNode);
565     }
566 
567     ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColor, color, frameNode);
568 }
569 
SetSwitchPointColor(FrameNode * frameNode,const std::optional<Color> & switchPointColor)570 void ToggleModelNG::SetSwitchPointColor(FrameNode* frameNode, const std::optional<Color>& switchPointColor)
571 {
572     CHECK_NULL_VOID(frameNode);
573     auto pipeline = PipelineBase::GetCurrentContextSafely();
574     CHECK_NULL_VOID(pipeline);
575     Color color;
576     if (switchPointColor.has_value()) {
577         color = switchPointColor.value();
578     }
579 
580     if (!switchPointColor.has_value()) {
581         auto theme = pipeline->GetTheme<SwitchTheme>(frameNode->GetThemeScopeId());
582         CHECK_NULL_VOID(theme);
583         color = theme->GetPointColor();
584     }
585     ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SwitchPointColor, color, frameNode);
586 }
587 
SetSwitchPointColorSetByUser(FrameNode * frameNode,const bool flag)588 void ToggleModelNG::SetSwitchPointColorSetByUser(FrameNode* frameNode, const bool flag)
589 {
590     ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SwitchPointColorSetByUser, flag, frameNode);
591 }
592 
SetBackgroundColor(FrameNode * frameNode,const Color & color)593 void ToggleModelNG::SetBackgroundColor(FrameNode* frameNode, const Color& color)
594 {
595     ToggleButtonModelNG::SetBackgroundColor(frameNode, color);
596 }
597 
SetHeight(FrameNode * frameNode,const Dimension & height)598 void ToggleModelNG::SetHeight(FrameNode* frameNode, const Dimension& height)
599 {
600     NG::ViewAbstract::SetHeight(frameNode, NG::CalcLength(height));
601 }
602 
SetPadding(FrameNode * frameNode,const NG::PaddingPropertyF &,const NG::PaddingProperty & newArgs)603 void ToggleModelNG::SetPadding(
604     FrameNode* frameNode, const NG::PaddingPropertyF& /*args*/, const NG::PaddingProperty& newArgs)
605 {
606     NG::ViewAbstract::SetPadding(frameNode, newArgs);
607 }
608 
SetResponseRegion(FrameNode * frameNode,const std::vector<DimensionRect> & responseRegion)609 void ToggleModelNG::SetResponseRegion(FrameNode* frameNode, const std::vector<DimensionRect>& responseRegion)
610 {
611     CHECK_NULL_VOID(frameNode);
612     NG::ViewAbstract::SetResponseRegion(frameNode, responseRegion);
613     auto pattern = frameNode->GetPattern<SwitchPattern>();
614     CHECK_NULL_VOID(pattern);
615     pattern->SetIsUserSetResponseRegion(true);
616 }
617 
SetHoverEffect(FrameNode * frameNode,HoverEffectType hoverEffect)618 void ToggleModelNG::SetHoverEffect(FrameNode* frameNode, HoverEffectType hoverEffect)
619 {
620     CHECK_NULL_VOID(frameNode);
621     auto pattern = frameNode->GetPattern<SwitchPattern>();
622     if (pattern) {
623         pattern->SetShowHoverEffect(hoverEffect != HoverEffectType::NONE);
624     }
625     if (hoverEffect == HoverEffectType::BOARD) {
626         return;
627     }
628     NG::ViewAbstract::SetHoverEffect(frameNode, hoverEffect);
629 }
630 
SetToggleState(FrameNode * frameNode,bool isOn)631 void ToggleModelNG::SetToggleState(FrameNode* frameNode, bool isOn)
632 {
633     CHECK_NULL_VOID(frameNode);
634     auto refNode = AceType::Claim(frameNode);
635     CHECK_NULL_VOID(refNode);
636     auto pattern = frameNode->GetPattern();
637     CHECK_NULL_VOID(pattern);
638     if (AceType::InstanceOf<SwitchPattern>(pattern)) {
639         UpdateSwitchIsOn(refNode, isOn);
640     } else if (AceType::InstanceOf<CheckBoxPattern>(pattern)) {
641         UpdateCheckboxIsOn(refNode, isOn);
642     } else if (AceType::InstanceOf<ButtonPattern>(pattern)) {
643         UpdateToggleButtonIsOn(refNode, isOn);
644     }
645 }
646 
GetSelectedColor(FrameNode * frameNode)647 Color ToggleModelNG::GetSelectedColor(FrameNode* frameNode)
648 {
649     Color value;
650     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
651         SwitchPaintProperty, SelectedColor, value, frameNode, Color(DEFAULT_COLOR));
652     return value;
653 }
654 
GetSwitchPointColor(FrameNode * frameNode)655 Color ToggleModelNG::GetSwitchPointColor(FrameNode* frameNode)
656 {
657     Color value;
658     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
659         SwitchPaintProperty, SwitchPointColor, value, frameNode, Color(DEFAULT_COLOR));
660     return value;
661 }
662 
SetSwitchIsOn(FrameNode * frameNode,bool isOn)663 void ToggleModelNG::SetSwitchIsOn(FrameNode* frameNode, bool isOn)
664 {
665     CHECK_NULL_VOID(frameNode);
666     auto eventHub = frameNode->GetOrCreateEventHub<SwitchEventHub>();
667     CHECK_NULL_VOID(eventHub);
668     eventHub->SetCurrentUIState(UI_STATE_SELECTED, isOn);
669     ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, IsOn, isOn, frameNode);
670 }
671 
CreateWithColorResourceObj(const RefPtr<ResourceObject> & resObj,const ToggleColorType toggleColorType)672 void ToggleModelNG::CreateWithColorResourceObj(
673     const RefPtr<ResourceObject>& resObj, const ToggleColorType toggleColorType)
674 {
675     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
676     CHECK_NULL_VOID(frameNode);
677     CreateWithResourceObj(frameNode, toggleColorType, resObj);
678 }
679 
SetSwitchDefaultColor(FrameNode * frameNode,const ToggleColorType type)680 void ToggleModelNG::SetSwitchDefaultColor(FrameNode* frameNode, const ToggleColorType type)
681 {
682     // Set the default color for switch based on the type, For Switch, only these four color types need to be handled:
683     // SELECTED_COLOR, SWITCH_POINT_COLOR, UN_SELECTED_COLOR, BACKGROUND_COLOR
684     CHECK_NULL_VOID(frameNode);
685     auto pipeline = frameNode->GetContext();
686     CHECK_NULL_VOID(pipeline);
687     auto theme = pipeline->GetTheme<SwitchTheme>();
688     CHECK_NULL_VOID(theme);
689     Color color;
690     switch (type) {
691         case ToggleColorType::SELECTED_COLOR:
692             color = theme->GetActiveColor();
693             ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColor, color, frameNode);
694             break;
695         case ToggleColorType::SWITCH_POINT_COLOR:
696             color = theme->GetPointColor();
697             ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SwitchPointColor, color, frameNode);
698             break;
699         case ToggleColorType::UN_SELECTED_COLOR:
700             color = theme->GetInactiveColor();
701             SetUnselectedColor(frameNode, color);
702             break;
703         case ToggleColorType::BACKGROUND_COLOR:
704             color = Color::TRANSPARENT;
705             ToggleButtonModelNG::SetBackgroundColor(frameNode, color, false);
706             break;
707         default:
708             break;
709     }
710 }
711 
CreateWithSwitchResourceObj(FrameNode * node,const ToggleColorType toggleColorType,const RefPtr<ResourceObject> & resObj,const std::string & key)712 void ToggleModelNG::CreateWithSwitchResourceObj(FrameNode* node, const ToggleColorType toggleColorType,
713     const RefPtr<ResourceObject>& resObj, const std::string& key)
714 {
715     CHECK_NULL_VOID(node);
716     auto pattern = node->GetPattern<SwitchPattern>();
717     CHECK_NULL_VOID(pattern);
718     if (!resObj) {
719         pattern->RemoveResObj(key);
720         return;
721     }
722     auto&& updateFunc = [toggleColorType, weak = AceType::WeakClaim(node)](const RefPtr<ResourceObject>& resObj) {
723         auto frameNode = weak.Upgrade();
724         CHECK_NULL_VOID(frameNode);
725         CHECK_NULL_VOID(resObj);
726         Color result;
727         if (!ResourceParseUtils::ParseResColor(resObj, result)) {
728             SetSwitchDefaultColor(AceType::RawPtr(frameNode), toggleColorType);
729             return;
730         }
731         switch (toggleColorType) {
732             case ToggleColorType::SELECTED_COLOR:
733                 SetSelectedColor(AceType::RawPtr(frameNode), result);
734                 break;
735             case ToggleColorType::SWITCH_POINT_COLOR:
736                 SetSwitchPointColor(AceType::RawPtr(frameNode), result);
737                 break;
738             case ToggleColorType::UN_SELECTED_COLOR:
739                 SetUnselectedColor(AceType::RawPtr(frameNode), result);
740                 break;
741             case ToggleColorType::BACKGROUND_COLOR:
742                 SetBackgroundColor(AceType::RawPtr(frameNode), result);
743                 break;
744             default:
745                 break;
746         }
747         frameNode->MarkModifyDone();
748         frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
749     };
750     pattern->AddResObj(key, resObj, std::move(updateFunc));
751 }
752 
SetCheckboxDefaultColor(FrameNode * frameNode,const ToggleColorType type)753 void ToggleModelNG::SetCheckboxDefaultColor(FrameNode* frameNode, const ToggleColorType type)
754 {
755     // Set the default color for checkbox based on the type, For checkbox, only these two color types need to be
756     // handled: SELECTED_COLOR, BACKGROUND_COLOR
757     CHECK_NULL_VOID(frameNode);
758     if (type == ToggleColorType::SELECTED_COLOR) {
759         auto pipeline = frameNode->GetContext();
760         CHECK_NULL_VOID(pipeline);
761         auto theme = pipeline->GetTheme<CheckboxTheme>();
762         CHECK_NULL_VOID(theme);
763         auto color = theme->GetActiveColor();
764         ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColor, color, frameNode);
765     } else if (type == ToggleColorType::BACKGROUND_COLOR) {
766         Color color = Color::TRANSPARENT;
767         ToggleButtonModelNG::SetBackgroundColor(frameNode, color, false);
768     }
769 }
770 
CreateWithCheckBoxResourceObj(FrameNode * node,const ToggleColorType toggleColorType,const RefPtr<ResourceObject> & resObj,const std::string & key)771 void ToggleModelNG::CreateWithCheckBoxResourceObj(FrameNode* node, const ToggleColorType toggleColorType,
772     const RefPtr<ResourceObject>& resObj, const std::string& key)
773 {
774     CHECK_NULL_VOID(node);
775     auto pattern = node->GetPattern<ToggleCheckBoxPattern>();
776     CHECK_NULL_VOID(pattern);
777     if (!resObj) {
778         pattern->RemoveResObj(key);
779         return;
780     }
781     auto&& updateFunc = [toggleColorType, weak = AceType::WeakClaim(node)](const RefPtr<ResourceObject>& resObj) {
782         auto frameNode = weak.Upgrade();
783         CHECK_NULL_VOID(frameNode);
784         CHECK_NULL_VOID(resObj);
785         Color result;
786         if (!ResourceParseUtils::ParseResColor(resObj, result)) {
787             SetCheckboxDefaultColor(AceType::RawPtr(frameNode), toggleColorType);
788             return;
789         }
790         if (toggleColorType == ToggleColorType::SELECTED_COLOR) {
791             SetSelectedColor(AceType::RawPtr(frameNode), result);
792             frameNode->MarkModifyDone();
793             frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
794         } else {
795             SetBackgroundColor(AceType::RawPtr(frameNode), result);
796         }
797     };
798     pattern->AddResObj(key, resObj, std::move(updateFunc));
799 }
800 
SetButtonDefaultColor(FrameNode * frameNode,const ToggleColorType type)801 void ToggleModelNG::SetButtonDefaultColor(FrameNode* frameNode, const ToggleColorType type)
802 {
803     // Set the default color for button based on the type,For button, only these two color types need to be
804     // handled: SELECTED_COLOR, BACKGROUND_COLOR
805     CHECK_NULL_VOID(frameNode);
806     if (type == ToggleColorType::SELECTED_COLOR) {
807         auto pipeline = frameNode->GetContext();
808         CHECK_NULL_VOID(pipeline);
809         auto theme = pipeline->GetTheme<ToggleTheme>();
810         CHECK_NULL_VOID(theme);
811         auto color = theme->GetCheckedColor();
812         ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColor, color, frameNode);
813     } else if (type == ToggleColorType::BACKGROUND_COLOR) {
814         Color color = Color::TRANSPARENT;
815         ToggleButtonModelNG::SetBackgroundColor(frameNode, color, false);
816     }
817 }
818 
CreateWithButtonResourceObj(FrameNode * node,const ToggleColorType toggleColorType,const RefPtr<ResourceObject> & resObj,const std::string & key)819 void ToggleModelNG::CreateWithButtonResourceObj(FrameNode* node, const ToggleColorType toggleColorType,
820     const RefPtr<ResourceObject>& resObj, const std::string& key)
821 {
822     CHECK_NULL_VOID(node);
823     auto pattern = node->GetPattern<ToggleButtonPattern>();
824     CHECK_NULL_VOID(pattern);
825     if (!resObj) {
826         pattern->RemoveResObj(key);
827         return;
828     }
829     auto&& updateFunc = [toggleColorType, weak = AceType::WeakClaim(node)](const RefPtr<ResourceObject>& resObj) {
830         auto frameNode = weak.Upgrade();
831         CHECK_NULL_VOID(frameNode);
832         CHECK_NULL_VOID(resObj);
833         Color result;
834         if (!ResourceParseUtils::ParseResColor(resObj, result)) {
835             SetButtonDefaultColor(AceType::RawPtr(frameNode), toggleColorType);
836             return;
837         }
838         if (toggleColorType == ToggleColorType::SELECTED_COLOR) {
839             SetSelectedColor(AceType::RawPtr(frameNode), result);
840             frameNode->MarkModifyDone();
841             frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
842         } else if (toggleColorType == ToggleColorType::BACKGROUND_COLOR) {
843             SetBackgroundColor(AceType::RawPtr(frameNode), result);
844         }
845     };
846     pattern->AddResObj(key, resObj, std::move(updateFunc));
847 }
848 
CreateWithResourceObj(const FrameNode * node,const ToggleColorType toggleColorType,const RefPtr<ResourceObject> & resObj)849 void ToggleModelNG::CreateWithResourceObj(
850     const FrameNode* node, const ToggleColorType toggleColorType, const RefPtr<ResourceObject>& resObj)
851 {
852     CHECK_NULL_VOID(node);
853     std::string key = "toggle" + ColorTypeToString(toggleColorType);
854     CreateWithSwitchResourceObj(const_cast<FrameNode*>(node), toggleColorType, resObj, key);
855     CreateWithCheckBoxResourceObj(const_cast<FrameNode*>(node), toggleColorType, resObj, key);
856     CreateWithButtonResourceObj(const_cast<FrameNode*>(node), toggleColorType, resObj, key);
857 }
858 
CreateWithDimensionVpResourceObj(const RefPtr<ResourceObject> & resObj,const ToggleDimensionType toggleDimensionType)859 void ToggleModelNG::CreateWithDimensionVpResourceObj(
860     const RefPtr<ResourceObject>& resObj, const ToggleDimensionType toggleDimensionType)
861 {
862     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
863     CHECK_NULL_VOID(frameNode);
864     CreateWithResourceObj(frameNode, toggleDimensionType, resObj);
865 }
866 
CreateWithResourceObj(FrameNode * node,const ToggleDimensionType toggleDimensionType,const RefPtr<ResourceObject> & resObj)867 void ToggleModelNG::CreateWithResourceObj(
868     FrameNode* node, const ToggleDimensionType toggleDimensionType, const RefPtr<ResourceObject>& resObj)
869 {
870     CHECK_NULL_VOID(node);
871     auto pattern = node->GetPattern<SwitchPattern>();
872     CHECK_NULL_VOID(pattern);
873     std::string key = "toggle" + DimensionTypeToString(toggleDimensionType);
874     if (!resObj) {
875         pattern->RemoveResObj(key);
876         return;
877     }
878     auto&& updateFunc = [toggleDimensionType, weak = AceType::WeakClaim(node)](const RefPtr<ResourceObject>& resObj) {
879         auto frameNode = weak.Upgrade();
880         CHECK_NULL_VOID(frameNode);
881         CHECK_NULL_VOID(resObj);
882         CalcDimension result;
883         if (!ResourceParseUtils::ParseResDimensionVpNG(resObj, result, false) && !result.IsNegative()) {
884             ResetTrackBorderRadius(AceType::RawPtr(frameNode));
885             return;
886         }
887         switch (toggleDimensionType) {
888             case ToggleDimensionType::POINT_RADIUS:
889                 SetPointRadius(AceType::RawPtr(frameNode), result);
890                 break;
891             case ToggleDimensionType::TRACK_BORDER_RADIUS:
892                 SetTrackBorderRadius(AceType::RawPtr(frameNode), result);
893                 break;
894             default:
895                 break;
896         }
897     };
898     pattern->AddResObj(key, resObj, std::move(updateFunc));
899 }
900 
ColorTypeToString(const ToggleColorType toggleColorType)901 std::string ToggleModelNG::ColorTypeToString(const ToggleColorType toggleColorType)
902 {
903     std::string rst;
904     switch (toggleColorType) {
905         case ToggleColorType::SELECTED_COLOR:
906             rst = "SelectedColor";
907             break;
908         case ToggleColorType::SWITCH_POINT_COLOR:
909             rst = "SwitchPointColor";
910             break;
911         case ToggleColorType::UN_SELECTED_COLOR:
912             rst = "UnselectedColor";
913             break;
914         default:
915             rst = "Unknown";
916             break;
917     }
918     return rst;
919 }
920 
DimensionTypeToString(const ToggleDimensionType toggleDimensionType)921 std::string ToggleModelNG::DimensionTypeToString(const ToggleDimensionType toggleDimensionType)
922 {
923     std::string rst;
924     switch (toggleDimensionType) {
925         case ToggleDimensionType::POINT_RADIUS:
926             rst = "PointRadius";
927             break;
928         case ToggleDimensionType::TRACK_BORDER_RADIUS:
929             rst = "TrackBorderRadius";
930             break;
931         default:
932             rst = "Unknown";
933             break;
934     }
935     return rst;
936 }
937 
UpdateSwitchIsOn(const RefPtr<FrameNode> & frameNode,bool isOn)938 void ToggleModelNG::UpdateSwitchIsOn(const RefPtr<FrameNode>& frameNode, bool isOn)
939 {
940     CHECK_NULL_VOID(frameNode);
941     auto eventHub = frameNode->GetOrCreateEventHub<SwitchEventHub>();
942     CHECK_NULL_VOID(eventHub);
943     eventHub->SetCurrentUIState(UI_STATE_SELECTED, isOn);
944     auto paintProperty = frameNode->GetPaintPropertyPtr<SwitchPaintProperty>();
945     CHECK_NULL_VOID(paintProperty);
946     if (paintProperty->HasIsOn() && paintProperty->GetIsOn().value() != isOn) {
947         TAG_LOGI(AceLogTag::ACE_SELECT_COMPONENT, "switch update isOn %{public}d", isOn);
948     }
949     paintProperty->UpdateIsOn(isOn);
950 }
951 
UpdateCheckboxIsOn(const RefPtr<FrameNode> & frameNode,bool isOn)952 void ToggleModelNG::UpdateCheckboxIsOn(const RefPtr<FrameNode>& frameNode, bool isOn)
953 {
954     CHECK_NULL_VOID(frameNode);
955     auto eventHub = frameNode->GetOrCreateEventHub<CheckBoxEventHub>();
956     CHECK_NULL_VOID(eventHub);
957     eventHub->SetCurrentUIState(UI_STATE_SELECTED, isOn);
958     ACE_UPDATE_NODE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxSelect, isOn, frameNode);
959 }
960 
UpdateToggleButtonIsOn(const RefPtr<FrameNode> & frameNode,bool isOn)961 void ToggleModelNG::UpdateToggleButtonIsOn(const RefPtr<FrameNode>& frameNode, bool isOn)
962 {
963     CHECK_NULL_VOID(frameNode);
964     auto eventHub = frameNode->GetOrCreateEventHub<ToggleButtonEventHub>();
965     CHECK_NULL_VOID(eventHub);
966     eventHub->SetCurrentUIState(UI_STATE_SELECTED, isOn);
967     ACE_UPDATE_NODE_PAINT_PROPERTY(ToggleButtonPaintProperty, IsOn, isOn, frameNode);
968 }
969 
GetSwitchIsOn(FrameNode * frameNode)970 bool ToggleModelNG::GetSwitchIsOn(FrameNode* frameNode)
971 {
972     bool value = false;
973     CHECK_NULL_RETURN(frameNode, value);
974     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(SwitchPaintProperty, IsOn, value, frameNode, value);
975     return value;
976 }
977 
GetUnselectedColor(FrameNode * frameNode)978 Color ToggleModelNG::GetUnselectedColor(FrameNode* frameNode)
979 {
980     Color value;
981     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
982         SwitchPaintProperty, UnselectedColor, value, frameNode, Color(DEFAULT_COLOR));
983     return value;
984 }
985 
SetIsUserSetMargin(bool isUserSet)986 void ToggleModelNG::SetIsUserSetMargin(bool isUserSet)
987 {
988     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
989     CHECK_NULL_VOID(frameNode);
990     SetIsUserSetMargin(frameNode, isUserSet);
991 }
992 
SetIsUserSetMargin(FrameNode * frameNode,bool isUserSet)993 void ToggleModelNG::SetIsUserSetMargin(FrameNode* frameNode, bool isUserSet)
994 {
995     CHECK_NULL_VOID(frameNode);
996     auto pattern = frameNode->GetPattern();
997     CHECK_NULL_VOID(pattern);
998     if (AceType::InstanceOf<SwitchPattern>(pattern)) {
999         auto switchPattern = AceType::DynamicCast<SwitchPattern>(pattern);
1000         CHECK_NULL_VOID(switchPattern);
1001         switchPattern->SetIsUserSetMargin(isUserSet);
1002     } else if (AceType::InstanceOf<CheckBoxPattern>(pattern)) {
1003         auto checkboxPattern = AceType::DynamicCast<CheckBoxPattern>(pattern);
1004         CHECK_NULL_VOID(checkboxPattern);
1005         checkboxPattern->SetIsUserSetMargin(isUserSet);
1006     }
1007 }
1008 } // namespace OHOS::Ace::NG
1009