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