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