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