• 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/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