1 /*
2 * Copyright (c) 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/button/button_model_ng.h"
17
18 #include "base/geometry/dimension.h"
19 #include "base/memory/ace_type.h"
20 #include "core/components/button/button_theme.h"
21 #include "core/components/common/layout/constants.h"
22 #include "core/components_ng/base/frame_node.h"
23 #include "core/components_ng/base/view_abstract.h"
24 #include "core/components_ng/base/view_stack_processor.h"
25 #include "core/components_ng/pattern/button/button_event_hub.h"
26 #include "core/components_ng/pattern/button/button_layout_property.h"
27 #include "core/components_ng/pattern/button/button_pattern.h"
28 #include "core/components_ng/pattern/text/text_pattern.h"
29 #include "core/components_v2/inspector/inspector_constants.h"
30 #include "core/pipeline_ng/ui_task_scheduler.h"
31
32 namespace OHOS::Ace::NG {
SetFontSize(const Dimension & fontSize)33 void ButtonModelNG::SetFontSize(const Dimension& fontSize)
34 {
35 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontSize, fontSize);
36 }
37
SetFontWeight(const Ace::FontWeight & fontWeight)38 void ButtonModelNG::SetFontWeight(const Ace::FontWeight& fontWeight)
39 {
40 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontWeight, fontWeight);
41 }
42
SetFontStyle(const Ace::FontStyle & fontStyle)43 void ButtonModelNG::SetFontStyle(const Ace::FontStyle& fontStyle)
44 {
45 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontStyle, fontStyle);
46 }
47
SetFontFamily(const std::vector<std::string> & fontFamily)48 void ButtonModelNG::SetFontFamily(const std::vector<std::string>& fontFamily)
49 {
50 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontFamily, fontFamily);
51 }
52
SetFontColor(const Color & textColor)53 void ButtonModelNG::SetFontColor(const Color& textColor)
54 {
55 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontColor, textColor);
56 ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, textColor);
57 }
58
SetType(const int value)59 void ButtonModelNG::SetType(const int value)
60 {
61 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Type, static_cast<ButtonType>(value));
62 }
63
SetStateEffect(const bool stateEffect)64 void ButtonModelNG::SetStateEffect(const bool stateEffect)
65 {
66 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
67 CHECK_NULL_VOID(frameNode);
68 auto buttonEventHub = frameNode->GetEventHub<ButtonEventHub>();
69 CHECK_NULL_VOID(buttonEventHub);
70 buttonEventHub->SetStateEffect(stateEffect);
71 }
72
SetLabelStyle(ButtonParameters & buttonParameters)73 void ButtonModelNG::SetLabelStyle(ButtonParameters& buttonParameters)
74 {
75 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
76 CHECK_NULL_VOID(frameNode);
77 SetLabelStyle(frameNode, buttonParameters);
78 }
79
SetButtonStyle(const std::optional<ButtonStyleMode> & buttonStyle)80 void ButtonModelNG::SetButtonStyle(const std::optional<ButtonStyleMode>& buttonStyle)
81 {
82 if (buttonStyle.has_value()) {
83 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, ButtonStyle, buttonStyle.value());
84 auto context = PipelineBase::GetCurrentContextSafely();
85 CHECK_NULL_VOID(context);
86 auto buttonTheme = context->GetTheme<ButtonTheme>();
87 CHECK_NULL_VOID(buttonTheme);
88 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
89 auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
90 CHECK_NULL_VOID(layoutProperty);
91 ButtonRole buttonRole = layoutProperty->GetButtonRole().value_or(ButtonRole::NORMAL);
92 auto bgColor = buttonTheme->GetBgColor(buttonStyle.value(), buttonRole);
93 auto textColor = buttonTheme->GetTextColor(buttonStyle.value(), buttonRole);
94 BackgroundColor(bgColor, true);
95 SetFontColor(textColor);
96 }
97 }
98
SetRole(const std::optional<ButtonRole> & buttonRole)99 void ButtonModelNG::SetRole(const std::optional<ButtonRole>& buttonRole)
100 {
101 if (buttonRole.has_value()) {
102 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, ButtonRole, buttonRole.value());
103 auto context = PipelineBase::GetCurrentContextSafely();
104 CHECK_NULL_VOID(context);
105 auto buttonTheme = context->GetTheme<ButtonTheme>();
106 CHECK_NULL_VOID(buttonTheme);
107 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
108 auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
109 CHECK_NULL_VOID(layoutProperty);
110 ButtonStyleMode buttonStyleMode = layoutProperty->GetButtonStyle().value_or(ButtonStyleMode::EMPHASIZE);
111 auto bgColor = buttonTheme->GetBgColor(buttonStyleMode, buttonRole.value());
112 auto textColor = buttonTheme->GetTextColor(buttonStyleMode, buttonRole.value());
113 BackgroundColor(bgColor, true);
114 SetFontColor(textColor);
115 }
116 }
117
SetControlSize(const std::optional<ControlSize> & controlSize)118 void ButtonModelNG::SetControlSize(const std::optional<ControlSize>& controlSize)
119 {
120 if (controlSize.has_value()) {
121 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, ControlSize, controlSize.value());
122 auto context = PipelineBase::GetCurrentContextSafely();
123 CHECK_NULL_VOID(context);
124 auto buttonTheme = context->GetTheme<ButtonTheme>();
125 CHECK_NULL_VOID(buttonTheme);
126 auto padding = buttonTheme->GetPadding(controlSize.value());
127 PaddingProperty defaultPadding = { CalcLength(padding.Left()), CalcLength(padding.Right()),
128 CalcLength(padding.Top()), CalcLength(padding.Bottom()) };
129 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Padding, defaultPadding);
130 Dimension fontSize = buttonTheme->GetTextSize(controlSize.value());
131 SetFontSize(fontSize);
132 }
133 }
134
SetRole(FrameNode * frameNode,const std::optional<ButtonRole> & buttonRole)135 void ButtonModelNG::SetRole(FrameNode* frameNode, const std::optional<ButtonRole>& buttonRole)
136 {
137 if (buttonRole.has_value()) {
138 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, ButtonRole, buttonRole.value(), frameNode);
139 auto context = PipelineBase::GetCurrentContextSafely();
140 CHECK_NULL_VOID(context);
141 auto buttonTheme = context->GetTheme<ButtonTheme>();
142 CHECK_NULL_VOID(buttonTheme);
143 auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
144 CHECK_NULL_VOID(layoutProperty);
145 ButtonStyleMode buttonStyleMode = layoutProperty->GetButtonStyle().value_or(ButtonStyleMode::EMPHASIZE);
146 auto bgColor = buttonTheme->GetBgColor(buttonStyleMode, buttonRole.value());
147 auto textColor = buttonTheme->GetTextColor(buttonStyleMode, buttonRole.value());
148 BackgroundColor(frameNode, bgColor, true);
149 SetFontColor(frameNode, textColor);
150 }
151 }
152
SetButtonStyle(FrameNode * frameNode,const std::optional<ButtonStyleMode> & buttonStyle)153 void ButtonModelNG::SetButtonStyle(FrameNode* frameNode, const std::optional<ButtonStyleMode>& buttonStyle)
154 {
155 if (buttonStyle.has_value()) {
156 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, ButtonStyle, buttonStyle.value(), frameNode);
157 auto context = PipelineBase::GetCurrentContextSafely();
158 CHECK_NULL_VOID(context);
159 auto buttonTheme = context->GetTheme<ButtonTheme>();
160 CHECK_NULL_VOID(buttonTheme);
161 auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
162 CHECK_NULL_VOID(layoutProperty);
163 ButtonRole buttonRole = layoutProperty->GetButtonRole().value_or(ButtonRole::NORMAL);
164 auto bgColor = buttonTheme->GetBgColor(buttonStyle.value(), buttonRole);
165 auto textColor = buttonTheme->GetTextColor(buttonStyle.value(), buttonRole);
166 BackgroundColor(frameNode, bgColor, true);
167 SetFontColor(frameNode, textColor);
168 }
169 }
170
SetControlSize(FrameNode * frameNode,const std::optional<ControlSize> & controlSize)171 void ButtonModelNG::SetControlSize(FrameNode* frameNode, const std::optional<ControlSize>& controlSize)
172 {
173 if (controlSize.has_value()) {
174 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, ControlSize, controlSize.value(), frameNode);
175 auto context = PipelineBase::GetCurrentContextSafely();
176 CHECK_NULL_VOID(context);
177 auto buttonTheme = context->GetTheme<ButtonTheme>();
178 CHECK_NULL_VOID(buttonTheme);
179 auto padding = buttonTheme->GetPadding(controlSize.value());
180 PaddingProperty defaultPadding = { CalcLength(padding.Left()), CalcLength(padding.Right()),
181 CalcLength(padding.Top()), CalcLength(padding.Bottom()) };
182 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, Padding, defaultPadding, frameNode);
183 Dimension fontSize = buttonTheme->GetTextSize(controlSize.value());
184 SetFontSize(frameNode, fontSize);
185 }
186 }
187
CreateWithLabel(const CreateWithPara & para,std::list<RefPtr<Component>> & buttonChildren)188 void ButtonModelNG::CreateWithLabel(const CreateWithPara& para, std::list<RefPtr<Component>>& buttonChildren)
189 {
190 CreateWithLabel(para.label.value());
191 SetTypeAndStateEffect(para.type, para.stateEffect);
192 SetButtonStyle(para.buttonStyleMode);
193 SetControlSize(para.controlSize);
194 SetRole(para.buttonRole);
195 }
196
CreateWithLabel(const std::string & label)197 void ButtonModelNG::CreateWithLabel(const std::string& label)
198 {
199 auto* stack = ViewStackProcessor::GetInstance();
200 auto nodeId = stack->ClaimNodeId();
201 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::BUTTON_ETS_TAG, nodeId);
202 auto buttonNode = FrameNode::GetOrCreateFrameNode(
203 V2::BUTTON_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
204 CHECK_NULL_VOID(buttonNode);
205 if (buttonNode->GetChildren().empty()) {
206 auto textNode = FrameNode::CreateFrameNode(
207 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
208 CHECK_NULL_VOID(textNode);
209 textNode->SetInternal();
210 SetTextDefaultStyle(textNode, label);
211 buttonNode->AddChild(textNode);
212 }
213 auto buttonAccessibilityProperty = buttonNode->GetAccessibilityProperty<AccessibilityProperty>();
214 CHECK_NULL_VOID(buttonAccessibilityProperty);
215 buttonAccessibilityProperty->SetText(label);
216 stack->Push(buttonNode);
217 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Label, label);
218 auto layoutProperty = buttonNode->GetLayoutProperty();
219 CHECK_NULL_VOID(layoutProperty);
220 if (layoutProperty->GetPaddingProperty()) {
221 return;
222 }
223 auto context = PipelineBase::GetCurrentContextSafely();
224 CHECK_NULL_VOID(context);
225 auto buttonTheme = context->GetTheme<ButtonTheme>();
226 CHECK_NULL_VOID(buttonTheme);
227 auto padding = buttonTheme->GetPadding();
228 PaddingProperty defaultPadding = { CalcLength(padding.Left()), CalcLength(padding.Right()),
229 CalcLength(padding.Top()), CalcLength(padding.Bottom()) };
230 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Padding, defaultPadding);
231 }
232
SetLabel(FrameNode * frameNode,const char * label)233 void ButtonModelNG::SetLabel(FrameNode* frameNode, const char* label)
234 {
235 CHECK_NULL_VOID(frameNode);
236 if (frameNode->GetChildren().empty()) {
237 auto textNode = FrameNode::CreateFrameNode(
238 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
239 CHECK_NULL_VOID(textNode);
240 textNode->SetInternal();
241 SetTextDefaultStyle(textNode, label);
242 frameNode->AddChild(textNode);
243 }
244 auto buttonAccessibilityProperty = frameNode->GetAccessibilityProperty<AccessibilityProperty>();
245 CHECK_NULL_VOID(buttonAccessibilityProperty);
246 buttonAccessibilityProperty->SetText(label);
247 auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
248 CHECK_NULL_VOID(layoutProperty);
249 layoutProperty->UpdateLabel(label);
250 if (layoutProperty->GetPaddingProperty()) {
251 return;
252 }
253 auto context = frameNode->GetContext();
254 CHECK_NULL_VOID(context);
255 auto buttonTheme = context->GetTheme<ButtonTheme>();
256 CHECK_NULL_VOID(buttonTheme);
257 auto padding = buttonTheme->GetPadding();
258 PaddingProperty defaultPadding = { CalcLength(padding.Left()), CalcLength(padding.Right()),
259 CalcLength(padding.Top()), CalcLength(padding.Bottom()) };
260 layoutProperty->UpdatePadding(defaultPadding);
261 }
262
Create(const CreateWithPara & para,std::list<RefPtr<Component>> & buttonChildren)263 void ButtonModelNG::Create(const CreateWithPara& para, std::list<RefPtr<Component>>& buttonChildren) {}
264
CreateWithChild(const CreateWithPara & para)265 void ButtonModelNG::CreateWithChild(const CreateWithPara& para)
266 {
267 std::string tagName = "Button";
268 Create(tagName);
269 if (para.optionSetFirst.has_value() && para.optionSetFirst.value()) {
270 SetTypeAndStateEffect(para.type, para.stateEffect);
271 SetButtonStyle(para.buttonStyleMode);
272 SetControlSize(para.controlSize);
273 SetRole(para.buttonRole);
274 }
275 }
276
Create(const std::string & tagName)277 void ButtonModelNG::Create(const std::string& tagName)
278 {
279 auto* stack = ViewStackProcessor::GetInstance();
280 auto nodeId = stack->ClaimNodeId();
281 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", tagName.c_str(), nodeId);
282 auto frameNode =
283 FrameNode::GetOrCreateFrameNode(tagName, nodeId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
284 stack->Push(frameNode);
285 }
286
CreateFrameNode(int32_t nodeId)287 RefPtr<FrameNode> ButtonModelNG::CreateFrameNode(int32_t nodeId)
288 {
289 auto frameNode = FrameNode::CreateFrameNode(V2::BUTTON_ETS_TAG, nodeId, AceType::MakeRefPtr<ButtonPattern>());
290 CHECK_NULL_RETURN(frameNode, nullptr);
291 auto layoutProperty = frameNode->GetLayoutProperty();
292 CHECK_NULL_RETURN(layoutProperty, nullptr);
293 if (layoutProperty->GetPaddingProperty()) {
294 return frameNode;
295 }
296 auto context = PipelineBase::GetCurrentContextSafely();
297 CHECK_NULL_RETURN(context, nullptr);
298 auto buttonTheme = context->GetTheme<ButtonTheme>();
299 CHECK_NULL_RETURN(buttonTheme, nullptr);
300 auto padding = buttonTheme->GetPadding();
301 PaddingProperty defaultPadding = { CalcLength(padding.Left()), CalcLength(padding.Right()),
302 CalcLength(padding.Top()), CalcLength(padding.Bottom()) };
303 layoutProperty->UpdatePadding(defaultPadding);
304 return frameNode;
305 }
306
Padding(const PaddingProperty & paddingNew,const Edge & paddingOld)307 void ButtonModelNG::Padding(const PaddingProperty& paddingNew, const Edge& paddingOld)
308 {
309 NG::ViewAbstract::SetPadding(paddingNew);
310 auto button = ViewStackProcessor::GetInstance()->GetMainFrameNode();
311 CHECK_NULL_VOID(button);
312 auto pattern = button->GetPattern<ButtonPattern>();
313 CHECK_NULL_VOID(pattern);
314 pattern->SetHasCustomPadding(true);
315 }
316
OnClick(GestureEventFunc && tapEventFunc,ClickEventFunc && clickEventFunc)317 void ButtonModelNG::OnClick(GestureEventFunc&& tapEventFunc, ClickEventFunc&& clickEventFunc)
318 {
319 ViewAbstract::SetOnClick(std::move(tapEventFunc));
320 }
321
BackgroundColor(const Color & color,const bool & colorFlag)322 void ButtonModelNG::BackgroundColor(const Color& color, const bool& colorFlag)
323 {
324 ViewAbstract::SetBackgroundColor(color);
325 }
326
BackgroundColor(FrameNode * frameNode,const Color & color,const bool & colorFlag)327 void ButtonModelNG::BackgroundColor(FrameNode* frameNode, const Color& color, const bool& colorFlag)
328 {
329 ViewAbstract::SetBackgroundColor(frameNode, color);
330 }
331
SetSize(const std::optional<Dimension> & width,const std::optional<Dimension> & height)332 void ButtonModelNG::SetSize(const std::optional<Dimension>& width, const std::optional<Dimension>& height)
333 {
334 if (width.has_value()) {
335 NG::ViewAbstract::SetWidth(NG::CalcLength(width.value()));
336 }
337
338 if (height.has_value()) {
339 NG::ViewAbstract::SetHeight(NG::CalcLength(height.value()));
340 }
341 }
342
SetBorderRadius(const Dimension & radius)343 void ButtonModelNG::SetBorderRadius(const Dimension& radius)
344 {
345 NG::BorderRadiusProperty borderRadius;
346 borderRadius.radiusTopLeft = radius;
347 borderRadius.radiusTopRight = radius;
348 borderRadius.radiusBottomLeft = radius;
349 borderRadius.radiusBottomRight = radius;
350 borderRadius.multiValued = true;
351 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, BorderRadius, borderRadius);
352 }
353
SetBorderRadius(FrameNode * frameNode,const Dimension & radius)354 void ButtonModelNG::SetBorderRadius(FrameNode* frameNode, const Dimension& radius)
355 {
356 NG::BorderRadiusProperty borderRadius;
357 borderRadius.radiusTopLeft = radius;
358 borderRadius.radiusTopRight = radius;
359 borderRadius.radiusBottomLeft = radius;
360 borderRadius.radiusBottomRight = radius;
361 borderRadius.multiValued = true;
362 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, BorderRadius, borderRadius, frameNode);
363 }
364
SetBorderRadius(const std::optional<Dimension> & radiusTopLeft,const std::optional<Dimension> & radiusTopRight,const std::optional<Dimension> & radiusBottomLeft,const std::optional<Dimension> & radiusBottomRight)365 void ButtonModelNG::SetBorderRadius(const std::optional<Dimension>& radiusTopLeft,
366 const std::optional<Dimension>& radiusTopRight, const std::optional<Dimension>& radiusBottomLeft,
367 const std::optional<Dimension>& radiusBottomRight)
368 {
369 NG::BorderRadiusProperty borderRadius;
370 borderRadius.radiusTopLeft = radiusTopLeft;
371 borderRadius.radiusTopRight = radiusTopRight;
372 borderRadius.radiusBottomLeft = radiusBottomLeft;
373 borderRadius.radiusBottomRight = radiusBottomRight;
374 borderRadius.multiValued = true;
375 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, BorderRadius, borderRadius);
376 }
377
SetBorderRadius(FrameNode * frameNode,const std::optional<Dimension> & radiusTopLeft,const std::optional<Dimension> & radiusTopRight,const std::optional<Dimension> & radiusBottomLeft,const std::optional<Dimension> & radiusBottomRight)378 void ButtonModelNG::SetBorderRadius(FrameNode* frameNode, const std::optional<Dimension>& radiusTopLeft,
379 const std::optional<Dimension>& radiusTopRight, const std::optional<Dimension>& radiusBottomLeft,
380 const std::optional<Dimension>& radiusBottomRight)
381 {
382 NG::BorderRadiusProperty borderRadius;
383 borderRadius.radiusTopLeft = radiusTopLeft;
384 borderRadius.radiusTopRight = radiusTopRight;
385 borderRadius.radiusBottomLeft = radiusBottomLeft;
386 borderRadius.radiusBottomRight = radiusBottomRight;
387 borderRadius.multiValued = true;
388 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, BorderRadius, borderRadius, frameNode);
389 }
390
SetTypeAndStateEffect(const std::optional<ButtonType> & type,const std::optional<bool> & stateEffect)391 void ButtonModelNG::SetTypeAndStateEffect(const std::optional<ButtonType>& type, const std::optional<bool>& stateEffect)
392 {
393 if (type.has_value()) {
394 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Type, type.value());
395 } else {
396 // undefined use capsule type.
397 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Type, ButtonType::CAPSULE);
398 }
399
400 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
401 CHECK_NULL_VOID(frameNode);
402 auto buttonEventHub = frameNode->GetEventHub<ButtonEventHub>();
403 CHECK_NULL_VOID(buttonEventHub);
404 buttonEventHub->SetStateEffect(stateEffect.value_or(true));
405 }
406
SetTextDefaultStyle(const RefPtr<FrameNode> & textNode,const std::string & label)407 void ButtonModelNG::SetTextDefaultStyle(const RefPtr<FrameNode>& textNode, const std::string& label)
408 {
409 CHECK_NULL_VOID(textNode);
410 auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
411 CHECK_NULL_VOID(textLayoutProperty);
412 auto context = textNode->GetContext();
413 CHECK_NULL_VOID(context);
414 auto buttonTheme = context->GetTheme<ButtonTheme>();
415 CHECK_NULL_VOID(buttonTheme);
416 auto textStyle = buttonTheme->GetTextStyle();
417 textLayoutProperty->UpdateContent(label);
418 textLayoutProperty->UpdateTextOverflow(TextOverflow::ELLIPSIS);
419 textLayoutProperty->UpdateMaxLines(buttonTheme->GetTextMaxLines());
420 textLayoutProperty->UpdateFontWeight(textStyle.GetFontWeight());
421 }
422
SetFontSize(FrameNode * frameNode,const Dimension & fontSize)423 void ButtonModelNG::SetFontSize(FrameNode* frameNode, const Dimension& fontSize)
424 {
425 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontSize, fontSize, frameNode);
426 CHECK_NULL_VOID(frameNode);
427 auto textNode = AceType::DynamicCast<FrameNode>(frameNode->GetFirstChild());
428 CHECK_NULL_VOID(textNode);
429 auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
430 CHECK_NULL_VOID(textLayoutProperty);
431 textLayoutProperty->ResetAdaptMinFontSize();
432 textLayoutProperty->ResetAdaptMaxFontSize();
433 }
434
SetFontWeight(FrameNode * frameNode,const Ace::FontWeight & fontWeight)435 void ButtonModelNG::SetFontWeight(FrameNode* frameNode, const Ace::FontWeight& fontWeight)
436 {
437 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontWeight, fontWeight, frameNode);
438 }
439
SetFontStyle(FrameNode * frameNode,const Ace::FontStyle & fontStyle)440 void ButtonModelNG::SetFontStyle(FrameNode* frameNode, const Ace::FontStyle& fontStyle)
441 {
442 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontStyle, fontStyle, frameNode);
443 }
444
SetFontFamily(FrameNode * frameNode,const std::vector<std::string> & fontFamily)445 void ButtonModelNG::SetFontFamily(FrameNode* frameNode, const std::vector<std::string>& fontFamily)
446 {
447 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontFamily, fontFamily, frameNode);
448 }
449
SetFontColor(FrameNode * frameNode,const Color & textColor)450 void ButtonModelNG::SetFontColor(FrameNode* frameNode, const Color& textColor)
451 {
452 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontColor, textColor, frameNode);
453 ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColor, textColor, frameNode);
454 }
455
SetType(FrameNode * frameNode,const int value)456 void ButtonModelNG::SetType(FrameNode* frameNode, const int value)
457 {
458 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, Type, static_cast<ButtonType>(value), frameNode);
459 }
460
SetStateEffect(FrameNode * frameNode,const bool stateEffect)461 void ButtonModelNG::SetStateEffect(FrameNode* frameNode, const bool stateEffect)
462 {
463 CHECK_NULL_VOID(frameNode);
464 auto buttonEventHub = frameNode->GetEventHub<ButtonEventHub>();
465 CHECK_NULL_VOID(buttonEventHub);
466 buttonEventHub->SetStateEffect(stateEffect);
467 }
468
SetLabelStyle(FrameNode * frameNode,const ButtonParameters & buttonParameters)469 void ButtonModelNG::SetLabelStyle(FrameNode* frameNode, const ButtonParameters& buttonParameters)
470 {
471 if (buttonParameters.textOverflow.has_value()) {
472 ACE_UPDATE_NODE_LAYOUT_PROPERTY(
473 ButtonLayoutProperty, TextOverflow, buttonParameters.textOverflow.value(), frameNode);
474 }
475 if (buttonParameters.maxLines.has_value()) {
476 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, MaxLines, buttonParameters.maxLines.value(), frameNode);
477 }
478 if (buttonParameters.minFontSize.has_value()) {
479 ACE_UPDATE_NODE_LAYOUT_PROPERTY(
480 ButtonLayoutProperty, MinFontSize, buttonParameters.minFontSize.value(), frameNode);
481 }
482 if (buttonParameters.maxFontSize.has_value()) {
483 ACE_UPDATE_NODE_LAYOUT_PROPERTY(
484 ButtonLayoutProperty, MaxFontSize, buttonParameters.maxFontSize.value(), frameNode);
485 }
486 if (buttonParameters.heightAdaptivePolicy.has_value()) {
487 ACE_UPDATE_NODE_LAYOUT_PROPERTY(
488 ButtonLayoutProperty, HeightAdaptivePolicy, buttonParameters.heightAdaptivePolicy.value(), frameNode);
489 }
490 if (buttonParameters.fontSize.has_value()) {
491 auto fontSize = buttonParameters.fontSize.value();
492 if (GreatOrEqual(fontSize.Value(), 0.0)) {
493 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontSize, fontSize, frameNode);
494 } else {
495 auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
496 CHECK_NULL_VOID(layoutProperty);
497 auto context = PipelineBase::GetCurrentContextSafely();
498 CHECK_NULL_VOID(context);
499 auto buttonTheme = context->GetTheme<ButtonTheme>();
500 CHECK_NULL_VOID(buttonTheme);
501 auto themeFontSize = buttonTheme->GetTextSize(layoutProperty->GetControlSizeValue(ControlSize::NORMAL));
502 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontSize, themeFontSize, frameNode);
503 }
504 }
505 if (buttonParameters.fontWeight.has_value()) {
506 ACE_UPDATE_NODE_LAYOUT_PROPERTY(
507 ButtonLayoutProperty, FontWeight, buttonParameters.fontWeight.value(), frameNode);
508 }
509 if (buttonParameters.fontFamily.has_value()) {
510 ACE_UPDATE_NODE_LAYOUT_PROPERTY(
511 ButtonLayoutProperty, FontFamily, buttonParameters.fontFamily.value(), frameNode);
512 }
513 if (buttonParameters.fontStyle.has_value()) {
514 ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontStyle, buttonParameters.fontStyle.value(), frameNode);
515 }
516 }
517
SetSize(FrameNode * frameNode,const std::optional<Dimension> & width,const std::optional<Dimension> & height)518 void ButtonModelNG::SetSize(
519 FrameNode* frameNode, const std::optional<Dimension>& width, const std::optional<Dimension>& height)
520 {
521 if (width.has_value()) {
522 NG::ViewAbstract::SetWidth(frameNode, NG::CalcLength(width.value()));
523 }
524
525 if (height.has_value()) {
526 NG::ViewAbstract::SetHeight(frameNode, NG::CalcLength(height.value()));
527 }
528 }
529
GetLabel(FrameNode * frameNode)530 std::string ButtonModelNG::GetLabel(FrameNode* frameNode)
531 {
532 std::string value;
533 ACE_GET_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, Label, value, frameNode);
534 return value;
535 }
536
GetFontSize(FrameNode * frameNode)537 Dimension ButtonModelNG::GetFontSize(FrameNode* frameNode)
538 {
539 Dimension value;
540 ACE_GET_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontSize, value, frameNode);
541 return value;
542 }
543
GetFontWeight(FrameNode * frameNode)544 Ace::FontWeight ButtonModelNG::GetFontWeight(FrameNode* frameNode)
545 {
546 Ace::FontWeight value = Ace::FontWeight::NORMAL;
547 ACE_GET_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontWeight, value, frameNode);
548 return value;
549 }
550
GetFontColor(FrameNode * frameNode)551 Color ButtonModelNG::GetFontColor(FrameNode* frameNode)
552 {
553 Color value;
554 ACE_GET_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontColor, value, frameNode);
555 return value;
556 }
SetBuilderFunc(FrameNode * frameNode,NG::ButtonMakeCallback && makeFunc)557 void ButtonModelNG::SetBuilderFunc(FrameNode* frameNode, NG::ButtonMakeCallback&& makeFunc)
558 {
559 CHECK_NULL_VOID(frameNode);
560 auto pattern = frameNode->GetPattern<ButtonPattern>();
561 CHECK_NULL_VOID(pattern);
562 pattern->SetBuilderFunc(std::move(makeFunc));
563 }
564
TriggerClick(FrameNode * frameNode,double xPos,double yPos)565 void ButtonModelNG::TriggerClick(FrameNode* frameNode, double xPos, double yPos)
566 {
567 auto pattern = frameNode->GetPattern<ButtonPattern>();
568 CHECK_NULL_VOID(pattern);
569 auto host = pattern->GetHost();
570 CHECK_NULL_VOID(host);
571 auto gestureEventHub = host->GetOrCreateGestureEventHub();
572 if (!gestureEventHub->IsClickable()) {
573 return;
574 }
575 pattern->SetButtonPress(xPos, yPos);
576 }
577
ResetBorderRadius()578 void ButtonModelNG::ResetBorderRadius()
579 {
580 ACE_RESET_LAYOUT_PROPERTY(ButtonLayoutProperty, BorderRadius);
581 }
582
GetType(FrameNode * frameNode)583 ButtonType ButtonModelNG::GetType(FrameNode* frameNode)
584 {
585 ButtonType value = ButtonType::CAPSULE;
586 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ButtonLayoutProperty, Type, value, frameNode, ButtonType::CAPSULE);
587 return value;
588 }
589
ApplyTheme(FrameNode * frameNode,ButtonStyleMode buttonStyle,ButtonRole buttonRole)590 void ButtonModelNG::ApplyTheme(FrameNode* frameNode, ButtonStyleMode buttonStyle, ButtonRole buttonRole)
591 {
592 auto context = PipelineBase::GetCurrentContextSafely();
593 CHECK_NULL_VOID(context);
594 auto buttonTheme = context->GetTheme<ButtonTheme>();
595 CHECK_NULL_VOID(buttonTheme);
596 auto bgColor = buttonTheme->GetBgColor(buttonStyle, buttonRole);
597 auto textColor = buttonTheme->GetTextColor(buttonStyle, buttonRole);
598 BackgroundColor(frameNode, bgColor, true);
599 auto property = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
600 CHECK_NULL_VOID(property);
601 if (!property->GetCreateWithLabelValue(false)) {
602 return;
603 }
604 SetFontColor(frameNode, textColor);
605 }
606
SetLabelWithCheck(FrameNode * frameNode,const char * label)607 void ButtonModelNG::SetLabelWithCheck(FrameNode* frameNode, const char* label)
608 {
609 auto property = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
610 CHECK_NULL_VOID(property);
611 if (!property->GetCreateWithLabelValue(false)) {
612 return;
613 }
614 SetLabel(frameNode, label);
615 }
616
SetCreateWithLabel(bool createWithLabel)617 void ButtonModelNG::SetCreateWithLabel(bool createWithLabel)
618 {
619 ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, CreateWithLabel, createWithLabel);
620 }
621
SetCreateWithLabel(FrameNode * frameNode,bool createWithLabel)622 void ButtonModelNG::SetCreateWithLabel(FrameNode* frameNode, bool createWithLabel)
623 {
624 auto property = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
625 CHECK_NULL_VOID(property);
626 if (property->HasCreateWithLabel()) {
627 return;
628 }
629 property->UpdateCreateWithLabel(createWithLabel);
630 }
631 } // namespace OHOS::Ace::NG
632