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