1 /*
2 * Copyright (c) 2024 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/overlay/group_manager.h"
17
18 #include "base/utils/utils.h"
19 #include "core/components_ng/pattern/stage/page_event_hub.h"
20 #include "core/components_ng/pattern/checkbox/checkbox_pattern.h"
21 #include "core/components_ng/pattern/checkboxgroup/checkboxgroup_paint_property.h"
22 #include "core/components_ng/pattern/checkboxgroup/checkboxgroup_pattern.h"
23 #include "core/components_ng/pattern/radio/radio_paint_property.h"
24 #include "core/components_ng/pattern/radio/radio_pattern.h"
25 #include "core/components_v2/inspector/inspector_constants.h"
26 #include "core/pipeline/base/element_register.h"
27 #include "core/pipeline_ng/ui_task_scheduler.h"
28
29 namespace OHOS::Ace::NG {
30
AddRadioToGroup(const std::string & group,int32_t radioId)31 void GroupManager::AddRadioToGroup(const std::string& group, int32_t radioId)
32 {
33 radioGroupNotify_[group].push_back(radioId);
34 }
35
RemoveRadioFromGroup(const std::string & group,int32_t radioId)36 void GroupManager::RemoveRadioFromGroup(const std::string& group, int32_t radioId)
37 {
38 radioGroupNotify_[group].remove(radioId);
39 }
40
HasRadioId(const std::string & group,int32_t radioId)41 bool GroupManager::HasRadioId(const std::string& group, int32_t radioId)
42 {
43 auto list = radioGroupNotify_[group];
44 auto it = find(list.begin(), list.end(), radioId);
45 return it != list.end();
46 }
47
UpdateRadioGroupValue(const std::string & group,int32_t radioId)48 void GroupManager::UpdateRadioGroupValue(const std::string& group, int32_t radioId)
49 {
50 const auto& list = radioGroupNotify_[group];
51 for (auto&& item : list) {
52 if (item == radioId) {
53 continue;
54 }
55 auto node = DynamicCast<FrameNode>(ElementRegister::GetInstance()->GetNodeById(item));
56 if (!node) {
57 continue;
58 }
59 auto pattern = node->GetPattern<RadioPattern>();
60 if (!pattern) {
61 continue;
62 }
63 pattern->UpdateUncheckStatus(node);
64 }
65 }
66
AddCheckBoxToGroup(const std::string & group,const WeakPtr<FrameNode> & checkBoxNode)67 void GroupManager::AddCheckBoxToGroup(const std::string& group, const WeakPtr<FrameNode>& checkBoxNode)
68 {
69 checkBoxListMap_[group].push_back(checkBoxNode);
70 checkboxChangedMap_[group] = true;
71 }
72
AddCheckBoxGroup(const std::string & group,const WeakPtr<FrameNode> & checkBoxGroupNode)73 void GroupManager::AddCheckBoxGroup(const std::string& group, const WeakPtr<FrameNode>& checkBoxGroupNode)
74 {
75 auto frameNode = checkBoxGroupNode.Upgrade();
76 CHECK_NULL_VOID(frameNode);
77 auto pattern = frameNode->GetPattern<CheckBoxGroupPattern>();
78 CHECK_NULL_VOID(pattern);
79 if (checkBoxGroupMap_[group].Upgrade()) {
80 pattern->SetIsAddToMap(false);
81 } else {
82 pattern->SetIsAddToMap(true);
83 checkBoxGroupMap_[group] = frameNode;
84 }
85 }
86
RemoveCheckBoxFromGroup(const std::string & group,int32_t checkBoxId)87 void GroupManager::RemoveCheckBoxFromGroup(const std::string& group, int32_t checkBoxId)
88 {
89 auto& checkboxList = checkBoxListMap_[group];
90 for (auto && item : checkboxList) {
91 auto frameNode = item.Upgrade();
92 if (frameNode && frameNode->GetId() == checkBoxId) {
93 checkboxList.remove(item);
94 checkboxChangedMap_[group] = true;
95 return;
96 }
97 }
98 }
99
RemoveCheckBoxGroup(const std::string & group,int32_t checkBoxGroupId)100 void GroupManager::RemoveCheckBoxGroup(const std::string& group, int32_t checkBoxGroupId)
101 {
102 auto frameNode = checkBoxGroupMap_[group].Upgrade();
103 if (frameNode && frameNode->GetId() == checkBoxGroupId) {
104 checkBoxGroupMap_.erase(group);
105 }
106 }
107
GetCheckboxList(const std::string & group)108 std::list<RefPtr<FrameNode>> GroupManager::GetCheckboxList(const std::string& group)
109 {
110 auto checkboxList = checkBoxListMap_[group];
111 std::list<RefPtr<FrameNode>> result;
112 for (std::list<WeakPtr<FrameNode>>::iterator iter = checkboxList.begin(); iter != checkboxList.end();) {
113 auto frameNode = (*iter).Upgrade();
114 if (!frameNode) {
115 iter = checkboxList.erase(iter);
116 } else {
117 result.push_back(frameNode);
118 ++iter;
119 }
120 }
121 return result;
122 }
123
GetCheckboxGroup(const std::string & group)124 RefPtr<FrameNode> GroupManager::GetCheckboxGroup(const std::string& group)
125 {
126 return checkBoxGroupMap_[group].Upgrade();
127 }
128
GetGroupManager()129 WeakPtr<GroupManager> GroupManager::GetGroupManager()
130 {
131 WeakPtr<GroupManager> groupManager;
132 auto context = PipelineContext::GetCurrentContext();
133 CHECK_NULL_RETURN(context, nullptr);
134 if (Container::IsInSubContainer()) {
135 auto overlayManager = context->GetOverlayManager();
136 CHECK_NULL_RETURN(overlayManager, nullptr);
137 groupManager = overlayManager->GetGroupManager();
138 } else {
139 auto stageManager = context->GetStageManager();
140 CHECK_NULL_RETURN(stageManager, nullptr);
141 auto pageNode = stageManager->GetLastPage();
142 CHECK_NULL_RETURN(pageNode, nullptr);
143 auto pageEventHub = pageNode->GetEventHub<NG::PageEventHub>();
144 CHECK_NULL_RETURN(pageEventHub, nullptr);
145 groupManager = pageEventHub->GetGroupManager();
146 }
147 return groupManager;
148 }
149 } // namespace OHOS::Ace::NG
150