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