• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/utils/utils.h"
19 #include "core/common/resource/resource_parse_utils.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_stack_processor.h"
24 #include "core/components_ng/pattern/button/button_event_hub.h"
25 #include "core/components_ng/pattern/button/button_pattern.h"
26 #include "core/components_ng/pattern/text/text_pattern.h"
27 
28 namespace OHOS::Ace::NG {
SetFontSize(const Dimension & fontSize)29 void ButtonModelNG::SetFontSize(const Dimension& fontSize)
30 {
31     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontSize, fontSize);
32 }
33 
SetFontWeight(const Ace::FontWeight & fontWeight)34 void ButtonModelNG::SetFontWeight(const Ace::FontWeight& fontWeight)
35 {
36     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontWeight, fontWeight);
37 }
38 
SetFontStyle(const Ace::FontStyle & fontStyle)39 void ButtonModelNG::SetFontStyle(const Ace::FontStyle& fontStyle)
40 {
41     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontStyle, fontStyle);
42 }
43 
SetFontFamily(const std::vector<std::string> & fontFamily)44 void ButtonModelNG::SetFontFamily(const std::vector<std::string>& fontFamily)
45 {
46     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontFamily, fontFamily);
47     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontColorSetByUser, true);
48 }
49 
SetFontColor(const Color & textColor)50 void ButtonModelNG::SetFontColor(const Color& textColor)
51 {
52     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontColor, textColor);
53     ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, textColor);
54 }
55 
SetType(const int value)56 void ButtonModelNG::SetType(const int value)
57 {
58     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Type, static_cast<ButtonType>(value));
59 }
60 
SetStateEffect(const bool stateEffect)61 void ButtonModelNG::SetStateEffect(const bool stateEffect)
62 {
63     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
64     CHECK_NULL_VOID(frameNode);
65     auto buttonEventHub = frameNode->GetOrCreateEventHub<ButtonEventHub>();
66     CHECK_NULL_VOID(buttonEventHub);
67     buttonEventHub->SetStateEffect(stateEffect);
68 }
69 
SetLabelStyle(ButtonParameters & buttonParameters)70 void ButtonModelNG::SetLabelStyle(ButtonParameters& buttonParameters)
71 {
72     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
73     CHECK_NULL_VOID(frameNode);
74     SetLabelStyle(frameNode, buttonParameters);
75 }
76 
SetButtonStyle(const std::optional<ButtonStyleMode> & buttonStyle)77 void ButtonModelNG::SetButtonStyle(const std::optional<ButtonStyleMode>& buttonStyle)
78 {
79     if (buttonStyle.has_value()) {
80         ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, ButtonStyle, buttonStyle.value());
81         auto context = PipelineBase::GetCurrentContextSafely();
82         CHECK_NULL_VOID(context);
83         auto buttonTheme = context->GetTheme<ButtonTheme>();
84         CHECK_NULL_VOID(buttonTheme);
85         auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
86         auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
87         CHECK_NULL_VOID(layoutProperty);
88         ButtonRole buttonRole = layoutProperty->GetButtonRole().value_or(ButtonRole::NORMAL);
89         auto bgColor = buttonTheme->GetBgColor(buttonStyle.value(), buttonRole);
90         auto textColor = buttonTheme->GetTextColor(buttonStyle.value(), buttonRole);
91         BackgroundColor(bgColor, true);
92         SetFontColor(textColor);
93     }
94 }
95 
ParseButtonResColor(const RefPtr<ResourceObject> & resObj,Color & result,const ButtonColorType buttonColorType)96 void ButtonModelNG::ParseButtonResColor(
97     const RefPtr<ResourceObject>& resObj, Color& result, const ButtonColorType buttonColorType)
98 {
99     auto parseFlag = ResourceParseUtils::ParseResColor(resObj, result);
100     CHECK_EQUAL_VOID(parseFlag, true);
101     auto context = PipelineBase::GetCurrentContextSafely();
102     CHECK_NULL_VOID(context);
103     auto buttonTheme = context->GetTheme<ButtonTheme>();
104     CHECK_NULL_VOID(buttonTheme);
105     switch (buttonColorType) {
106         case ButtonColorType::FONT_COLOR:
107             result = buttonTheme->GetTextStyle().GetTextColor();
108             break;
109         case ButtonColorType::BACKGROUND_COLOR:
110             result = buttonTheme->GetBgColor();
111             break;
112         default:
113             break;
114     }
115 }
116 
CreateWithColorResourceObj(const RefPtr<ResourceObject> & resObj,const ButtonColorType buttonColorType)117 void ButtonModelNG::CreateWithColorResourceObj(const RefPtr<ResourceObject>& resObj,
118     const ButtonColorType buttonColorType)
119 {
120     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
121     CHECK_NULL_VOID(frameNode);
122     CreateWithColorResourceObj(frameNode, resObj, buttonColorType);
123 }
124 
UpdateResColor(FrameNode * frameNode,Color result,const ButtonColorType buttonColorType)125 void ButtonModelNG::UpdateResColor(FrameNode* frameNode, Color result, const ButtonColorType buttonColorType)
126 {
127     CHECK_NULL_VOID(frameNode);
128     switch (buttonColorType) {
129         case ButtonColorType::FONT_COLOR:
130             SetFontColor(frameNode, result);
131             break;
132         case ButtonColorType::BACKGROUND_COLOR:
133             BackgroundColor(frameNode, result, true);
134             break;
135         default:
136             break;
137     }
138     frameNode->MarkModifyDone();
139     frameNode->MarkDirtyNode(PROPERTY_UPDATE_NORMAL);
140 }
141 
CreateWithColorResourceObj(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj,const ButtonColorType buttonColorType)142 void ButtonModelNG::CreateWithColorResourceObj(
143     FrameNode* frameNode, const RefPtr<ResourceObject>& resObj, const ButtonColorType buttonColorType)
144 {
145     CHECK_NULL_VOID(frameNode);
146     auto pattern = frameNode->GetPattern<ButtonPattern>();
147     CHECK_NULL_VOID(pattern);
148     std::string key = "button" + ColorTypeToString(buttonColorType);
149     pattern->RemoveResObj(key);
150     CHECK_NULL_VOID(resObj);
151     auto&& updateFunc = [buttonColorType, weak = AceType::WeakClaim(frameNode)](
152         const RefPtr<ResourceObject>& resObj) {
153         auto frameNode = weak.Upgrade();
154         CHECK_NULL_VOID(frameNode);
155         Color result;
156         ParseButtonResColor(resObj, result, buttonColorType);
157         UpdateResColor(AceType::RawPtr(frameNode), result, buttonColorType);
158     };
159     pattern->AddResObj(key, resObj, std::move(updateFunc));
160 }
161 
CreateWithStringResourceObj(const RefPtr<ResourceObject> & resObj,const ButtonStringType buttonStringType)162 void ButtonModelNG::CreateWithStringResourceObj(const RefPtr<ResourceObject>& resObj,
163     const ButtonStringType buttonStringType)
164 {
165     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
166     CHECK_NULL_VOID(frameNode);
167     auto pattern = frameNode->GetPattern<ButtonPattern>();
168     CHECK_NULL_VOID(pattern);
169     std::string key = "button" + StringTypeToStr(buttonStringType);
170     pattern->RemoveResObj(key);
171     CHECK_NULL_VOID(resObj);
172     auto&& updateFunc = [buttonStringType, weak = AceType::WeakClaim(AceType::RawPtr(pattern))](
173         const RefPtr<ResourceObject>& resObj) {
174         auto pattern = weak.Upgrade();
175         CHECK_NULL_VOID(pattern);
176         std::string result;
177         if (ResourceParseUtils::ParseResString(resObj, result)) {
178             pattern->UpdateComponentString(result, buttonStringType);
179         }
180     };
181     pattern->AddResObj(key, resObj, std::move(updateFunc));
182 }
183 
CreateWithFamiliesResourceObj(const RefPtr<ResourceObject> & resObj,const ButtonStringType buttonStringType)184 void ButtonModelNG::CreateWithFamiliesResourceObj(const RefPtr<ResourceObject>& resObj,
185     const ButtonStringType buttonStringType)
186 {
187     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
188     CHECK_NULL_VOID(frameNode);
189     CreateWithFamiliesResourceObj(frameNode, resObj, buttonStringType);
190 }
191 
UpdateDefaultFamilies(FrameNode * frameNode,std::vector<std::string> & value,const ButtonStringType buttonStringType)192 void ButtonModelNG::UpdateDefaultFamilies(
193     FrameNode* frameNode, std::vector<std::string>& value, const ButtonStringType buttonStringType)
194 {
195     CHECK_NULL_VOID(frameNode);
196     auto pipelineContext = frameNode->GetContext();
197     CHECK_NULL_VOID(pipelineContext);
198     auto buttonTheme = pipelineContext->GetTheme<ButtonTheme>();
199     CHECK_NULL_VOID(buttonTheme);
200     value = buttonTheme->GetTextStyle().GetFontFamilies();
201 
202     if (pipelineContext->IsSystmColorChange()) {
203         switch (buttonStringType) {
204             case ButtonStringType::FONT_FAMILY:
205                 SetFontFamily(frameNode, value);
206                 break;
207             default:
208                 break;
209         }
210     }
211     if (frameNode->GetRerenderable()) {
212         frameNode->MarkDirtyNode(PROPERTY_UPDATE_NORMAL);
213     }
214 }
215 
UpdateComponentFamilies(FrameNode * frameNode,const std::vector<std::string> & value,const ButtonStringType buttonStringType)216 void ButtonModelNG::UpdateComponentFamilies(
217     FrameNode* frameNode, const std::vector<std::string>& value, const ButtonStringType buttonStringType)
218 {
219     CHECK_NULL_VOID(frameNode);
220     auto pipelineContext = frameNode->GetContext();
221     CHECK_NULL_VOID(pipelineContext);
222     auto buttonTheme = pipelineContext->GetTheme<ButtonTheme>();
223     if (pipelineContext->IsSystmColorChange()) {
224         switch (buttonStringType) {
225             case ButtonStringType::FONT_FAMILY:
226                 SetFontFamily(frameNode, value);
227                 break;
228             default:
229                 break;
230         }
231     }
232     if (frameNode->GetRerenderable()) {
233         frameNode->MarkModifyDone();
234         frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
235     }
236 }
237 
CreateWithFamiliesResourceObj(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj,const ButtonStringType buttonStringType)238 void ButtonModelNG::CreateWithFamiliesResourceObj(
239     FrameNode* frameNode, const RefPtr<ResourceObject>& resObj, const ButtonStringType buttonStringType)
240 {
241     CHECK_NULL_VOID(frameNode);
242     auto pattern = frameNode->GetPattern<ButtonPattern>();
243     CHECK_NULL_VOID(pattern);
244     std::string key = "button" + StringTypeToStr(buttonStringType);
245     pattern->RemoveResObj(key);
246     CHECK_NULL_VOID(resObj);
247     auto&& updateFunc = [buttonStringType, weak = AceType::WeakClaim(AceType::RawPtr(pattern))](
248                             const RefPtr<ResourceObject>& resObj) {
249         auto pattern = weak.Upgrade();
250         CHECK_NULL_VOID(pattern);
251         std::vector<std::string> result;
252         result.clear();
253         auto frameNode = pattern->GetHost();
254         CHECK_NULL_VOID(frameNode);
255         auto flag = ResourceParseUtils::ParseResFontFamilies(resObj, result);
256         if (!flag || result.empty()) {
257             UpdateDefaultFamilies(AceType::RawPtr(frameNode), result, buttonStringType);
258             return;
259         }
260         ButtonModelNG::UpdateComponentFamilies(AceType::RawPtr(frameNode), result, buttonStringType);
261     };
262     pattern->AddResObj(key, resObj, std::move(updateFunc));
263 }
264 
CreateWithDimensionFpResourceObj(const RefPtr<ResourceObject> & resObj,const ButtonDimensionType buttonDimensionType)265 void ButtonModelNG::CreateWithDimensionFpResourceObj(const RefPtr<ResourceObject>& resObj,
266     const ButtonDimensionType buttonDimensionType)
267 {
268     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
269     CHECK_NULL_VOID(frameNode);
270     CreateWithDimensionFpResourceObj(frameNode, resObj, buttonDimensionType);
271 }
CreateWithDimensionFpResourceObj(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj,const ButtonDimensionType buttonDimensionType)272 void ButtonModelNG::CreateWithDimensionFpResourceObj(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj,
273     const ButtonDimensionType buttonDimensionType)
274 {
275     CHECK_NULL_VOID(frameNode);
276     auto pattern = frameNode->GetPattern<ButtonPattern>();
277     CHECK_NULL_VOID(pattern);
278     std::string key = "button" + DimensionTypeToString(buttonDimensionType);
279     pattern->RemoveResObj(key);
280     CHECK_NULL_VOID(resObj);
281     auto&& updateFunc = [buttonDimensionType, weak = AceType::WeakClaim(AceType::RawPtr(pattern))](
282         const RefPtr<ResourceObject>& resObj) {
283         auto pattern = weak.Upgrade();
284         CHECK_NULL_VOID(pattern);
285         CalcDimension result;
286         if (ResourceParseUtils::ParseResDimensionFpNG(resObj, result, false)) {
287             pattern->UpdateComponentDimension(result, buttonDimensionType);
288         }
289     };
290     pattern->AddResObj(key, resObj, std::move(updateFunc));
291 }
292 
CreateWithDoubleResourceObj(const RefPtr<ResourceObject> & resObj,const ButtonDoubleType buttonDoubleType)293 void ButtonModelNG::CreateWithDoubleResourceObj(const RefPtr<ResourceObject>& resObj,
294     const ButtonDoubleType buttonDoubleType)
295 {
296     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
297     CHECK_NULL_VOID(frameNode);
298     CreateWithDoubleResourceObj(frameNode, resObj, buttonDoubleType);
299 }
300 
CheckFontScale(bool resultFlag,double result,const ButtonDoubleType buttonDoubleType)301 bool ButtonModelNG::CheckFontScale(bool resultFlag, double result, const ButtonDoubleType buttonDoubleType)
302 {
303     switch (buttonDoubleType) {
304         case ButtonDoubleType::MIN_FONT_SCALE:
305             if (LessNotEqual(result, 0.0f) || GreatNotEqual(result, 1.0f)) {
306                 resultFlag = true;
307             }
308             break;
309         case ButtonDoubleType::MAX_FONT_SCALE:
310             resultFlag = LessNotEqual(result, 1.0f);
311             break;
312     }
313     return resultFlag;
314 }
315 
CreateWithDoubleResourceObj(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj,const ButtonDoubleType buttonDoubleType)316 void ButtonModelNG::CreateWithDoubleResourceObj(
317     FrameNode* frameNode, const RefPtr<ResourceObject>& resObj, const ButtonDoubleType buttonDoubleType)
318 {
319     CHECK_NULL_VOID(frameNode);
320     auto pattern = frameNode->GetPattern<ButtonPattern>();
321     CHECK_NULL_VOID(pattern);
322     std::string key = "button" + DoubleTypeToString(buttonDoubleType);
323     pattern->RemoveResObj(key);
324     CHECK_NULL_VOID(resObj);
325     auto&& updateFunc = [buttonDoubleType, weak = AceType::WeakClaim(AceType::RawPtr(pattern))](
326         const RefPtr<ResourceObject>& resObj) {
327         auto pattern = weak.Upgrade();
328         CHECK_NULL_VOID(pattern);
329         double result;
330         if (ResourceParseUtils::ParseResDouble(resObj, result)) {
331             bool resultFlag = false;
332             CHECK_EQUAL_VOID(CheckFontScale(resultFlag, result, buttonDoubleType), true);
333             pattern->UpdateComponentDouble(result, buttonDoubleType);
334         }
335     };
336     pattern->AddResObj(key, resObj, std::move(updateFunc));
337 }
338 
ColorTypeToString(const ButtonColorType buttonColorType)339 std::string ButtonModelNG::ColorTypeToString(const ButtonColorType buttonColorType)
340 {
341     std::string rst;
342     switch (buttonColorType) {
343         case ButtonColorType::FONT_COLOR:
344             rst = "FontColor";
345             break;
346         case ButtonColorType::BACKGROUND_COLOR:
347             rst = "BackgroundColor";
348             break;
349         default:
350             rst = "Unknown";
351             break;
352     }
353     return rst;
354 }
355 
StringTypeToStr(const ButtonStringType buttonStringType)356 std::string ButtonModelNG::StringTypeToStr(const ButtonStringType buttonStringType)
357 {
358     std::string rst;
359     switch (buttonStringType) {
360         case ButtonStringType::LABEL:
361             rst = "Label";
362             break;
363         case ButtonStringType::FONT_FAMILY:
364             rst = "FontFamily";
365             break;
366         default:
367             rst = "Unknown";
368             break;
369     }
370     return rst;
371 }
372 
DimensionTypeToString(const ButtonDimensionType buttonDimensionType)373 std::string ButtonModelNG::DimensionTypeToString(const ButtonDimensionType buttonDimensionType)
374 {
375     std::string rst;
376     switch (buttonDimensionType) {
377         case ButtonDimensionType::MIN_FONT_SIZE:
378             rst = "MinFontSize";
379             break;
380         case ButtonDimensionType::MAX_FONT_SIZE:
381             rst = "MaxFontSize";
382             break;
383         default:
384             rst = "Unknown";
385             break;
386     }
387     return rst;
388 }
389 
DoubleTypeToString(const ButtonDoubleType buttonDoubleType)390 std::string ButtonModelNG::DoubleTypeToString(const ButtonDoubleType buttonDoubleType)
391 {
392     std::string rst;
393     switch (buttonDoubleType) {
394         case ButtonDoubleType::MIN_FONT_SCALE:
395             rst = "MinFontScale";
396             break;
397         case ButtonDoubleType::MAX_FONT_SCALE:
398             rst = "MaxFontScale";
399             break;
400         default:
401             rst = "Unknown";
402             break;
403     }
404     return rst;
405 }
406 
SetRole(const std::optional<ButtonRole> & buttonRole)407 void ButtonModelNG::SetRole(const std::optional<ButtonRole>& buttonRole)
408 {
409     if (buttonRole.has_value()) {
410         ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, ButtonRole, buttonRole.value());
411         auto context = PipelineBase::GetCurrentContextSafely();
412         CHECK_NULL_VOID(context);
413         auto buttonTheme = context->GetTheme<ButtonTheme>();
414         CHECK_NULL_VOID(buttonTheme);
415         auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
416         auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
417         CHECK_NULL_VOID(layoutProperty);
418         ButtonStyleMode buttonStyleMode = layoutProperty->GetButtonStyle().value_or(ButtonStyleMode::EMPHASIZE);
419         auto bgColor = buttonTheme->GetBgColor(buttonStyleMode, buttonRole.value());
420         auto textColor = buttonTheme->GetTextColor(buttonStyleMode, buttonRole.value());
421         BackgroundColor(bgColor, true);
422         SetFontColor(textColor);
423     }
424 }
425 
SetControlSize(const std::optional<ControlSize> & controlSize)426 void ButtonModelNG::SetControlSize(const std::optional<ControlSize>& controlSize)
427 {
428     if (controlSize.has_value()) {
429         ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, ControlSize, controlSize.value());
430         auto context = PipelineBase::GetCurrentContextSafely();
431         CHECK_NULL_VOID(context);
432         auto buttonTheme = context->GetTheme<ButtonTheme>();
433         CHECK_NULL_VOID(buttonTheme);
434         auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
435         CHECK_NULL_VOID(frameNode);
436         SetButtonSize(frameNode, controlSize, buttonTheme);
437         Dimension fontSize = buttonTheme->GetTextSize(controlSize.value());
438         SetFontSize(fontSize);
439     }
440 }
441 
SetRole(FrameNode * frameNode,const std::optional<ButtonRole> & buttonRole)442 void ButtonModelNG::SetRole(FrameNode* frameNode, const std::optional<ButtonRole>& buttonRole)
443 {
444     if (buttonRole.has_value()) {
445         ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, ButtonRole, buttonRole.value(), frameNode);
446         auto context = PipelineBase::GetCurrentContextSafely();
447         CHECK_NULL_VOID(context);
448         auto buttonTheme = context->GetTheme<ButtonTheme>();
449         CHECK_NULL_VOID(buttonTheme);
450         auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
451         CHECK_NULL_VOID(layoutProperty);
452         ButtonStyleMode buttonStyleMode = layoutProperty->GetButtonStyle().value_or(ButtonStyleMode::EMPHASIZE);
453         auto bgColor = buttonTheme->GetBgColor(buttonStyleMode, buttonRole.value());
454         auto textColor = buttonTheme->GetTextColor(buttonStyleMode, buttonRole.value());
455         BackgroundColor(frameNode, bgColor, true);
456         SetFontColor(frameNode, textColor);
457     }
458 }
459 
SetButtonStyle(FrameNode * frameNode,const std::optional<ButtonStyleMode> & buttonStyle)460 void ButtonModelNG::SetButtonStyle(FrameNode* frameNode, const std::optional<ButtonStyleMode>& buttonStyle)
461 {
462     if (buttonStyle.has_value()) {
463         ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, ButtonStyle, buttonStyle.value(), frameNode);
464         auto context = PipelineBase::GetCurrentContextSafely();
465         CHECK_NULL_VOID(context);
466         auto buttonTheme = context->GetTheme<ButtonTheme>();
467         CHECK_NULL_VOID(buttonTheme);
468         auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
469         CHECK_NULL_VOID(layoutProperty);
470         ButtonRole buttonRole = layoutProperty->GetButtonRole().value_or(ButtonRole::NORMAL);
471         auto bgColor = buttonTheme->GetBgColor(buttonStyle.value(), buttonRole);
472         auto textColor = buttonTheme->GetTextColor(buttonStyle.value(), buttonRole);
473         BackgroundColor(frameNode, bgColor, true);
474         SetFontColor(frameNode, textColor);
475     }
476 }
477 
SetButtonSize(FrameNode * frameNode,const std::optional<ControlSize> & controlSize,RefPtr<ButtonTheme> buttonTheme)478 void ButtonModelNG::SetButtonSize(FrameNode* frameNode, const std::optional<ControlSize>& controlSize,
479     RefPtr<ButtonTheme> buttonTheme)
480 {
481     auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
482     CHECK_NULL_VOID(layoutProperty);
483     if (controlSize.has_value()) {
484         auto padding = buttonTheme->GetPadding(controlSize.value());
485         ButtonStyleMode buttonStyle = layoutProperty->GetButtonStyle().value_or(ButtonStyleMode::EMPHASIZE);
486         PaddingProperty defaultPadding;
487         if (buttonStyle == ButtonStyleMode::TEXT && controlSize.value() == ControlSize::SMALL) {
488             float leftPadding = buttonTheme->GetPaddingText().ConvertToPx();
489             float rightPadding = buttonTheme->GetPaddingText().ConvertToPx();
490             defaultPadding = { CalcLength(leftPadding), CalcLength(rightPadding), CalcLength(padding.Top()),
491                 CalcLength(padding.Bottom()) };
492         } else {
493             defaultPadding = { CalcLength(padding.Left()), CalcLength(padding.Right()), CalcLength(padding.Top()),
494                 CalcLength(padding.Bottom()) };
495         }
496         ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Padding, defaultPadding);
497     }
498 }
499 
SetControlSize(FrameNode * frameNode,const std::optional<ControlSize> & controlSize)500 void ButtonModelNG::SetControlSize(FrameNode* frameNode, const std::optional<ControlSize>& controlSize)
501 {
502     if (controlSize.has_value()) {
503         ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, ControlSize, controlSize.value(), frameNode);
504         auto context = PipelineBase::GetCurrentContextSafely();
505         CHECK_NULL_VOID(context);
506         auto buttonTheme = context->GetTheme<ButtonTheme>();
507         CHECK_NULL_VOID(buttonTheme);
508         SetButtonSize(frameNode, controlSize, buttonTheme);
509         Dimension fontSize = buttonTheme->GetTextSize(controlSize.value());
510         SetFontSize(frameNode, fontSize);
511     }
512 }
513 
CreateWithLabel(const CreateWithPara & para,std::list<RefPtr<Component>> & buttonChildren)514 void ButtonModelNG::CreateWithLabel(const CreateWithPara& para, std::list<RefPtr<Component>>& buttonChildren)
515 {
516     CreateWithLabel(para.label.value_or(""));
517     SetTypeAndStateEffect(para.type, para.stateEffect);
518     SetButtonStyle(para.buttonStyleMode);
519     SetControlSize(para.controlSize);
520     SetRole(para.buttonRole);
521 }
522 
CreateWithLabel(const std::string & label)523 void ButtonModelNG::CreateWithLabel(const std::string& label)
524 {
525     auto* stack = ViewStackProcessor::GetInstance();
526     auto nodeId = stack->ClaimNodeId();
527     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::BUTTON_ETS_TAG, nodeId);
528     auto buttonNode = FrameNode::GetOrCreateFrameNode(
529         V2::BUTTON_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
530     CHECK_NULL_VOID(buttonNode);
531     if (buttonNode->GetChildren().empty()) {
532         auto textNode = FrameNode::CreateFrameNode(
533             V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
534         CHECK_NULL_VOID(textNode);
535         textNode->SetInternal();
536         SetTextDefaultStyle(textNode, label);
537         buttonNode->AddChild(textNode);
538     }
539     auto buttonAccessibilityProperty = buttonNode->GetAccessibilityProperty<AccessibilityProperty>();
540     CHECK_NULL_VOID(buttonAccessibilityProperty);
541     buttonAccessibilityProperty->SetText(label);
542     stack->Push(buttonNode);
543     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Label, label);
544     auto layoutProperty = buttonNode->GetLayoutProperty();
545     CHECK_NULL_VOID(layoutProperty);
546     if (layoutProperty->GetPaddingProperty()) {
547         return;
548     }
549     auto context = PipelineBase::GetCurrentContextSafely();
550     CHECK_NULL_VOID(context);
551     auto buttonTheme = context->GetTheme<ButtonTheme>();
552     CHECK_NULL_VOID(buttonTheme);
553     auto padding = buttonTheme->GetPadding();
554     PaddingProperty defaultPadding = { CalcLength(padding.Left()), CalcLength(padding.Right()),
555         CalcLength(padding.Top()), CalcLength(padding.Bottom()), std::nullopt, std::nullopt };
556     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Padding, defaultPadding);
557 }
558 
SetLabel(FrameNode * frameNode,const char * label)559 void ButtonModelNG::SetLabel(FrameNode* frameNode, const char* label)
560 {
561     CHECK_NULL_VOID(frameNode);
562     if (frameNode->GetChildren().empty()) {
563         auto textNode = FrameNode::CreateFrameNode(
564             V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
565         CHECK_NULL_VOID(textNode);
566         textNode->SetInternal();
567         SetTextDefaultStyle(textNode, label);
568         frameNode->AddChild(textNode);
569     }
570     auto buttonAccessibilityProperty = frameNode->GetAccessibilityProperty<AccessibilityProperty>();
571     CHECK_NULL_VOID(buttonAccessibilityProperty);
572     buttonAccessibilityProperty->SetText(label);
573     auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
574     CHECK_NULL_VOID(layoutProperty);
575     layoutProperty->UpdateLabel(label);
576     if (layoutProperty->GetPaddingProperty()) {
577         return;
578     }
579     auto context = frameNode->GetContext();
580     CHECK_NULL_VOID(context);
581     auto buttonTheme = context->GetTheme<ButtonTheme>();
582     CHECK_NULL_VOID(buttonTheme);
583     auto padding = buttonTheme->GetPadding();
584     PaddingProperty defaultPadding = { CalcLength(padding.Left()), CalcLength(padding.Right()),
585         CalcLength(padding.Top()), CalcLength(padding.Bottom()), std::nullopt, std::nullopt };
586     layoutProperty->UpdatePadding(defaultPadding);
587 }
588 
Create(const CreateWithPara & para,std::list<RefPtr<Component>> & buttonChildren)589 void ButtonModelNG::Create(const CreateWithPara& para, std::list<RefPtr<Component>>& buttonChildren) {}
590 
CreateWithChild(const CreateWithPara & para)591 void ButtonModelNG::CreateWithChild(const CreateWithPara& para)
592 {
593     std::string tagName = "Button";
594     Create(tagName);
595     if (para.optionSetFirst.has_value() && para.optionSetFirst.value()) {
596         SetTypeAndStateEffect(para.type, para.stateEffect);
597         SetButtonStyle(para.buttonStyleMode);
598         SetControlSize(para.controlSize);
599         SetRole(para.buttonRole);
600     } else if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_EIGHTEEN)) {
601         ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Type, ButtonType::ROUNDED_RECTANGLE);
602     }
603 }
604 
Create(const std::string & tagName)605 void ButtonModelNG::Create(const std::string& tagName)
606 {
607     auto* stack = ViewStackProcessor::GetInstance();
608     auto nodeId = stack->ClaimNodeId();
609     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", tagName.c_str(), nodeId);
610     auto frameNode =
611         FrameNode::GetOrCreateFrameNode(tagName, nodeId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
612     stack->Push(frameNode);
613 
614     auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
615     CHECK_NULL_VOID(layoutProperty);
616     layoutProperty->ResetFontColorSetByUser();
617 }
618 
CreateFrameNode(int32_t nodeId)619 RefPtr<FrameNode> ButtonModelNG::CreateFrameNode(int32_t nodeId)
620 {
621     auto frameNode = FrameNode::CreateFrameNode(V2::BUTTON_ETS_TAG, nodeId, AceType::MakeRefPtr<ButtonPattern>());
622     CHECK_NULL_RETURN(frameNode, nullptr);
623     auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
624     CHECK_NULL_RETURN(layoutProperty, nullptr);
625     if (layoutProperty->GetPaddingProperty()) {
626         return frameNode;
627     }
628     auto context = PipelineBase::GetCurrentContextSafely();
629     CHECK_NULL_RETURN(context, nullptr);
630     auto buttonTheme = context->GetTheme<ButtonTheme>();
631     CHECK_NULL_RETURN(buttonTheme, nullptr);
632     auto padding = buttonTheme->GetPadding();
633     PaddingProperty defaultPadding = { CalcLength(padding.Left()), CalcLength(padding.Right()),
634         CalcLength(padding.Top()), CalcLength(padding.Bottom()), std::nullopt, std::nullopt };
635     layoutProperty->UpdatePadding(defaultPadding);
636 
637     if (frameNode->GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_EIGHTEEN)) {
638         // undefined use ROUNDED_RECTANGLE type.
639         layoutProperty->UpdateType(ButtonType::ROUNDED_RECTANGLE);
640     } else {
641         // undefined use capsule type.
642         layoutProperty->UpdateType(ButtonType::CAPSULE);
643     }
644     return frameNode;
645 }
646 
Padding(const PaddingProperty & paddingNew,const Edge & paddingOld)647 void ButtonModelNG::Padding(const PaddingProperty& paddingNew, const Edge& paddingOld)
648 {
649     NG::ViewAbstract::SetPadding(paddingNew);
650     auto button = ViewStackProcessor::GetInstance()->GetMainFrameNode();
651     CHECK_NULL_VOID(button);
652     auto pattern = button->GetPattern<ButtonPattern>();
653     CHECK_NULL_VOID(pattern);
654     pattern->SetHasCustomPadding(true);
655 }
656 
OnClick(GestureEventFunc && tapEventFunc,ClickEventFunc && clickEventFunc,double distanceThreshold)657 void ButtonModelNG::OnClick(GestureEventFunc&& tapEventFunc, ClickEventFunc&& clickEventFunc, double distanceThreshold)
658 {
659     ViewAbstract::SetOnClick(std::move(tapEventFunc), distanceThreshold);
660 }
661 
BackgroundColor(const Color & color,const bool & colorFlag)662 void ButtonModelNG::BackgroundColor(const Color& color, const bool& colorFlag)
663 {
664     ViewAbstract::SetBackgroundColor(color);
665 }
666 
BackgroundColor(FrameNode * frameNode,const Color & color,const bool & colorFlag)667 void ButtonModelNG::BackgroundColor(FrameNode* frameNode, const Color& color, const bool& colorFlag)
668 {
669     ViewAbstract::SetBackgroundColor(frameNode, color);
670 }
671 
SetSize(const std::optional<Dimension> & width,const std::optional<Dimension> & height)672 void ButtonModelNG::SetSize(const std::optional<Dimension>& width, const std::optional<Dimension>& height)
673 {
674     if (width.has_value()) {
675         NG::ViewAbstract::SetWidth(NG::CalcLength(width.value()));
676     }
677 
678     if (height.has_value()) {
679         NG::ViewAbstract::SetHeight(NG::CalcLength(height.value()));
680     }
681 }
682 
SetBorderRadius(const Dimension & radius)683 void ButtonModelNG::SetBorderRadius(const Dimension& radius)
684 {
685     NG::BorderRadiusProperty borderRadius;
686     borderRadius.radiusTopLeft = radius;
687     borderRadius.radiusTopRight = radius;
688     borderRadius.radiusBottomLeft = radius;
689     borderRadius.radiusBottomRight = radius;
690     borderRadius.multiValued = true;
691     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, BorderRadius, borderRadius);
692 }
693 
SetBorderRadius(FrameNode * frameNode,const Dimension & radius)694 void ButtonModelNG::SetBorderRadius(FrameNode* frameNode, const Dimension& radius)
695 {
696     NG::BorderRadiusProperty borderRadius;
697     borderRadius.radiusTopLeft = radius;
698     borderRadius.radiusTopRight = radius;
699     borderRadius.radiusBottomLeft = radius;
700     borderRadius.radiusBottomRight = radius;
701     borderRadius.multiValued = true;
702     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, BorderRadius, borderRadius, frameNode);
703 }
704 
SetBorderRadius(const std::optional<Dimension> & radiusTopLeft,const std::optional<Dimension> & radiusTopRight,const std::optional<Dimension> & radiusBottomLeft,const std::optional<Dimension> & radiusBottomRight)705 void ButtonModelNG::SetBorderRadius(const std::optional<Dimension>& radiusTopLeft,
706     const std::optional<Dimension>& radiusTopRight, const std::optional<Dimension>& radiusBottomLeft,
707     const std::optional<Dimension>& radiusBottomRight)
708 {
709     NG::BorderRadiusProperty borderRadius;
710     borderRadius.radiusTopLeft = radiusTopLeft;
711     borderRadius.radiusTopRight = radiusTopRight;
712     borderRadius.radiusBottomLeft = radiusBottomLeft;
713     borderRadius.radiusBottomRight = radiusBottomRight;
714     borderRadius.multiValued = true;
715     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, BorderRadius, borderRadius);
716 }
717 
SetLocalizedBorderRadius(const std::optional<Dimension> & radiusTopStart,const std::optional<Dimension> & radiusTopEnd,const std::optional<Dimension> & radiusBottomStart,const std::optional<Dimension> & radiusBottomEnd)718 void ButtonModelNG::SetLocalizedBorderRadius(const std::optional<Dimension>& radiusTopStart,
719     const std::optional<Dimension>& radiusTopEnd, const std::optional<Dimension>& radiusBottomStart,
720     const std::optional<Dimension>& radiusBottomEnd)
721 {
722     NG::BorderRadiusProperty borderRadius;
723     borderRadius.radiusTopStart = radiusTopStart;
724     borderRadius.radiusTopEnd = radiusTopEnd;
725     borderRadius.radiusBottomStart = radiusBottomStart;
726     borderRadius.radiusBottomEnd = radiusBottomEnd;
727     borderRadius.multiValued = true;
728     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, BorderRadius, borderRadius);
729 }
730 
SetBorderRadius(FrameNode * frameNode,const std::optional<Dimension> & radiusTopLeft,const std::optional<Dimension> & radiusTopRight,const std::optional<Dimension> & radiusBottomLeft,const std::optional<Dimension> & radiusBottomRight)731 void ButtonModelNG::SetBorderRadius(FrameNode* frameNode, const std::optional<Dimension>& radiusTopLeft,
732     const std::optional<Dimension>& radiusTopRight, const std::optional<Dimension>& radiusBottomLeft,
733     const std::optional<Dimension>& radiusBottomRight)
734 {
735     NG::BorderRadiusProperty borderRadius;
736     borderRadius.radiusTopLeft = radiusTopLeft;
737     borderRadius.radiusTopRight = radiusTopRight;
738     borderRadius.radiusBottomLeft = radiusBottomLeft;
739     borderRadius.radiusBottomRight = radiusBottomRight;
740     borderRadius.multiValued = true;
741     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, BorderRadius, borderRadius, frameNode);
742 }
743 
SetTypeAndStateEffect(const std::optional<ButtonType> & type,const std::optional<bool> & stateEffect)744 void ButtonModelNG::SetTypeAndStateEffect(const std::optional<ButtonType>& type, const std::optional<bool>& stateEffect)
745 {
746     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
747     CHECK_NULL_VOID(frameNode);
748 
749     if (type.has_value()) {
750         ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Type, type.value());
751     } else {
752         if (frameNode->GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_EIGHTEEN)) {
753             // undefined use ROUNDED_RECTANGLE type.
754             ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Type, ButtonType::ROUNDED_RECTANGLE);
755         } else {
756             // undefined use capsule type.
757             ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, Type, ButtonType::CAPSULE);
758         }
759     }
760 
761     auto buttonEventHub = frameNode->GetOrCreateEventHub<ButtonEventHub>();
762     CHECK_NULL_VOID(buttonEventHub);
763     buttonEventHub->SetStateEffect(stateEffect.value_or(true));
764 }
765 
SetTextDefaultStyle(const RefPtr<FrameNode> & textNode,const std::string & label)766 void ButtonModelNG::SetTextDefaultStyle(const RefPtr<FrameNode>& textNode, const std::string& label)
767 {
768     CHECK_NULL_VOID(textNode);
769     auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
770     CHECK_NULL_VOID(textLayoutProperty);
771     auto context = textNode->GetContext();
772     CHECK_NULL_VOID(context);
773     auto buttonTheme = context->GetTheme<ButtonTheme>();
774     CHECK_NULL_VOID(buttonTheme);
775     auto textStyle = buttonTheme->GetTextStyle();
776     textLayoutProperty->UpdateContent(label);
777     textLayoutProperty->UpdateTextOverflow(TextOverflow::ELLIPSIS);
778     textLayoutProperty->UpdateMaxLines(buttonTheme->GetTextMaxLines());
779     textLayoutProperty->UpdateFontWeight(textStyle.GetFontWeight());
780     textLayoutProperty->UpdateAdaptFontSizeStep(Dimension(1.0, DimensionUnit::FP));
781 }
782 
SetFontSize(FrameNode * frameNode,const Dimension & fontSize)783 void ButtonModelNG::SetFontSize(FrameNode* frameNode, const Dimension& fontSize)
784 {
785     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontSize, fontSize, frameNode);
786     CHECK_NULL_VOID(frameNode);
787     auto textNode = AceType::DynamicCast<FrameNode>(frameNode->GetFirstChild());
788     CHECK_NULL_VOID(textNode);
789     auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
790     CHECK_NULL_VOID(textLayoutProperty);
791     textLayoutProperty->ResetAdaptMinFontSize();
792     textLayoutProperty->ResetAdaptMaxFontSize();
793 }
794 
SetFontWeight(FrameNode * frameNode,const Ace::FontWeight & fontWeight)795 void ButtonModelNG::SetFontWeight(FrameNode* frameNode, const Ace::FontWeight& fontWeight)
796 {
797     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontWeight, fontWeight, frameNode);
798 }
799 
SetFontStyle(FrameNode * frameNode,const Ace::FontStyle & fontStyle)800 void ButtonModelNG::SetFontStyle(FrameNode* frameNode, const Ace::FontStyle& fontStyle)
801 {
802     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontStyle, fontStyle, frameNode);
803 }
804 
SetFontFamily(FrameNode * frameNode,const std::vector<std::string> & fontFamily)805 void ButtonModelNG::SetFontFamily(FrameNode* frameNode, const std::vector<std::string>& fontFamily)
806 {
807     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontFamily, fontFamily, frameNode);
808     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontColorSetByUser, true, frameNode);
809 }
810 
SetFontColor(FrameNode * frameNode,const Color & textColor)811 void ButtonModelNG::SetFontColor(FrameNode* frameNode, const Color& textColor)
812 {
813     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontColor, textColor, frameNode);
814     ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColor, textColor, frameNode);
815 }
816 
SetType(FrameNode * frameNode,const int value)817 void ButtonModelNG::SetType(FrameNode* frameNode, const int value)
818 {
819     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, Type, static_cast<ButtonType>(value), frameNode);
820 }
821 
SetStateEffect(FrameNode * frameNode,const bool stateEffect)822 void ButtonModelNG::SetStateEffect(FrameNode* frameNode, const bool stateEffect)
823 {
824     CHECK_NULL_VOID(frameNode);
825     auto buttonEventHub = frameNode->GetOrCreateEventHub<ButtonEventHub>();
826     CHECK_NULL_VOID(buttonEventHub);
827     buttonEventHub->SetStateEffect(stateEffect);
828 }
829 
SetLabelStyle(FrameNode * frameNode,const ButtonParameters & buttonParameters)830 void ButtonModelNG::SetLabelStyle(FrameNode* frameNode, const ButtonParameters& buttonParameters)
831 {
832     if (buttonParameters.textOverflow.has_value()) {
833         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
834             ButtonLayoutProperty, TextOverflow, buttonParameters.textOverflow.value(), frameNode);
835     }
836     if (buttonParameters.maxLines.has_value()) {
837         ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, MaxLines, buttonParameters.maxLines.value(), frameNode);
838     }
839     if (buttonParameters.minFontSize.has_value()) {
840         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
841             ButtonLayoutProperty, MinFontSize, buttonParameters.minFontSize.value(), frameNode);
842     }
843     if (buttonParameters.maxFontSize.has_value()) {
844         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
845             ButtonLayoutProperty, MaxFontSize, buttonParameters.maxFontSize.value(), frameNode);
846     }
847     if (buttonParameters.heightAdaptivePolicy.has_value()) {
848         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
849             ButtonLayoutProperty, HeightAdaptivePolicy, buttonParameters.heightAdaptivePolicy.value(), frameNode);
850     }
851     if (buttonParameters.fontSize.has_value()) {
852         auto fontSize = buttonParameters.fontSize.value();
853         if (GreatOrEqual(fontSize.Value(), 0.0)) {
854             ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontSize, fontSize, frameNode);
855         } else {
856             auto layoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
857             CHECK_NULL_VOID(layoutProperty);
858             auto context = PipelineBase::GetCurrentContextSafely();
859             CHECK_NULL_VOID(context);
860             auto buttonTheme = context->GetTheme<ButtonTheme>();
861             CHECK_NULL_VOID(buttonTheme);
862             auto themeFontSize = buttonTheme->GetTextSize(layoutProperty->GetControlSizeValue(ControlSize::NORMAL));
863             ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontSize, themeFontSize, frameNode);
864         }
865     }
866     if (buttonParameters.fontWeight.has_value()) {
867         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
868             ButtonLayoutProperty, FontWeight, buttonParameters.fontWeight.value(), frameNode);
869     }
870     if (buttonParameters.fontFamily.has_value()) {
871         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
872             ButtonLayoutProperty, FontFamily, buttonParameters.fontFamily.value(), frameNode);
873     }
874     if (buttonParameters.fontStyle.has_value()) {
875         ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, FontStyle, buttonParameters.fontStyle.value(), frameNode);
876     }
877 }
878 
SetSize(FrameNode * frameNode,const std::optional<Dimension> & width,const std::optional<Dimension> & height)879 void ButtonModelNG::SetSize(
880     FrameNode* frameNode, const std::optional<Dimension>& width, const std::optional<Dimension>& height)
881 {
882     if (width.has_value()) {
883         NG::ViewAbstract::SetWidth(frameNode, NG::CalcLength(width.value()));
884     }
885 
886     if (height.has_value()) {
887         NG::ViewAbstract::SetHeight(frameNode, NG::CalcLength(height.value()));
888     }
889 }
890 
GetLabel(FrameNode * frameNode)891 std::string ButtonModelNG::GetLabel(FrameNode* frameNode)
892 {
893     std::string value;
894     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ButtonLayoutProperty, Label, value, frameNode, value);
895     return value;
896 }
897 
GetFontSize(FrameNode * frameNode)898 Dimension ButtonModelNG::GetFontSize(FrameNode* frameNode)
899 {
900     Dimension value;
901     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ButtonLayoutProperty, FontSize, value, frameNode, value);
902     return value;
903 }
904 
GetFontWeight(FrameNode * frameNode)905 Ace::FontWeight ButtonModelNG::GetFontWeight(FrameNode* frameNode)
906 {
907     Ace::FontWeight value = Ace::FontWeight::NORMAL;
908     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
909         ButtonLayoutProperty, FontWeight, value, frameNode, Ace::FontWeight::NORMAL);
910     return value;
911 }
912 
GetFontColor(FrameNode * frameNode)913 Color ButtonModelNG::GetFontColor(FrameNode* frameNode)
914 {
915     Color value;
916     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ButtonLayoutProperty, FontColor, value, frameNode, value);
917     return value;
918 }
919 
GetAutoDisable(FrameNode * frameNode)920 bool ButtonModelNG::GetAutoDisable(FrameNode* frameNode)
921 {
922     bool value = false;
923     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ButtonLayoutProperty, AutoDisable, value, frameNode, false);
924     return value;
925 }
926 
SetBuilderFunc(FrameNode * frameNode,NG::ButtonMakeCallback && makeFunc)927 void ButtonModelNG::SetBuilderFunc(FrameNode* frameNode, NG::ButtonMakeCallback&& makeFunc)
928 {
929     CHECK_NULL_VOID(frameNode);
930     auto pattern = frameNode->GetPattern<ButtonPattern>();
931     CHECK_NULL_VOID(pattern);
932     pattern->SetBuilderFunc(std::move(makeFunc));
933 }
934 
TriggerClick(FrameNode * frameNode,double xPos,double yPos)935 void ButtonModelNG::TriggerClick(FrameNode* frameNode, double xPos, double yPos)
936 {
937     auto pattern = frameNode->GetPattern<ButtonPattern>();
938     CHECK_NULL_VOID(pattern);
939     auto host = pattern->GetHost();
940     CHECK_NULL_VOID(host);
941     auto gestureEventHub = host->GetOrCreateGestureEventHub();
942     if (!gestureEventHub->IsClickable()) {
943         return;
944     }
945     pattern->SetButtonPress(xPos, yPos);
946 }
947 
ResetBorderRadius()948 void ButtonModelNG::ResetBorderRadius()
949 {
950     ACE_RESET_LAYOUT_PROPERTY_WITH_FLAG(ButtonLayoutProperty, BorderRadius, PROPERTY_UPDATE_MEASURE);
951 }
952 
GetType(FrameNode * frameNode)953 ButtonType ButtonModelNG::GetType(FrameNode* frameNode)
954 {
955     ButtonType value = ButtonType::CAPSULE;
956     if (frameNode->GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_EIGHTEEN)) {
957         value = ButtonType::ROUNDED_RECTANGLE;
958         ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ButtonLayoutProperty, Type, value,
959                                                         frameNode, ButtonType::ROUNDED_RECTANGLE);
960     } else {
961         ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ButtonLayoutProperty, Type, value,
962                                                         frameNode, ButtonType::CAPSULE);
963     }
964 
965     return value;
966 }
967 
ApplyTheme(FrameNode * frameNode,ButtonStyleMode buttonStyle,ButtonRole buttonRole)968 void ButtonModelNG::ApplyTheme(FrameNode* frameNode, ButtonStyleMode buttonStyle, ButtonRole buttonRole)
969 {
970     auto context = PipelineBase::GetCurrentContextSafely();
971     CHECK_NULL_VOID(context);
972     auto buttonTheme = context->GetTheme<ButtonTheme>();
973     CHECK_NULL_VOID(buttonTheme);
974     auto bgColor = buttonTheme->GetBgColor(buttonStyle, buttonRole);
975     auto textColor = buttonTheme->GetTextColor(buttonStyle, buttonRole);
976     BackgroundColor(frameNode, bgColor, true);
977     auto property = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
978     CHECK_NULL_VOID(property);
979     if (!property->GetCreateWithLabelValue(false)) {
980         return;
981     }
982     SetFontColor(frameNode, textColor);
983 }
984 
SetLabelWithCheck(FrameNode * frameNode,const char * label)985 void ButtonModelNG::SetLabelWithCheck(FrameNode* frameNode, const char* label)
986 {
987     auto property = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
988     CHECK_NULL_VOID(property);
989     if (!property->GetCreateWithLabelValue(false)) {
990         return;
991     }
992     SetLabel(frameNode, label);
993 }
994 
SetCreateWithLabel(bool createWithLabel)995 void ButtonModelNG::SetCreateWithLabel(bool createWithLabel)
996 {
997     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, CreateWithLabel, createWithLabel);
998 }
999 
SetMinFontScale(float minFontScale)1000 void ButtonModelNG::SetMinFontScale(float minFontScale)
1001 {
1002     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, MinFontScale, minFontScale);
1003 }
1004 
SetMaxFontScale(float maxFontScale)1005 void ButtonModelNG::SetMaxFontScale(float maxFontScale)
1006 {
1007     ACE_UPDATE_LAYOUT_PROPERTY(ButtonLayoutProperty, MaxFontScale, maxFontScale);
1008 }
1009 
SetCreateWithLabel(FrameNode * frameNode,bool createWithLabel)1010 void ButtonModelNG::SetCreateWithLabel(FrameNode* frameNode, bool createWithLabel)
1011 {
1012     auto property = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
1013     CHECK_NULL_VOID(property);
1014     if (property->HasCreateWithLabel()) {
1015         return;
1016     }
1017     property->UpdateCreateWithLabel(createWithLabel);
1018 }
1019 
SetMinFontScale(FrameNode * frameNode,float minFontScale)1020 void ButtonModelNG::SetMinFontScale(FrameNode* frameNode, float minFontScale)
1021 {
1022     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, MinFontScale, minFontScale, frameNode);
1023 }
1024 
SetMaxFontScale(FrameNode * frameNode,float maxFontScale)1025 void ButtonModelNG::SetMaxFontScale(FrameNode* frameNode, float maxFontScale)
1026 {
1027     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ButtonLayoutProperty, MaxFontScale, maxFontScale, frameNode);
1028 }
1029 
GetMinFontScale(FrameNode * frameNode)1030 float ButtonModelNG::GetMinFontScale(FrameNode* frameNode)
1031 {
1032     CHECK_NULL_RETURN(frameNode, 0.0f);
1033     float minFontScale = 0.0f;
1034     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ButtonLayoutProperty, MinFontScale, minFontScale, frameNode, 0.0f);
1035     return minFontScale;
1036 }
1037 
GetMaxFontScale(FrameNode * frameNode)1038 float ButtonModelNG::GetMaxFontScale(FrameNode* frameNode)
1039 {
1040     CHECK_NULL_RETURN(frameNode, 0.0f);
1041     float maxFontScale = 0.0f;
1042     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(ButtonLayoutProperty, MaxFontScale, maxFontScale, frameNode,
1043         static_cast<float>(INT32_MAX));
1044     return maxFontScale;
1045 }
1046 } // namespace OHOS::Ace::NG
1047