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/checkbox/checkbox_model_ng.h"
17
18 #include "core/components_ng/base/frame_node.h"
19 #include "core/components_ng/base/view_abstract.h"
20 #include "core/components_ng/base/view_stack_processor.h"
21 #include "core/components_ng/pattern/checkbox/checkbox_pattern.h"
22 #include "core/components_ng/property/calc_length.h"
23 #include "core/components_v2/inspector/inspector_constants.h"
24
25 namespace OHOS::Ace::NG {
26 constexpr float CHECK_BOX_MARK_SIZE_INVALID_VALUE = -1.0f;
27
Create(const std::optional<std::string> & name,const std::optional<std::string> & groupName,const std::string & tagName)28 void CheckBoxModelNG::Create(
29 const std::optional<std::string>& name, const std::optional<std::string>& groupName, const std::string& tagName)
30 {
31 auto* stack = ViewStackProcessor::GetInstance();
32 int32_t nodeId = stack->ClaimNodeId();
33 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", tagName.c_str(), nodeId);
34 auto frameNode =
35 FrameNode::GetOrCreateFrameNode(tagName, nodeId, []() { return AceType::MakeRefPtr<CheckBoxPattern>(); });
36 ViewStackProcessor::GetInstance()->Push(frameNode);
37
38 auto eventHub = frameNode->GetEventHub<NG::CheckBoxEventHub>();
39 CHECK_NULL_VOID(eventHub);
40 if (name.has_value()) {
41 eventHub->SetName(name.value());
42 }
43 if (groupName.has_value()) {
44 eventHub->SetGroupName(groupName.value());
45 }
46 }
47
CreateFrameNode(int32_t nodeId)48 RefPtr<FrameNode> CheckBoxModelNG::CreateFrameNode(int32_t nodeId)
49 {
50 auto frameNode = FrameNode::CreateFrameNode(V2::CHECK_BOX_ETS_TAG, nodeId, AceType::MakeRefPtr<CheckBoxPattern>());
51 CHECK_NULL_RETURN(frameNode, nullptr);
52 return frameNode;
53 }
54
SetSelect(bool isSelected)55 void CheckBoxModelNG::SetSelect(bool isSelected)
56 {
57 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
58 CHECK_NULL_VOID(frameNode);
59 auto eventHub = frameNode->GetEventHub<CheckBoxEventHub>();
60 CHECK_NULL_VOID(eventHub);
61 eventHub->SetCurrentUIState(UI_STATE_SELECTED, isSelected);
62
63 ACE_UPDATE_NODE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxSelect, isSelected, frameNode);
64 }
65
SetSelectedColor(const Color & color)66 void CheckBoxModelNG::SetSelectedColor(const Color& color)
67 {
68 ACE_UPDATE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxSelectedColor, color);
69 }
70
SetUnSelectedColor(const Color & color)71 void CheckBoxModelNG::SetUnSelectedColor(const Color& color)
72 {
73 ACE_UPDATE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxUnSelectedColor, color);
74 }
75
SetBuilder(std::optional<std::function<void (void)>> & buildFunc)76 void CheckBoxModelNG::SetBuilder(std::optional<std::function<void(void)>>& buildFunc)
77 {
78 const auto& frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
79 CHECK_NULL_VOID(frameNode);
80 auto checkBoxPattern = frameNode->GetPattern<CheckBoxPattern>();
81 CHECK_NULL_VOID(checkBoxPattern);
82 checkBoxPattern->SetIndicatorBuilder(buildFunc);
83 }
84
SetCheckboxStyle(CheckBoxStyle checkboxStyle)85 void CheckBoxModelNG::SetCheckboxStyle(CheckBoxStyle checkboxStyle)
86 {
87 ACE_UPDATE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxSelectedStyle, checkboxStyle);
88 }
89
90
SetCheckMarkColor(const Color & color)91 void CheckBoxModelNG::SetCheckMarkColor(const Color& color)
92 {
93 ACE_UPDATE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxCheckMarkColor, color);
94 }
95
SetCheckMarkSize(const Dimension & size)96 void CheckBoxModelNG::SetCheckMarkSize(const Dimension& size)
97 {
98 ACE_UPDATE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxCheckMarkSize, size);
99 }
100
SetCheckMarkWidth(const Dimension & width)101 void CheckBoxModelNG::SetCheckMarkWidth(const Dimension& width)
102 {
103 ACE_UPDATE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxCheckMarkWidth, width);
104 }
105
SetOnChange(ChangeEvent && onChange)106 void CheckBoxModelNG::SetOnChange(ChangeEvent&& onChange)
107 {
108 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
109 CHECK_NULL_VOID(frameNode);
110 auto eventHub = frameNode->GetEventHub<CheckBoxEventHub>();
111 CHECK_NULL_VOID(eventHub);
112 eventHub->SetOnChange(std::move(onChange));
113 }
114
SetWidth(const Dimension & width)115 void CheckBoxModelNG::SetWidth(const Dimension& width)
116 {
117 NG::ViewAbstract::SetWidth(NG::CalcLength(width));
118 }
119
SetHeight(const Dimension & height)120 void CheckBoxModelNG::SetHeight(const Dimension& height)
121 {
122 NG::ViewAbstract::SetHeight(NG::CalcLength(height));
123 }
124
SetPadding(const NG::PaddingPropertyF & args,const NG::PaddingProperty & newArgs,bool flag)125 void CheckBoxModelNG::SetPadding(const NG::PaddingPropertyF& args, const NG::PaddingProperty& newArgs, bool flag)
126 {
127 NG::ViewAbstract::SetPadding(newArgs);
128 }
129
SetChangeEvent(ChangeEvent && changeEvent)130 void CheckBoxModelNG::SetChangeEvent(ChangeEvent&& changeEvent)
131 {
132 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
133 CHECK_NULL_VOID(frameNode);
134 auto eventHub = frameNode->GetEventHub<CheckBoxEventHub>();
135 CHECK_NULL_VOID(eventHub);
136 eventHub->SetChangeEvent(std::move(changeEvent));
137 }
138
SetResponseRegion(const std::vector<DimensionRect> & responseRegion)139 void CheckBoxModelNG::SetResponseRegion(const std::vector<DimensionRect>& responseRegion)
140 {
141 NG::ViewAbstract::SetResponseRegion(responseRegion);
142 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
143 CHECK_NULL_VOID(frameNode);
144 auto pattern = frameNode->GetPattern<CheckBoxPattern>();
145 CHECK_NULL_VOID(pattern);
146 pattern->SetIsUserSetResponseRegion(true);
147 }
148
SetSelect(FrameNode * frameNode,bool isSelected)149 void CheckBoxModelNG::SetSelect(FrameNode* frameNode, bool isSelected)
150 {
151 ACE_UPDATE_NODE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxSelect, isSelected, frameNode);
152 }
153
SetSelectedColor(FrameNode * frameNode,const Color & color)154 void CheckBoxModelNG::SetSelectedColor(FrameNode* frameNode, const Color& color)
155 {
156 ACE_UPDATE_NODE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxSelectedColor, color, frameNode);
157 }
158
SetUnSelectedColor(FrameNode * frameNode,const Color & color)159 void CheckBoxModelNG::SetUnSelectedColor(FrameNode* frameNode, const Color& color)
160 {
161 ACE_UPDATE_NODE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxUnSelectedColor, color, frameNode);
162 }
163
SetCheckMarkColor(FrameNode * frameNode,const Color & color)164 void CheckBoxModelNG::SetCheckMarkColor(FrameNode* frameNode, const Color& color)
165 {
166 ACE_UPDATE_NODE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxCheckMarkColor, color, frameNode);
167 }
168
SetCheckMarkSize(FrameNode * frameNode,const Dimension & size)169 void CheckBoxModelNG::SetCheckMarkSize(FrameNode* frameNode, const Dimension& size)
170 {
171 ACE_UPDATE_NODE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxCheckMarkSize, size, frameNode);
172 }
173
SetCheckMarkWidth(FrameNode * frameNode,const Dimension & width)174 void CheckBoxModelNG::SetCheckMarkWidth(FrameNode* frameNode, const Dimension& width)
175 {
176 ACE_UPDATE_NODE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxCheckMarkWidth, width, frameNode);
177 }
178
SetHeight(FrameNode * frameNode,const Dimension & height)179 void CheckBoxModelNG::SetHeight(FrameNode* frameNode, const Dimension& height)
180 {
181 NG::ViewAbstract::SetHeight(frameNode, NG::CalcLength(height));
182 }
183
SetWidth(FrameNode * frameNode,const Dimension & width)184 void CheckBoxModelNG::SetWidth(FrameNode* frameNode, const Dimension& width)
185 {
186 NG::ViewAbstract::SetWidth(frameNode, NG::CalcLength(width));
187 }
188
SetPadding(FrameNode * frameNode,const NG::PaddingProperty & padding)189 void CheckBoxModelNG::SetPadding(FrameNode* frameNode, const NG::PaddingProperty& padding)
190 {
191 NG::ViewAbstract::SetPadding(padding);
192 }
193
SetResponseRegion(FrameNode * frameNode,const std::vector<DimensionRect> & responseRegion)194 void CheckBoxModelNG::SetResponseRegion(FrameNode* frameNode, const std::vector<DimensionRect>& responseRegion)
195 {
196 NG::ViewAbstract::SetResponseRegion(responseRegion);
197 CHECK_NULL_VOID(frameNode);
198 auto pattern = frameNode->GetPattern<CheckBoxPattern>();
199 CHECK_NULL_VOID(pattern);
200 pattern->SetIsUserSetResponseRegion(true);
201 }
202
SetCheckboxStyle(FrameNode * frameNode,CheckBoxStyle checkboxStyle)203 void CheckBoxModelNG::SetCheckboxStyle(FrameNode* frameNode, CheckBoxStyle checkboxStyle)
204 {
205 ACE_UPDATE_NODE_PAINT_PROPERTY(CheckBoxPaintProperty, CheckBoxSelectedStyle, checkboxStyle, frameNode);
206 }
207
GetSelect(FrameNode * frameNode)208 bool CheckBoxModelNG::GetSelect(FrameNode* frameNode)
209 {
210 bool value = false;
211 ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(CheckBoxPaintProperty, CheckBoxSelect, value, frameNode, value);
212 return value;
213 }
214
GetSelectedColor(FrameNode * frameNode)215 Color CheckBoxModelNG::GetSelectedColor(FrameNode* frameNode)
216 {
217 Color value;
218 CHECK_NULL_RETURN(frameNode, value);
219 auto pipelineContext = frameNode->GetContext();
220 CHECK_NULL_RETURN(pipelineContext, value);
221 auto theme = pipelineContext->GetTheme<CheckboxTheme>();
222 CHECK_NULL_RETURN(theme, value);
223 value = theme->GetActiveColor();
224 ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
225 CheckBoxPaintProperty, CheckBoxSelectedColor, value, frameNode, value);
226 return value;
227 }
228
GetUnSelectedColor(FrameNode * frameNode)229 Color CheckBoxModelNG::GetUnSelectedColor(FrameNode* frameNode)
230 {
231 Color value;
232 CHECK_NULL_RETURN(frameNode, value);
233 auto pipelineContext = frameNode->GetContext();
234 CHECK_NULL_RETURN(pipelineContext, value);
235 auto theme = pipelineContext->GetTheme<CheckboxTheme>();
236 CHECK_NULL_RETURN(theme, value);
237 value = theme->GetInactiveColor();
238 ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
239 CheckBoxPaintProperty, CheckBoxUnSelectedColor, value, frameNode, value);
240 return value;
241 }
242
GetCheckMarkColor(FrameNode * frameNode)243 Color CheckBoxModelNG::GetCheckMarkColor(FrameNode* frameNode)
244 {
245 Color value;
246 CHECK_NULL_RETURN(frameNode, value);
247 auto pipelineContext = frameNode->GetContext();
248 CHECK_NULL_RETURN(pipelineContext, value);
249 auto theme = pipelineContext->GetTheme<CheckboxTheme>();
250 CHECK_NULL_RETURN(theme, value);
251 value = theme->GetPointColor();
252 ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
253 CheckBoxPaintProperty, CheckBoxCheckMarkColor, value, frameNode, value);
254 return value;
255 }
256
GetCheckMarkSize(FrameNode * frameNode)257 Dimension CheckBoxModelNG::GetCheckMarkSize(FrameNode* frameNode)
258 {
259 Dimension value = Dimension(CHECK_BOX_MARK_SIZE_INVALID_VALUE);
260 ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
261 CheckBoxPaintProperty, CheckBoxCheckMarkSize, value, frameNode, value);
262 return value;
263 }
264
GetCheckMarkWidth(FrameNode * frameNode)265 Dimension CheckBoxModelNG::GetCheckMarkWidth(FrameNode* frameNode)
266 {
267 Dimension value;
268 CHECK_NULL_RETURN(frameNode, value);
269 auto pipelineContext = frameNode->GetContext();
270 CHECK_NULL_RETURN(pipelineContext, value);
271 auto theme = pipelineContext->GetTheme<CheckboxTheme>();
272 CHECK_NULL_RETURN(theme, value);
273 value = theme->GetCheckStroke();
274 ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
275 CheckBoxPaintProperty, CheckBoxCheckMarkWidth, value, frameNode, value);
276 return value;
277 }
278
GetCheckboxStyle(FrameNode * frameNode)279 CheckBoxStyle CheckBoxModelNG::GetCheckboxStyle(FrameNode* frameNode)
280 {
281 CheckBoxStyle value = CheckBoxStyle::CIRCULAR_STYLE;
282 ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
283 CheckBoxPaintProperty, CheckBoxSelectedStyle, value, frameNode, value);
284 return value;
285 }
286
SetBuilderFunc(FrameNode * frameNode,NG::CheckBoxMakeCallback && makeFunc)287 void CheckBoxModelNG::SetBuilderFunc(FrameNode* frameNode, NG::CheckBoxMakeCallback&& makeFunc)
288 {
289 CHECK_NULL_VOID(frameNode);
290 auto pattern = frameNode->GetPattern<CheckBoxPattern>();
291 CHECK_NULL_VOID(pattern);
292 pattern->SetBuilderFunc(std::move(makeFunc));
293 }
294
SetChangeValue(FrameNode * frameNode,bool value)295 void CheckBoxModelNG::SetChangeValue(FrameNode* frameNode, bool value)
296 {
297 auto pattern = frameNode->GetPattern<CheckBoxPattern>();
298 CHECK_NULL_VOID(pattern);
299 pattern->SetCheckBoxSelect(value);
300 }
301
SetOnChange(FrameNode * frameNode,ChangeEvent && onChange)302 void CheckBoxModelNG::SetOnChange(FrameNode* frameNode, ChangeEvent&& onChange)
303 {
304 auto eventHub = frameNode->GetEventHub<CheckBoxEventHub>();
305 CHECK_NULL_VOID(eventHub);
306 eventHub->SetOnChange(std::move(onChange));
307 }
308
309 } // namespace OHOS::Ace::NG
310