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