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