• 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 "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/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 
Create(NG::ToggleType toggleType,bool isOn)38 void ToggleModelNG::Create(NG::ToggleType toggleType, bool isOn)
39 {
40     auto* stack = ViewStackProcessor::GetInstance();
41     int nodeId = stack->ClaimNodeId();
42     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TOGGLE_ETS_TAG, nodeId);
43     auto childFrameNode = FrameNode::GetFrameNode(V2::TOGGLE_ETS_TAG, nodeId);
44     if (!childFrameNode) {
45         switch (toggleType) {
46             case ToggleType::CHECKBOX: {
47                 CheckBoxModelNG checkBoxModelNG;
48                 CreateCheckbox(nodeId);
49                 checkBoxModelNG.SetSelect(isOn);
50                 break;
51             }
52             case ToggleType::SWITCH: {
53                 CreateSwitch(nodeId);
54                 SetSwitchSelected(childFrameNode, isOn);
55                 ACE_UPDATE_PAINT_PROPERTY(SwitchPaintProperty, IsOn, isOn);
56                 break;
57             }
58             case ToggleType::BUTTON: {
59                 CreateButton(nodeId);
60                 ToggleButtonModelNG::SetIsOn(isOn);
61                 break;
62             }
63             default:
64                 break;
65         }
66         return;
67     }
68     auto pattern = childFrameNode->GetPattern();
69     if (AceType::InstanceOf<CheckBoxPattern>(pattern)) {
70         if (toggleType == ToggleType::CHECKBOX) {
71             stack->Push(childFrameNode);
72             CheckBoxModelNG checkBoxModelNG;
73             checkBoxModelNG.SetSelect(isOn);
74             return;
75         }
76         if (toggleType == ToggleType::SWITCH) {
77             auto parentFrame = childFrameNode->GetParent();
78             CHECK_NULL_VOID(parentFrame);
79             auto index = RemoveNode(childFrameNode, nodeId);
80             childFrameNode->SetUndefinedNodeId();
81             CreateSwitch(nodeId);
82             SetSwitchSelected(childFrameNode, isOn);
83             ACE_UPDATE_PAINT_PROPERTY(SwitchPaintProperty, IsOn, isOn);
84             AddNewChild(parentFrame, nodeId, index);
85             return;
86         }
87         auto parentFrame = childFrameNode->GetParent();
88         CHECK_NULL_VOID(parentFrame);
89         auto index = RemoveNode(childFrameNode, nodeId);
90         childFrameNode->SetUndefinedNodeId();
91         CreateButton(nodeId);
92         ToggleButtonModelNG::SetIsOn(isOn);
93         AddNewChild(parentFrame, nodeId, index);
94         return;
95     }
96     if (AceType::InstanceOf<SwitchPattern>(pattern)) {
97         if (toggleType == ToggleType::SWITCH) {
98             SetSwitchSelected(childFrameNode, isOn);
99             stack->Push(childFrameNode);
100             ACE_UPDATE_PAINT_PROPERTY(SwitchPaintProperty, IsOn, isOn);
101             return;
102         }
103         if (toggleType == ToggleType::CHECKBOX) {
104             auto parentFrame = childFrameNode->GetParent();
105             CHECK_NULL_VOID(parentFrame);
106             auto index = RemoveNode(childFrameNode, nodeId);
107             childFrameNode->SetUndefinedNodeId();
108             CheckBoxModelNG checkBoxModelNG;
109             CreateCheckbox(nodeId);
110             checkBoxModelNG.SetSelect(isOn);
111             AddNewChild(parentFrame, nodeId, index);
112             return;
113         }
114         auto parentFrame = childFrameNode->GetParent();
115         CHECK_NULL_VOID(parentFrame);
116         auto index = RemoveNode(childFrameNode, nodeId);
117         childFrameNode->SetUndefinedNodeId();
118         CreateButton(nodeId);
119         ToggleButtonModelNG::SetIsOn(isOn);
120         AddNewChild(parentFrame, nodeId, index);
121         return;
122     }
123     if (AceType::InstanceOf<ToggleButtonPattern>(pattern)) {
124         if (toggleType == ToggleType::BUTTON) {
125             stack->Push(childFrameNode);
126             ToggleButtonModelNG::SetIsOn(isOn);
127             return;
128         }
129         if (toggleType == ToggleType::CHECKBOX) {
130             auto parentFrame = childFrameNode->GetParent();
131             CHECK_NULL_VOID(parentFrame);
132             auto index = RemoveNode(childFrameNode, nodeId);
133             childFrameNode->SetUndefinedNodeId();
134             CheckBoxModelNG checkBoxModelNG;
135             CreateCheckbox(nodeId);
136             checkBoxModelNG.SetSelect(isOn);
137             AddNewChild(parentFrame, nodeId, index);
138             return;
139         }
140         auto parentFrame = childFrameNode->GetParent();
141         CHECK_NULL_VOID(parentFrame);
142         auto index = RemoveNode(childFrameNode, nodeId);
143         childFrameNode->SetUndefinedNodeId();
144         CreateSwitch(nodeId);
145         SetSwitchSelected(childFrameNode, isOn);
146         ACE_UPDATE_PAINT_PROPERTY(SwitchPaintProperty, IsOn, isOn);
147         AddNewChild(parentFrame, nodeId, index);
148     }
149 }
CreateFrameNode(int32_t nodeId,ToggleType toggleType,bool isOn)150 RefPtr<FrameNode> ToggleModelNG::CreateFrameNode(int32_t nodeId, ToggleType toggleType, bool isOn)
151 {
152     RefPtr<FrameNode> frameNode = nullptr;
153     switch (toggleType) {
154         case ToggleType::CHECKBOX: {
155             frameNode = CreateCheckboxFrameNode(nodeId, isOn);
156             break;
157         }
158         case ToggleType::SWITCH: {
159             frameNode = CreateSwitchFrameNode(nodeId, isOn);
160             break;
161         }
162         case ToggleType::BUTTON: {
163             frameNode = CreateButtonFrameNode(nodeId, isOn);
164             break;
165         }
166         default:
167             break;
168     }
169     return frameNode;
170 }
SetSwitchSelected(RefPtr<FrameNode> & childFrameNode,bool isOn)171 void ToggleModelNG::SetSwitchSelected(RefPtr<FrameNode>& childFrameNode, bool isOn)
172 {
173     if (!childFrameNode) {
174         auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
175         CHECK_NULL_VOID(frameNode);
176         childFrameNode = frameNode;
177     }
178     auto eventHub = childFrameNode->GetEventHub<SwitchEventHub>();
179     CHECK_NULL_VOID(eventHub);
180     eventHub->SetCurrentUIState(UI_STATE_SELECTED, isOn);
181 }
182 
SetSelectedColor(const std::optional<Color> & selectedColor)183 void ToggleModelNG::SetSelectedColor(const std::optional<Color>& selectedColor)
184 {
185     auto* stack = ViewStackProcessor::GetInstance();
186     CHECK_NULL_VOID(stack);
187     auto pipeline = PipelineBase::GetCurrentContext();
188     CHECK_NULL_VOID(pipeline);
189     Color color;
190     if (selectedColor.has_value()) {
191         color = selectedColor.value();
192     }
193 
194     auto checkboxPattern = stack->GetMainFrameNodePattern<CheckBoxPattern>();
195     if (checkboxPattern) {
196         if (!selectedColor.has_value()) {
197             auto theme = pipeline->GetTheme<CheckboxTheme>();
198             CHECK_NULL_VOID(theme);
199             color = theme->GetActiveColor();
200         }
201         CheckBoxModelNG checkBoxModelNG;
202         checkBoxModelNG.SetSelectedColor(color);
203         return;
204     }
205     auto buttonPattern = stack->GetMainFrameNodePattern<ToggleButtonPattern>();
206     if (buttonPattern) {
207         if (!selectedColor.has_value()) {
208             auto theme = pipeline->GetTheme<ToggleTheme>();
209             CHECK_NULL_VOID(theme);
210             color = theme->GetCheckedColor();
211         }
212         ToggleButtonModelNG::SetSelectedColor(color);
213         return;
214     }
215 
216     if (!selectedColor.has_value()) {
217         auto theme = pipeline->GetTheme<SwitchTheme>();
218         CHECK_NULL_VOID(theme);
219         color = theme->GetActiveColor();
220     }
221     ACE_UPDATE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColor, color);
222 }
223 
SetSwitchPointColor(const Color & switchPointColor)224 void ToggleModelNG::SetSwitchPointColor(const Color& switchPointColor)
225 {
226     ACE_UPDATE_PAINT_PROPERTY(SwitchPaintProperty, SwitchPointColor, switchPointColor);
227 }
OnChange(ChangeEvent && onChange)228 void ToggleModelNG::OnChange(ChangeEvent&& onChange)
229 {
230     auto* stack = ViewStackProcessor::GetInstance();
231     CHECK_NULL_VOID(stack);
232     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
233     CHECK_NULL_VOID(frameNode);
234     auto checkboxPattern = stack->GetMainFrameNodePattern<CheckBoxPattern>();
235     if (checkboxPattern) {
236         auto eventHub = frameNode->GetEventHub<CheckBoxEventHub>();
237         CHECK_NULL_VOID(eventHub);
238         eventHub->SetOnChange(std::move(onChange));
239         return;
240     }
241     auto buttonPattern = stack->GetMainFrameNodePattern<ToggleButtonPattern>();
242     if (buttonPattern) {
243         auto eventHub = frameNode->GetEventHub<ToggleButtonEventHub>();
244         CHECK_NULL_VOID(eventHub);
245         eventHub->SetOnChange(std::move(onChange));
246         return;
247     }
248     auto eventHub = frameNode->GetEventHub<SwitchEventHub>();
249     CHECK_NULL_VOID(eventHub);
250     eventHub->SetOnChange(std::move(onChange));
251 }
252 
OnChange(FrameNode * frameNode,ChangeEvent && onChange)253 void ToggleModelNG::OnChange(FrameNode* frameNode, ChangeEvent&& onChange)
254 {
255     CHECK_NULL_VOID(frameNode);
256     auto checkboxPattern = AceType::DynamicCast<CheckBoxPattern>(frameNode->GetPattern());
257     if (checkboxPattern) {
258         auto eventHub = frameNode->GetEventHub<CheckBoxEventHub>();
259         CHECK_NULL_VOID(eventHub);
260         eventHub->SetOnChange(std::move(onChange));
261         return;
262     }
263     auto buttonPattern = AceType::DynamicCast<ToggleButtonPattern>(frameNode->GetPattern());
264     if (buttonPattern) {
265         auto eventHub = frameNode->GetEventHub<ToggleButtonEventHub>();
266         CHECK_NULL_VOID(eventHub);
267         eventHub->SetOnChange(std::move(onChange));
268         return;
269     }
270     auto eventHub = frameNode->GetEventHub<SwitchEventHub>();
271     CHECK_NULL_VOID(eventHub);
272     eventHub->SetOnChange(std::move(onChange));
273 }
274 
SetWidth(const Dimension & width)275 void ToggleModelNG::SetWidth(const Dimension& width)
276 {
277     NG::ViewAbstract::SetWidth(NG::CalcLength(width));
278 }
279 
SetHeight(const Dimension & height)280 void ToggleModelNG::SetHeight(const Dimension& height)
281 {
282     NG::ViewAbstract::SetHeight(NG::CalcLength(height));
283 }
284 
SetBackgroundColor(const Color & color)285 void ToggleModelNG::SetBackgroundColor(const Color& color)
286 {
287     ToggleButtonModelNG::SetBackgroundColor(color);
288 }
289 
IsToggle()290 bool ToggleModelNG::IsToggle()
291 {
292     return false;
293 }
294 
SetPadding(const NG::PaddingPropertyF &,const NG::PaddingProperty & newArgs)295 void ToggleModelNG::SetPadding(const NG::PaddingPropertyF& /*args*/, const NG::PaddingProperty& newArgs)
296 {
297     NG::ViewAbstract::SetPadding(newArgs);
298 }
CreateCheckboxFrameNode(int32_t nodeId,bool isOn)299 RefPtr<FrameNode> ToggleModelNG::CreateCheckboxFrameNode(int32_t nodeId, bool isOn)
300 {
301     auto frameNode = FrameNode::CreateFrameNode(V2::CHECKBOX_ETS_TAG, nodeId, AceType::MakeRefPtr<CheckBoxPattern>());
302     CHECK_NULL_RETURN(frameNode, nullptr);
303     CheckBoxModelNG checkBoxModelNG;
304     checkBoxModelNG.SetSelect(isOn);
305     return frameNode;
306 }
307 
CreateSwitchFrameNode(int32_t nodeId,bool isOn)308 RefPtr<FrameNode> ToggleModelNG::CreateSwitchFrameNode(int32_t nodeId, bool isOn)
309 {
310     auto frameNode = FrameNode::CreateFrameNode(V2::TOGGLE_ETS_TAG, nodeId, AceType::MakeRefPtr<SwitchPattern>());
311     CHECK_NULL_RETURN(frameNode, nullptr);
312     auto eventHub = frameNode->GetEventHub<SwitchEventHub>();
313     CHECK_NULL_RETURN(eventHub, nullptr);
314     eventHub->SetCurrentUIState(UI_STATE_SELECTED, isOn);
315     auto paintProperty = frameNode->GetPaintProperty<SwitchPaintProperty>();
316     CHECK_NULL_RETURN(paintProperty, nullptr);
317     paintProperty->UpdateIsOn(isOn);
318     return frameNode;
319 }
320 
CreateButtonFrameNode(int32_t nodeId,bool isOn)321 RefPtr<FrameNode> ToggleModelNG::CreateButtonFrameNode(int32_t nodeId, bool isOn)
322 {
323     auto frameNode = FrameNode::CreateFrameNode(V2::TOGGLE_ETS_TAG, nodeId, AceType::MakeRefPtr<ToggleButtonPattern>());
324     CHECK_NULL_RETURN(frameNode, nullptr);
325     ToggleButtonModelNG::SetIsOn(isOn);
326     return frameNode;
327 }
CreateCheckbox(int32_t nodeId)328 void ToggleModelNG::CreateCheckbox(int32_t nodeId)
329 {
330     auto* stack = ViewStackProcessor::GetInstance();
331     auto frameNode = FrameNode::GetOrCreateFrameNode(
332         V2::CHECKBOX_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<CheckBoxPattern>(); });
333     stack->Push(frameNode);
334 }
335 
CreateSwitch(int32_t nodeId)336 void ToggleModelNG::CreateSwitch(int32_t nodeId)
337 {
338     auto* stack = ViewStackProcessor::GetInstance();
339     auto frameNode = FrameNode::GetOrCreateFrameNode(
340         V2::TOGGLE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<SwitchPattern>(); });
341     stack->Push(frameNode);
342 }
343 
CreateButton(int32_t nodeId)344 void ToggleModelNG::CreateButton(int32_t nodeId)
345 {
346     auto* stack = ViewStackProcessor::GetInstance();
347     auto frameNode = FrameNode::GetOrCreateFrameNode(
348         V2::TOGGLE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ToggleButtonPattern>(); });
349     stack->Push(frameNode);
350 }
351 
AddNewChild(const RefPtr<UINode> & parentFrame,int32_t nodeId,int32_t index)352 void ToggleModelNG::AddNewChild(const RefPtr<UINode>& parentFrame, int32_t nodeId, int32_t index)
353 {
354     auto newFrameNode = FrameNode::GetFrameNode(V2::TOGGLE_ETS_TAG, nodeId);
355     parentFrame->AddChild(newFrameNode, index);
356     newFrameNode->MarkModifyDone();
357 }
358 
RemoveNode(const RefPtr<FrameNode> & childFrameNode,int32_t nodeId)359 int32_t ToggleModelNG::RemoveNode(const RefPtr<FrameNode>& childFrameNode, int32_t nodeId)
360 {
361     ElementRegister::GetInstance()->RemoveItemSilently(nodeId);
362     auto parentFrame = childFrameNode->GetParent();
363     CHECK_NULL_RETURN(parentFrame, 0);
364     return parentFrame->RemoveChildAndReturnIndex(childFrameNode);
365 }
366 
OnChangeEvent(ChangeEvent && onChangeEvent)367 void ToggleModelNG::OnChangeEvent(ChangeEvent&& onChangeEvent)
368 {
369     auto* stack = ViewStackProcessor::GetInstance();
370     CHECK_NULL_VOID(stack);
371     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
372     CHECK_NULL_VOID(frameNode);
373     auto checkboxPattern = stack->GetMainFrameNodePattern<CheckBoxPattern>();
374     if (checkboxPattern) {
375         auto eventHub = frameNode->GetEventHub<CheckBoxEventHub>();
376         CHECK_NULL_VOID(eventHub);
377         eventHub->SetChangeEvent(std::move(onChangeEvent));
378         return;
379     }
380     auto buttonPattern = stack->GetMainFrameNodePattern<ToggleButtonPattern>();
381     if (buttonPattern) {
382         auto eventHub = frameNode->GetEventHub<ToggleButtonEventHub>();
383         CHECK_NULL_VOID(eventHub);
384         eventHub->SetOnChangeEvent(std::move(onChangeEvent));
385         return;
386     }
387     auto eventHub = frameNode->GetEventHub<SwitchEventHub>();
388     CHECK_NULL_VOID(eventHub);
389     eventHub->SetOnChangeEvent(std::move(onChangeEvent));
390 }
391 
SetResponseRegion(const std::vector<DimensionRect> & responseRegion)392 void ToggleModelNG::SetResponseRegion(const std::vector<DimensionRect>& responseRegion)
393 {
394     NG::ViewAbstract::SetResponseRegion(responseRegion);
395     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
396     CHECK_NULL_VOID(frameNode);
397     auto pattern = frameNode->GetPattern<SwitchPattern>();
398     CHECK_NULL_VOID(pattern);
399     pattern->SetIsUserSetResponseRegion(true);
400 }
401 
SetHoverEffect(HoverEffectType hoverEffect)402 void ToggleModelNG::SetHoverEffect(HoverEffectType hoverEffect)
403 {
404     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
405     CHECK_NULL_VOID(frameNode);
406     auto pattern = frameNode->GetPattern<SwitchPattern>();
407     if (pattern) {
408         pattern->SetShowHoverEffect(hoverEffect != HoverEffectType::NONE);
409     }
410     if (hoverEffect == HoverEffectType::BOARD) {
411         return;
412     }
413     NG::ViewAbstract::SetHoverEffect(hoverEffect);
414 }
415 
Pop()416 void ToggleModelNG::Pop()
417 {
418     // button is a container but switch or checkbox is not, container should pop container
419     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
420     CHECK_NULL_VOID(frameNode);
421     auto switchPattern = frameNode->GetPattern<SwitchPattern>();
422     if (switchPattern) {
423         ViewStackProcessor::GetInstance()->Pop();
424         return;
425     }
426     auto checkboxPattern = frameNode->GetPattern<CheckBoxPattern>();
427     if (checkboxPattern) {
428         ViewStackProcessor::GetInstance()->Pop();
429         return;
430     }
431     ViewStackProcessor::GetInstance()->PopContainer();
432 }
433 
SetSelectedColor(FrameNode * frameNode,const std::optional<Color> & selectedColor)434 void ToggleModelNG::SetSelectedColor(FrameNode* frameNode, const std::optional<Color>& selectedColor)
435 {
436     CHECK_NULL_VOID(frameNode);
437 
438     auto pipeline = PipelineBase::GetCurrentContext();
439     CHECK_NULL_VOID(pipeline);
440     Color color;
441     if (selectedColor.has_value()) {
442         color = selectedColor.value();
443     }
444 
445     auto checkboxPattern = AceType::DynamicCast<CheckBoxPattern>(frameNode->GetPattern());
446     if (checkboxPattern) {
447         if (!selectedColor.has_value()) {
448             auto theme = pipeline->GetTheme<CheckboxTheme>();
449             CHECK_NULL_VOID(theme);
450             color = theme->GetActiveColor();
451         }
452         CheckBoxModelNG checkBoxModelNG;
453         checkBoxModelNG.SetSelectedColor(frameNode, color);
454         return;
455     }
456 
457     auto buttonPattern = AceType::DynamicCast<ToggleButtonPattern>(frameNode->GetPattern());
458     if (buttonPattern) {
459         if (!selectedColor.has_value()) {
460             auto theme = pipeline->GetTheme<ToggleTheme>();
461             CHECK_NULL_VOID(theme);
462             color = theme->GetCheckedColor();
463         }
464         ToggleButtonModelNG::SetSelectedColor(frameNode, color);
465         return;
466     }
467 
468     if (!selectedColor.has_value()) {
469         auto theme = pipeline->GetTheme<SwitchTheme>();
470         CHECK_NULL_VOID(theme);
471         color = theme->GetActiveColor();
472     }
473 
474     ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SelectedColor, color, frameNode);
475 }
476 
SetSwitchPointColor(FrameNode * frameNode,const Color & switchPointColor)477 void ToggleModelNG::SetSwitchPointColor(FrameNode* frameNode, const Color& switchPointColor)
478 {
479     ACE_UPDATE_NODE_PAINT_PROPERTY(SwitchPaintProperty, SwitchPointColor, switchPointColor, frameNode);
480 }
481 
SetBackgroundColor(FrameNode * frameNode,const Color & color)482 void ToggleModelNG::SetBackgroundColor(FrameNode* frameNode, const Color& color)
483 {
484     ToggleButtonModelNG::SetBackgroundColor(frameNode, color);
485 }
486 
SetHeight(FrameNode * frameNode,const Dimension & height)487 void ToggleModelNG::SetHeight(FrameNode* frameNode, const Dimension& height)
488 {
489     NG::ViewAbstract::SetHeight(frameNode, NG::CalcLength(height));
490 }
491 
SetPadding(FrameNode * frameNode,const NG::PaddingPropertyF &,const NG::PaddingProperty & newArgs)492 void ToggleModelNG::SetPadding(
493     FrameNode* frameNode, const NG::PaddingPropertyF& /*args*/, const NG::PaddingProperty& newArgs)
494 {
495     NG::ViewAbstract::SetPadding(frameNode, newArgs);
496 }
497 
SetResponseRegion(FrameNode * frameNode,const std::vector<DimensionRect> & responseRegion)498 void ToggleModelNG::SetResponseRegion(FrameNode* frameNode, const std::vector<DimensionRect>& responseRegion)
499 {
500     CHECK_NULL_VOID(frameNode);
501     NG::ViewAbstract::SetResponseRegion(frameNode, responseRegion);
502     auto pattern = frameNode->GetPattern<SwitchPattern>();
503     CHECK_NULL_VOID(pattern);
504     pattern->SetIsUserSetResponseRegion(true);
505 }
506 
SetHoverEffect(FrameNode * frameNode,HoverEffectType hoverEffect)507 void ToggleModelNG::SetHoverEffect(FrameNode* frameNode, HoverEffectType hoverEffect)
508 {
509     CHECK_NULL_VOID(frameNode);
510     auto pattern = frameNode->GetPattern<SwitchPattern>();
511     if (pattern) {
512         pattern->SetShowHoverEffect(hoverEffect != HoverEffectType::NONE);
513     }
514     if (hoverEffect == HoverEffectType::BOARD) {
515         return;
516     }
517     NG::ViewAbstract::SetHoverEffect(frameNode, hoverEffect);
518 }
519 } // namespace OHOS::Ace::NG
520