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