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