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/radio/radio_model_ng.h"
17 
18 #include "base/utils/utils.h"
19 #include "core/components/common/properties/color.h"
20 #include "core/components_ng/base/frame_node.h"
21 #include "core/components_ng/base/view_abstract.h"
22 #include "core/components_ng/base/view_stack_processor.h"
23 #include "core/components_ng/pattern/radio/radio_pattern.h"
24 #include "core/components_ng/pattern/stage/page_event_hub.h"
25 #include "core/components_v2/inspector/inspector_constants.h"
26 
27 namespace OHOS::Ace::NG {
28 
Create(const std::optional<std::string> & value,const std::optional<std::string> & group,const std::optional<int32_t> & indicator)29 void RadioModelNG::Create(const std::optional<std::string>& value, const std::optional<std::string>& group,
30     const std::optional<int32_t>& indicator)
31 {
32     auto* stack = ViewStackProcessor::GetInstance();
33     int32_t nodeId = stack->ClaimNodeId();
34     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::RADIO_ETS_TAG, nodeId);
35     auto frameNode = FrameNode::GetOrCreateFrameNode(
36         V2::RADIO_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<RadioPattern>(); });
37     ViewStackProcessor::GetInstance()->Push(frameNode);
38     auto eventHub = frameNode->GetEventHub<NG::RadioEventHub>();
39     CHECK_NULL_VOID(eventHub);
40     if (value.has_value()) {
41         eventHub->SetValue(value.value());
42     }
43     if (group.has_value()) {
44         eventHub->SetGroup(group.value());
45     }
46     if (indicator.has_value()) {
47         SetRadioIndicator(indicator.value());
48     }
49 }
50 
CreateFrameNode(int32_t nodeId)51 RefPtr<FrameNode> RadioModelNG::CreateFrameNode(int32_t nodeId)
52 {
53     auto frameNode = FrameNode::CreateFrameNode(V2::RADIO_ETS_TAG, nodeId, AceType::MakeRefPtr<RadioPattern>());
54     CHECK_NULL_RETURN(frameNode, nullptr);
55     return frameNode;
56 }
57 
SetBuilder(std::function<void ()> && buildFunc)58 void RadioModelNG::SetBuilder(std::function<void()>&& buildFunc)
59 {
60     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
61     CHECK_NULL_VOID(frameNode);
62     auto radioPattern = frameNode->GetPattern<RadioPattern>();
63     CHECK_NULL_VOID(radioPattern);
64     radioPattern->SetBuilder(std::move(buildFunc));
65 }
66 
SetRadioIndicator(int32_t indicator)67 void RadioModelNG::SetRadioIndicator(int32_t indicator)
68 {
69     ACE_UPDATE_PAINT_PROPERTY(RadioPaintProperty, RadioIndicator, indicator);
70 }
71 
SetChecked(bool isChecked)72 void RadioModelNG::SetChecked(bool isChecked)
73 {
74     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
75     CHECK_NULL_VOID(frameNode);
76     TAG_LOGD(
77         AceLogTag::ACE_SELECT_COMPONENT, "radio node %{public}d set checked %{public}d", frameNode->GetId(), isChecked);
78     auto eventHub = frameNode->GetEventHub<RadioEventHub>();
79     CHECK_NULL_VOID(eventHub);
80     eventHub->SetCurrentUIState(UI_STATE_SELECTED, isChecked);
81 
82     ACE_UPDATE_PAINT_PROPERTY(RadioPaintProperty, RadioCheck, isChecked);
83 }
84 
SetOnChange(ChangeEvent && onChange)85 void RadioModelNG::SetOnChange(ChangeEvent&& onChange)
86 {
87     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
88     CHECK_NULL_VOID(frameNode);
89     auto eventHub = frameNode->GetEventHub<RadioEventHub>();
90     CHECK_NULL_VOID(eventHub);
91     eventHub->SetOnChange(std::move(onChange));
92 }
93 
SetOnChange(FrameNode * frameNode,ChangeEvent && onChange)94 void RadioModelNG::SetOnChange(FrameNode* frameNode, ChangeEvent&& onChange)
95 {
96     CHECK_NULL_VOID(frameNode);
97     auto eventHub = frameNode->GetEventHub<RadioEventHub>();
98     CHECK_NULL_VOID(eventHub);
99     eventHub->SetOnChange(std::move(onChange));
100 }
101 
SetWidth(const Dimension & width)102 void RadioModelNG::SetWidth(const Dimension& width)
103 {
104     NG::ViewAbstract::SetWidth(NG::CalcLength(width));
105 }
106 
SetHeight(const Dimension & height)107 void RadioModelNG::SetHeight(const Dimension& height)
108 {
109     NG::ViewAbstract::SetHeight(NG::CalcLength(height));
110 }
111 
SetPadding(const NG::PaddingPropertyF &,const NG::PaddingProperty & newArgs)112 void RadioModelNG::SetPadding(const NG::PaddingPropertyF& /*args*/, const NG::PaddingProperty& newArgs)
113 {
114     NG::ViewAbstract::SetPadding(newArgs);
115 }
116 
SetCheckedBackgroundColor(const Color & color)117 void RadioModelNG::SetCheckedBackgroundColor(const Color& color)
118 {
119     ACE_UPDATE_PAINT_PROPERTY(RadioPaintProperty, RadioCheckedBackgroundColor, color);
120 }
121 
SetUncheckedBorderColor(const Color & color)122 void RadioModelNG::SetUncheckedBorderColor(const Color& color)
123 {
124     ACE_UPDATE_PAINT_PROPERTY(RadioPaintProperty, RadioUncheckedBorderColor, color);
125 }
126 
SetIndicatorColor(const Color & color)127 void RadioModelNG::SetIndicatorColor(const Color& color)
128 {
129     ACE_UPDATE_PAINT_PROPERTY(RadioPaintProperty, RadioIndicatorColor, color);
130 }
131 
SetOnChangeEvent(ChangeEvent && onChangeEvent)132 void RadioModelNG::SetOnChangeEvent(ChangeEvent&& onChangeEvent)
133 {
134     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
135     CHECK_NULL_VOID(frameNode);
136     auto eventHub = frameNode->GetEventHub<RadioEventHub>();
137     CHECK_NULL_VOID(eventHub);
138     eventHub->SetOnChangeEvent(std::move(onChangeEvent));
139 }
140 
SetResponseRegion(const std::vector<DimensionRect> & responseRegion)141 void RadioModelNG::SetResponseRegion(const std::vector<DimensionRect>& responseRegion)
142 {
143     NG::ViewAbstract::SetResponseRegion(responseRegion);
144     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
145     CHECK_NULL_VOID(frameNode);
146     auto pattern = frameNode->GetPattern<RadioPattern>();
147     CHECK_NULL_VOID(pattern);
148     pattern->SetIsUserSetResponseRegion(true);
149 }
150 
SetHoverEffect(HoverEffectType hoverEffect)151 void RadioModelNG::SetHoverEffect(HoverEffectType hoverEffect)
152 {
153     NG::ViewAbstract::SetHoverEffect(hoverEffect);
154     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
155     CHECK_NULL_VOID(frameNode);
156     auto pattern = frameNode->GetPattern<RadioPattern>();
157     CHECK_NULL_VOID(pattern);
158     pattern->SetShowHoverEffect(hoverEffect != HoverEffectType::NONE);
159 }
160 
SetChecked(FrameNode * frameNode,bool isChecked)161 void RadioModelNG::SetChecked(FrameNode* frameNode, bool isChecked)
162 {
163     ACE_UPDATE_NODE_PAINT_PROPERTY(RadioPaintProperty, RadioCheck, isChecked, frameNode);
164 }
165 
SetCheckedBackgroundColor(FrameNode * frameNode,const Color & color)166 void RadioModelNG::SetCheckedBackgroundColor(FrameNode* frameNode, const Color& color)
167 {
168     ACE_UPDATE_NODE_PAINT_PROPERTY(RadioPaintProperty, RadioCheckedBackgroundColor, color, frameNode);
169 }
170 
SetUncheckedBorderColor(FrameNode * frameNode,const Color & color)171 void RadioModelNG::SetUncheckedBorderColor(FrameNode* frameNode, const Color& color)
172 {
173     ACE_UPDATE_NODE_PAINT_PROPERTY(RadioPaintProperty, RadioUncheckedBorderColor, color, frameNode);
174 }
175 
SetIndicatorColor(FrameNode * frameNode,const Color & color)176 void RadioModelNG::SetIndicatorColor(FrameNode* frameNode, const Color& color)
177 {
178     ACE_UPDATE_NODE_PAINT_PROPERTY(RadioPaintProperty, RadioIndicatorColor, color, frameNode);
179 }
180 
SetWidth(FrameNode * frameNode,const Dimension & width)181 void RadioModelNG::SetWidth(FrameNode* frameNode, const Dimension& width)
182 {
183     NG::ViewAbstract::SetWidth(frameNode, NG::CalcLength(width));
184 }
185 
SetHeight(FrameNode * frameNode,const Dimension & height)186 void RadioModelNG::SetHeight(FrameNode* frameNode, const Dimension& height)
187 {
188     NG::ViewAbstract::SetHeight(frameNode, NG::CalcLength(height));
189 }
190 
SetHoverEffect(FrameNode * frameNode,HoverEffectType hoverEffect)191 void RadioModelNG::SetHoverEffect(FrameNode* frameNode, HoverEffectType hoverEffect)
192 {
193     NG::ViewAbstract::SetHoverEffect(frameNode, hoverEffect);
194     CHECK_NULL_VOID(frameNode);
195     auto pattern = frameNode->GetPattern<RadioPattern>();
196     CHECK_NULL_VOID(pattern);
197     pattern->SetShowHoverEffect(hoverEffect != HoverEffectType::NONE);
198 }
199 
SetPadding(FrameNode * frameNode,const NG::PaddingProperty & newArgs)200 void RadioModelNG::SetPadding(FrameNode* frameNode, const NG::PaddingProperty& newArgs)
201 {
202     NG::ViewAbstract::SetPadding(frameNode, newArgs);
203 }
204 
SetResponseRegion(FrameNode * frameNode,const std::vector<DimensionRect> & responseRegion)205 void RadioModelNG::SetResponseRegion(FrameNode* frameNode, const std::vector<DimensionRect>& responseRegion)
206 {
207     NG::ViewAbstract::SetResponseRegion(frameNode, responseRegion);
208     CHECK_NULL_VOID(frameNode);
209     auto pattern = frameNode->GetPattern<RadioPattern>();
210     CHECK_NULL_VOID(pattern);
211     pattern->SetIsUserSetResponseRegion(true);
212 }
213 
SetBuilderFunc(FrameNode * frameNode,NG::RadioMakeCallback && makeFunc)214 void RadioModelNG::SetBuilderFunc(FrameNode* frameNode, NG::RadioMakeCallback&& makeFunc)
215 {
216     CHECK_NULL_VOID(frameNode);
217     auto pattern = frameNode->GetPattern<RadioPattern>();
218     CHECK_NULL_VOID(pattern);
219     pattern->SetBuilderFunc(std::move(makeFunc));
220 }
221 
SetChangeValue(FrameNode * frameNode,bool value)222 void RadioModelNG::SetChangeValue(FrameNode* frameNode, bool value)
223 {
224     auto pattern = frameNode->GetPattern<RadioPattern>();
225     CHECK_NULL_VOID(pattern);
226     pattern->SetRadioChecked(value);
227 }
228 
GetChecked(FrameNode * frameNode)229 bool RadioModelNG::GetChecked(FrameNode* frameNode)
230 {
231     bool value = false;
232     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(RadioPaintProperty, RadioCheck, value, frameNode, value);
233     return value;
234 }
235 
GetCheckedBackgroundColor(FrameNode * frameNode)236 Color RadioModelNG::GetCheckedBackgroundColor(FrameNode* frameNode)
237 {
238     Color color(0xFF007DFF);
239     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
240         RadioPaintProperty, RadioCheckedBackgroundColor, color, frameNode, color);
241     return color;
242 }
243 
GetUncheckedBorderColor(FrameNode * frameNode)244 Color RadioModelNG::GetUncheckedBorderColor(FrameNode* frameNode)
245 {
246     Color color(0xFF182431);
247     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
248         RadioPaintProperty, RadioUncheckedBorderColor, color, frameNode, color);
249     return color;
250 }
251 
GetIndicatorColor(FrameNode * frameNode)252 Color RadioModelNG::GetIndicatorColor(FrameNode* frameNode)
253 {
254     Color color(0xFFFFFFFF);
255     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(RadioPaintProperty, RadioIndicatorColor, color, frameNode, color);
256     return color;
257 }
258 
SetRadioValue(FrameNode * frameNode,const std::string & value)259 void RadioModelNG::SetRadioValue(FrameNode* frameNode, const std::string& value)
260 {
261     CHECK_NULL_VOID(frameNode);
262     auto eventHub = frameNode->GetEventHub<NG::RadioEventHub>();
263     CHECK_NULL_VOID(eventHub);
264     if (!value.empty()) {
265         eventHub->SetValue(value);
266     }
267 }
268 
GetRadioValue(FrameNode * frameNode)269 std::string RadioModelNG::GetRadioValue(FrameNode* frameNode)
270 {
271     CHECK_NULL_RETURN(frameNode, nullptr);
272     auto eventHub = frameNode->GetEventHub<NG::RadioEventHub>();
273     CHECK_NULL_RETURN(eventHub, nullptr);
274     return eventHub->GetValue();
275 }
276 
SetRadioGroup(FrameNode * frameNode,const std::string & value)277 void RadioModelNG::SetRadioGroup(FrameNode* frameNode, const std::string& value)
278 {
279     CHECK_NULL_VOID(frameNode);
280     auto eventHub = frameNode->GetEventHub<NG::RadioEventHub>();
281     CHECK_NULL_VOID(eventHub);
282     if (!value.empty()) {
283         eventHub->SetGroup(value);
284     }
285 }
286 
GetRadioGroup(FrameNode * frameNode)287 std::string RadioModelNG::GetRadioGroup(FrameNode* frameNode)
288 {
289     CHECK_NULL_RETURN(frameNode, nullptr);
290     auto eventHub = frameNode->GetEventHub<NG::RadioEventHub>();
291     CHECK_NULL_RETURN(eventHub, nullptr);
292     return eventHub->GetGroup();
293 }
294 } // namespace OHOS::Ace::NG
295