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