1 /*
2  * Copyright (c) 2021-2022 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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_BUTTON_BUTTON_DECLARATION_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_BUTTON_BUTTON_DECLARATION_H
18 
19 #include "frameworks/core/components/declaration/button/button_progress_controller.h"
20 #include "frameworks/core/components/declaration/common/declaration.h"
21 #include "frameworks/bridge/common/dom/dom_type.h"
22 
23 namespace OHOS::Ace {
24 
25 struct ButtonAttribute : Attribute {
26     std::string buttonType;
27     std::string iconSrc;
28     std::string placement;
29     std::string textData;
30     bool isAutoFocus = false;
31     bool isDisabled = false;
32     bool isWaiting = false;
33 };
34 
35 struct ButtonStyle : Style {
36     TextStyle textStyle;
37     BorderEdge borderEdge;
38     Edge padding;
39     Dimension diameter;
40     Dimension minWidth;
41     Dimension width = -1.0_vp;
42     Dimension height = -1.0_vp;
43     Dimension radius;
44     Dimension iconWidth;
45     Dimension iconHeight;
46     Dimension innerLeftPadding;
47     Color focusColor;
48     Color focusBorderColor;
49     Color backgroundColor;
50     Color clickedColor;
51     Color disabledColor;
52     Color disabledTextColor;
53     Color focusAnimationColor;
54     Color hoverColor;
55     Color progressColor;
56     Color progressFocusColor;
57     Color textFocusColor;
58     bool bgColorDefined = false;
59     bool matchTextDirection = false;
60     bool heightDefined = false;
61     bool fontSizeDefined = false;
62     bool textColorDefined = false;
63     bool radiusDefined = false;
64     double blendOpacity = 0.0;
65 };
66 
67 struct ButtonEvent : Event {
68     EventMarker clickEventId;
69 };
70 
71 struct ButtonMethod : Method {
SetProgressButtonMethod72     void SetProgress(const RefPtr<ButtonProgressController>& controller, uint32_t progress) const
73     {
74         controller->SetProgress(progress);
75     }
76 };
77 
78 class ButtonDeclaration : public Declaration {
79     DECLARE_ACE_TYPE(ButtonDeclaration, Declaration);
80 
81 public:
82     ButtonDeclaration() = default;
83     ~ButtonDeclaration() override = default;
84 
85     void InitializeStyle() override;
86 
GetType()87     const std::string& GetType() const
88     {
89         auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
90         return attr.buttonType;
91     }
92 
GetIconSrc()93     const std::string& GetIconSrc() const
94     {
95         auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
96         return attr.iconSrc;
97     }
98 
GetPlacement()99     const std::string& GetPlacement() const
100     {
101         auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
102         return attr.placement;
103     }
104 
GetTextData()105     const std::string& GetTextData() const
106     {
107         auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
108         return attr.textData;
109     }
110 
GetAutoFocusState()111     bool GetAutoFocusState() const
112     {
113         auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
114         return attr.isAutoFocus;
115     }
116 
GetDisabledState()117     bool GetDisabledState() const
118     {
119         auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
120         return attr.isDisabled;
121     }
122 
GetWaitingState()123     bool GetWaitingState() const
124     {
125         auto& attr = static_cast<ButtonAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
126         return attr.isWaiting;
127     }
128 
GetPadding()129     const Edge& GetPadding() const
130     {
131         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
132         return style.padding;
133     }
134 
GetTextStyle()135     const TextStyle& GetTextStyle() const
136     {
137         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
138         return style.textStyle;
139     }
140 
GetWidth()141     const Dimension& GetWidth() const
142     {
143         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
144         return style.width;
145     }
146 
GetHeight()147     const Dimension& GetHeight() const
148     {
149         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
150         return style.height;
151     }
152 
GetMinWidth()153     const Dimension& GetMinWidth() const
154     {
155         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
156         return style.minWidth;
157     }
158 
GetRectRadius()159     const Dimension& GetRectRadius() const
160     {
161         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
162         return style.radius;
163     }
164 
GetProgressDiameter()165     const Dimension& GetProgressDiameter() const
166     {
167         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
168         return style.diameter;
169     }
170 
GetInnerPadding()171     const Dimension& GetInnerPadding() const
172     {
173         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
174         return style.innerLeftPadding;
175     }
176 
GetIconHeight()177     const Dimension& GetIconHeight() const
178     {
179         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
180         return style.iconHeight;
181     }
182 
GetIconWidth()183     const Dimension& GetIconWidth() const
184     {
185         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
186         return style.iconWidth;
187     }
188 
GetBackgroundColor()189     const Color& GetBackgroundColor() const
190     {
191         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
192         return style.backgroundColor;
193     }
194 
GetClickedColor()195     const Color& GetClickedColor() const
196     {
197         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
198         return style.clickedColor;
199     }
200 
GetDisabledColor()201     const Color& GetDisabledColor() const
202     {
203         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
204         return style.disabledColor;
205     }
206 
GetDisabledTextColor()207     const Color& GetDisabledTextColor() const
208     {
209         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
210         return style.disabledTextColor;
211     }
212 
GetFocusColor()213     const Color& GetFocusColor() const
214     {
215         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
216         return style.focusColor;
217     }
218 
GetFocusBorderColor()219     const Color& GetFocusBorderColor() const
220     {
221         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
222         return style.focusBorderColor;
223     }
224 
GetHoverColor()225     const Color& GetHoverColor() const
226     {
227         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
228         return style.hoverColor;
229     }
230 
GetProgressColor()231     const Color& GetProgressColor() const
232     {
233         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
234         return style.progressColor;
235     }
236 
GetProgressFocusColor()237     const Color& GetProgressFocusColor() const
238     {
239         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
240         return style.progressFocusColor;
241     }
242 
GetFocusAnimationColor()243     const Color& GetFocusAnimationColor() const
244     {
245         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
246         return style.focusAnimationColor;
247     }
248 
GetFocusTextColor()249     const Color& GetFocusTextColor() const
250     {
251         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
252         return style.textFocusColor;
253     }
254 
GetBorderEdge()255     const BorderEdge& GetBorderEdge() const
256     {
257         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
258         return style.borderEdge;
259     }
260 
GetMatchTextDirection()261     bool GetMatchTextDirection() const
262     {
263         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
264         return style.matchTextDirection;
265     }
266 
GetBgColorState()267     bool GetBgColorState() const
268     {
269         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
270         return style.bgColorDefined;
271     }
272 
GetTextColorState()273     bool GetTextColorState() const
274     {
275         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
276         return style.textColorDefined;
277     }
278 
GetFontSizeState()279     bool GetFontSizeState() const
280     {
281         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
282         return style.fontSizeDefined;
283     }
284 
GetHeightState()285     bool GetHeightState() const
286     {
287         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
288         return style.heightDefined;
289     }
290 
GetRadiusState()291     bool GetRadiusState() const
292     {
293         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
294         return style.radiusDefined;
295     }
296 
GetBlendOpacity()297     double GetBlendOpacity() const
298     {
299         auto& style = static_cast<ButtonStyle&>(GetStyle(StyleTag::SPECIALIZED_STYLE));
300         return style.blendOpacity;
301     }
302 
GetClickedEventId()303     const EventMarker& GetClickedEventId() const
304     {
305         auto& event = static_cast<ButtonEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
306         return event.clickEventId;
307     }
308 
GetRemoteMessageEventId()309     const EventMarker& GetRemoteMessageEventId() const
310     {
311         auto& event = static_cast<ButtonEvent&>(GetEvent(EventTag::SPECIALIZED_REMOTE_MESSAGE_EVENT));
312         return event.clickEventId;
313     }
314 
GetButtonController()315     const RefPtr<ButtonProgressController> GetButtonController() const
316     {
317         return buttonController_;
318     }
319 
SetType(const std::string & type)320     void SetType(const std::string& type)
321     {
322         auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR);
323         attribute.buttonType = type;
324     }
325 
SetIconSrc(const std::string & src)326     void SetIconSrc(const std::string& src)
327     {
328         auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR);
329         attribute.iconSrc = src;
330     }
331 
SetPlacement(const std::string & placement)332     void SetPlacement(const std::string& placement)
333     {
334         auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR);
335         attribute.placement = placement;
336     }
337 
SetTextData(const std::string & data)338     void SetTextData(const std::string& data)
339     {
340         auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR);
341         attribute.textData = data;
342     }
343 
SetAutoFocusState(bool state)344     void SetAutoFocusState(bool state)
345     {
346         auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR);
347         attribute.isAutoFocus = state;
348     }
349 
SetDisabledState(bool state)350     void SetDisabledState(bool state)
351     {
352         auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR);
353         attribute.isDisabled = state;
354     }
355 
SetWaitingState(bool state)356     void SetWaitingState(bool state)
357     {
358         auto& attribute = MaybeResetAttribute<ButtonAttribute>(AttributeTag::SPECIALIZED_ATTR);
359         attribute.isWaiting = state;
360     }
361 
SetPadding(const Edge & edge)362     void SetPadding(const Edge& edge)
363     {
364         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
365         style.padding = edge;
366     }
367 
SetTextStyle(const TextStyle & textStyle)368     void SetTextStyle(const TextStyle& textStyle)
369     {
370         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
371         style.textStyle = textStyle;
372     }
373 
SetMinWidth(const Dimension & width)374     void SetMinWidth(const Dimension& width)
375     {
376         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
377         style.minWidth = width;
378     }
379 
SetWidth(const Dimension & width)380     void SetWidth(const Dimension& width)
381     {
382         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
383         style.width = width;
384     }
385 
SetHeight(const Dimension & height)386     void SetHeight(const Dimension& height)
387     {
388         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
389         style.height = height;
390     }
391 
SetRectRadius(const Dimension & radius)392     void SetRectRadius(const Dimension& radius)
393     {
394         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
395         style.radius = radius;
396     }
397 
SetProgressDiameter(const Dimension & diameter)398     void SetProgressDiameter(const Dimension& diameter)
399     {
400         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
401         style.diameter = diameter;
402     }
403 
SetInnerPadding(const Dimension & padding)404     void SetInnerPadding(const Dimension& padding)
405     {
406         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
407         style.innerLeftPadding = padding;
408     }
409 
SetIconHeight(const Dimension & height)410     void SetIconHeight(const Dimension& height)
411     {
412         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
413         style.iconHeight = height;
414     }
415 
SetIconWidth(const Dimension & width)416     void SetIconWidth(const Dimension& width)
417     {
418         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
419         style.iconWidth = width;
420     }
421 
SetBackgroundColor(const Color & color)422     void SetBackgroundColor(const Color& color)
423     {
424         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
425         style.backgroundColor = color;
426     }
427 
SetClickedColor(const Color & color)428     void SetClickedColor(const Color& color)
429     {
430         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
431         style.clickedColor = color;
432     }
433 
SetDisabledColor(const Color & color)434     void SetDisabledColor(const Color& color)
435     {
436         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
437         style.disabledColor = color;
438     }
439 
SetDisabledTextColor(const Color & color)440     void SetDisabledTextColor(const Color& color)
441     {
442         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
443         style.disabledTextColor = color;
444     }
445 
SetFocusColor(const Color & color)446     void SetFocusColor(const Color& color)
447     {
448         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
449         style.focusColor = color;
450     }
451 
SetFocusBorderColor(const Color & color)452     void SetFocusBorderColor(const Color& color)
453     {
454         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
455         style.focusBorderColor = color;
456     }
457 
SetHoverColor(const Color & color)458     void SetHoverColor(const Color& color)
459     {
460         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
461         style.hoverColor = color;
462     }
463 
SetProgressColor(const Color & color)464     void SetProgressColor(const Color& color)
465     {
466         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
467         style.progressColor = color;
468     }
469 
SetProgressFocusColor(const Color & color)470     void SetProgressFocusColor(const Color& color)
471     {
472         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
473         style.progressFocusColor = color;
474     }
475 
SetFocusAnimationColor(const Color & color)476     void SetFocusAnimationColor(const Color& color)
477     {
478         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
479         style.focusAnimationColor = color;
480     }
481 
SetFocusTextColor(const Color & color)482     void SetFocusTextColor(const Color& color)
483     {
484         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
485         style.textFocusColor = color;
486     }
487 
SetBorderEdge(const BorderEdge & borderEdge)488     void SetBorderEdge(const BorderEdge& borderEdge)
489     {
490         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
491         style.borderEdge = borderEdge;
492     }
493 
SetMatchTextDirection(bool match)494     void SetMatchTextDirection(bool match)
495     {
496         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
497         style.matchTextDirection = match;
498     }
499 
SetBgColorState(bool state)500     void SetBgColorState(bool state)
501     {
502         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
503         style.bgColorDefined = state;
504     }
505 
SetTextColorState(bool state)506     void SetTextColorState(bool state)
507     {
508         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
509         style.textColorDefined = state;
510     }
511 
SetFontSizeState(bool state)512     void SetFontSizeState(bool state)
513     {
514         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
515         style.fontSizeDefined = state;
516     }
517 
SetHeightState(bool state)518     void SetHeightState(bool state)
519     {
520         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
521         style.heightDefined = state;
522     }
523 
SetRadiusState(bool state)524     void SetRadiusState(bool state)
525     {
526         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
527         style.radiusDefined = state;
528     }
529 
SetBlendOpacity(double opacity)530     void SetBlendOpacity(double opacity)
531     {
532         auto& style = MaybeResetStyle<ButtonStyle>(StyleTag::SPECIALIZED_STYLE);
533         style.blendOpacity = opacity;
534     }
535 
SetClickedEventId(const EventMarker & eventId)536     void SetClickedEventId(const EventMarker& eventId)
537     {
538         auto& event = MaybeResetEvent<ButtonEvent>(EventTag::SPECIALIZED_EVENT);
539         event.clickEventId = eventId;
540     }
541 
SetRemoteMessageEventId(const EventMarker & eventId)542     void SetRemoteMessageEventId(const EventMarker& eventId)
543     {
544         auto& event = MaybeResetEvent<ButtonEvent>(EventTag::SPECIALIZED_REMOTE_MESSAGE_EVENT);
545         event.clickEventId = eventId;
546     }
547 
SetClickedFunction(std::function<void ()> && callback)548     void SetClickedFunction(std::function<void()>&& callback)
549     {
550         auto& event = MaybeResetEvent<ButtonEvent>(EventTag::SPECIALIZED_EVENT);
551         event.clickEventId.SetPreFunction(std::move(callback));
552     }
553 
SetButtonController(const RefPtr<ButtonProgressController> & controller)554     void SetButtonController(const RefPtr<ButtonProgressController>& controller)
555     {
556         buttonController_ = controller;
557     }
558 
559 protected:
560     void InitSpecialized() override;
561     bool SetSpecializedAttr(const std::pair<std::string, std::string>& attr) override;
562     bool SetSpecializedStyle(const std::pair<std::string, std::string>& style) override;
563     bool SetSpecializedEvent(int32_t pageId, const std::string& eventId, const std::string& event) override;
564     void CallSpecializedMethod(const std::string& method, const std::string& args) override;
565 
566 private:
567     RefPtr<ButtonProgressController> buttonController_;
568 };
569 
570 } // namespace OHOS::Ace
571 
572 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_BUTTON_BUTTON_DECLARATION_H
573