• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 (std::list<WeakPtr<FrameNode>>::iterator iter = checkboxList.begin(); iter != checkboxList.end();) {
91         auto frameNode = (*iter).Upgrade();
92         if (!frameNode || frameNode->GetId() == checkBoxId) {
93             iter = checkboxList.erase(iter);
94             checkboxChangedMap_[group] = true;
95         } else {
96             ++iter;
97         }
98     }
99 }
100 
RemoveCheckBoxGroup(const std::string & group,int32_t checkBoxGroupId)101 void GroupManager::RemoveCheckBoxGroup(const std::string& group, int32_t checkBoxGroupId)
102 {
103     auto frameNode = checkBoxGroupMap_[group].Upgrade();
104     if (frameNode && frameNode->GetId() == checkBoxGroupId) {
105         checkBoxGroupMap_.erase(group);
106     }
107 }
108 
GetCheckboxList(const std::string & group)109 std::list<RefPtr<FrameNode>> GroupManager::GetCheckboxList(const std::string& group)
110 {
111     auto& checkboxList = checkBoxListMap_[group];
112     std::list<RefPtr<FrameNode>> result;
113     for (std::list<WeakPtr<FrameNode>>::iterator iter = checkboxList.begin(); iter != checkboxList.end();) {
114         auto frameNode = (*iter).Upgrade();
115         if (!frameNode) {
116             iter = checkboxList.erase(iter);
117         } else {
118             result.push_back(frameNode);
119             ++iter;
120         }
121     }
122     return result;
123 }
124 
GetCheckboxGroup(const std::string & group)125 RefPtr<FrameNode> GroupManager::GetCheckboxGroup(const std::string& group)
126 {
127     return checkBoxGroupMap_[group].Upgrade();
128 }
129 
GetGroupManager()130 WeakPtr<GroupManager> GroupManager::GetGroupManager()
131 {
132     WeakPtr<GroupManager> groupManager;
133     auto context = PipelineContext::GetCurrentContext();
134     CHECK_NULL_RETURN(context, nullptr);
135     if (Container::IsInSubContainer()) {
136         auto overlayManager = context->GetOverlayManager();
137         CHECK_NULL_RETURN(overlayManager, nullptr);
138         groupManager = overlayManager->GetGroupManager();
139     } else {
140         auto stageManager = context->GetStageManager();
141         CHECK_NULL_RETURN(stageManager, nullptr);
142         auto pageNode = stageManager->GetLastPage();
143         CHECK_NULL_RETURN(pageNode, nullptr);
144         auto pageEventHub = pageNode->GetEventHub<NG::PageEventHub>();
145         CHECK_NULL_RETURN(pageEventHub, nullptr);
146         groupManager = pageEventHub->GetGroupManager();
147     }
148     return groupManager;
149 }
150 } // namespace OHOS::Ace::NG
151