1a3e0fd82Sopenharmony_ci/*
2a3e0fd82Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3a3e0fd82Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4a3e0fd82Sopenharmony_ci * you may not use this file except in compliance with the License.
5a3e0fd82Sopenharmony_ci * You may obtain a copy of the License at
6a3e0fd82Sopenharmony_ci *
7a3e0fd82Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8a3e0fd82Sopenharmony_ci *
9a3e0fd82Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10a3e0fd82Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11a3e0fd82Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12a3e0fd82Sopenharmony_ci * See the License for the specific language governing permissions and
13a3e0fd82Sopenharmony_ci * limitations under the License.
14a3e0fd82Sopenharmony_ci */
15a3e0fd82Sopenharmony_ci
16a3e0fd82Sopenharmony_ci/**
17a3e0fd82Sopenharmony_ci * @addtogroup UI_Components
18a3e0fd82Sopenharmony_ci * @{
19a3e0fd82Sopenharmony_ci *
20a3e0fd82Sopenharmony_ci * @brief Defines UI components such as buttons, texts, images, lists, and progress bars.
21a3e0fd82Sopenharmony_ci *
22a3e0fd82Sopenharmony_ci * @since 1.0
23a3e0fd82Sopenharmony_ci * @version 1.0
24a3e0fd82Sopenharmony_ci */
25a3e0fd82Sopenharmony_ci
26a3e0fd82Sopenharmony_ci/**
27a3e0fd82Sopenharmony_ci * @file ui_button.h
28a3e0fd82Sopenharmony_ci *
29a3e0fd82Sopenharmony_ci * @brief Defines the attributes and common functions of a button.
30a3e0fd82Sopenharmony_ci *
31a3e0fd82Sopenharmony_ci * @since 1.0
32a3e0fd82Sopenharmony_ci * @version 1.0
33a3e0fd82Sopenharmony_ci */
34a3e0fd82Sopenharmony_ci
35a3e0fd82Sopenharmony_ci#ifndef GRAPHIC_LITE_UI_BUTTON_H
36a3e0fd82Sopenharmony_ci#define GRAPHIC_LITE_UI_BUTTON_H
37a3e0fd82Sopenharmony_ci
38a3e0fd82Sopenharmony_ci#include "animator/animator.h"
39a3e0fd82Sopenharmony_ci#include "common/image.h"
40a3e0fd82Sopenharmony_ci#include "components/ui_view.h"
41a3e0fd82Sopenharmony_ci
42a3e0fd82Sopenharmony_cinamespace OHOS {
43a3e0fd82Sopenharmony_ci/**
44a3e0fd82Sopenharmony_ci * @brief Represents a button.
45a3e0fd82Sopenharmony_ci *
46a3e0fd82Sopenharmony_ci * This component responds to the press and release events.
47a3e0fd82Sopenharmony_ci *
48a3e0fd82Sopenharmony_ci * @since 1.0
49a3e0fd82Sopenharmony_ci * @version 1.0
50a3e0fd82Sopenharmony_ci */
51a3e0fd82Sopenharmony_ciclass UIButton : public UIView {
52a3e0fd82Sopenharmony_cipublic:
53a3e0fd82Sopenharmony_ci    /**
54a3e0fd82Sopenharmony_ci     * @brief A constructor used to create a <b>UIButton</b> instance.
55a3e0fd82Sopenharmony_ci     *
56a3e0fd82Sopenharmony_ci     * @since 1.0
57a3e0fd82Sopenharmony_ci     * @version 1.0
58a3e0fd82Sopenharmony_ci     */
59a3e0fd82Sopenharmony_ci    UIButton();
60a3e0fd82Sopenharmony_ci
61a3e0fd82Sopenharmony_ci    /**
62a3e0fd82Sopenharmony_ci     * @brief A constructor used to create a <b>UIButton</b> instance based on the button ID.
63a3e0fd82Sopenharmony_ci     *
64a3e0fd82Sopenharmony_ci     * Buttons sharing the same ID are in the same batch.
65a3e0fd82Sopenharmony_ci     *
66a3e0fd82Sopenharmony_ci     * @param id Indicates the button ID.
67a3e0fd82Sopenharmony_ci     * @since 1.0
68a3e0fd82Sopenharmony_ci     * @version 1.0
69a3e0fd82Sopenharmony_ci     */
70a3e0fd82Sopenharmony_ci    explicit UIButton(const char* id) : UIButton()
71a3e0fd82Sopenharmony_ci    {
72a3e0fd82Sopenharmony_ci        id_ = id;
73a3e0fd82Sopenharmony_ci    }
74a3e0fd82Sopenharmony_ci
75a3e0fd82Sopenharmony_ci    /**
76a3e0fd82Sopenharmony_ci     * @brief A destructor used to delete the <b>UIButton</b> instance.
77a3e0fd82Sopenharmony_ci     *
78a3e0fd82Sopenharmony_ci     * @since 1.0
79a3e0fd82Sopenharmony_ci     * @version 1.0
80a3e0fd82Sopenharmony_ci     */
81a3e0fd82Sopenharmony_ci    virtual ~UIButton();
82a3e0fd82Sopenharmony_ci
83a3e0fd82Sopenharmony_ci    /**
84a3e0fd82Sopenharmony_ci     * @brief Obtains the component type.
85a3e0fd82Sopenharmony_ci     *
86a3e0fd82Sopenharmony_ci     * @return Returns the component type, as defined in {@link UIViewType}.
87a3e0fd82Sopenharmony_ci     * @since 1.0
88a3e0fd82Sopenharmony_ci     * @version 1.0
89a3e0fd82Sopenharmony_ci     */
90a3e0fd82Sopenharmony_ci    UIViewType GetViewType() const override
91a3e0fd82Sopenharmony_ci    {
92a3e0fd82Sopenharmony_ci        return UI_BUTTON;
93a3e0fd82Sopenharmony_ci    }
94a3e0fd82Sopenharmony_ci
95a3e0fd82Sopenharmony_ci    /**
96a3e0fd82Sopenharmony_ci     * @fn virtual bool UIButton::OnPreDraw(Rect& invalidatedArea) override
97a3e0fd82Sopenharmony_ci     *
98a3e0fd82Sopenharmony_ci     * @brief Do something before draw, this function will be invoked mainly to check if this view need
99a3e0fd82Sopenharmony_ci     *        to cover invalidate area so render manager can decide which layer to draw firstly.
100a3e0fd82Sopenharmony_ci     * @param [in] invalidate area.
101a3e0fd82Sopenharmony_ci     * @returns True if need cover.
102a3e0fd82Sopenharmony_ci     */
103a3e0fd82Sopenharmony_ci    bool OnPreDraw(Rect& invalidatedArea) const override;
104a3e0fd82Sopenharmony_ci
105a3e0fd82Sopenharmony_ci#if DEFAULT_ANIMATION
106a3e0fd82Sopenharmony_ci    /**
107a3e0fd82Sopenharmony_ci     * @fn virtual bool UIButton::OnPostDraw(BufferInfo& gfxDstBuffer, Rect& invalidatedArea) override
108a3e0fd82Sopenharmony_ci     *
109a3e0fd82Sopenharmony_ci     * @brief Do something after draw.
110a3e0fd82Sopenharmony_ci     * @param [in] invalidate area.
111a3e0fd82Sopenharmony_ci     */
112a3e0fd82Sopenharmony_ci    void OnPostDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;
113a3e0fd82Sopenharmony_ci#endif
114a3e0fd82Sopenharmony_ci    /**
115a3e0fd82Sopenharmony_ci     * @fn  virtual void UIButton::OnDraw(const Rect& invalidatedArea) override;
116a3e0fd82Sopenharmony_ci     *
117a3e0fd82Sopenharmony_ci     * @brief   Executes the draw action
118a3e0fd82Sopenharmony_ci     *
119a3e0fd82Sopenharmony_ci     * @param   [in] invalidatedArea The rectangle to draw, with coordinates relative to this drawable..
120a3e0fd82Sopenharmony_ci     */
121a3e0fd82Sopenharmony_ci    void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;
122a3e0fd82Sopenharmony_ci
123a3e0fd82Sopenharmony_ci    /**
124a3e0fd82Sopenharmony_ci     * @fn  virtual void UIButton::OnPressEvent(const PressEvent& event) override;
125a3e0fd82Sopenharmony_ci     *
126a3e0fd82Sopenharmony_ci     * @brief   Executes the press event action
127a3e0fd82Sopenharmony_ci     *
128a3e0fd82Sopenharmony_ci     * @param   [in] event   The press event, contain press position.
129a3e0fd82Sopenharmony_ci     *
130a3e0fd82Sopenharmony_ci     * @return Returns <b>true</b> if the event is consumed; returns <b>false</b> otherwise.
131a3e0fd82Sopenharmony_ci     */
132a3e0fd82Sopenharmony_ci    bool OnPressEvent(const PressEvent& event) override;
133a3e0fd82Sopenharmony_ci
134a3e0fd82Sopenharmony_ci    /**
135a3e0fd82Sopenharmony_ci     * @fn  virtual void UIButton::OnReleaseEvent(const ReleaseEvent& event) override;
136a3e0fd82Sopenharmony_ci     *
137a3e0fd82Sopenharmony_ci     * @brief   Executes the press release event action
138a3e0fd82Sopenharmony_ci     *
139a3e0fd82Sopenharmony_ci     * @param   [in] event   The press release event.
140a3e0fd82Sopenharmony_ci     */
141a3e0fd82Sopenharmony_ci    bool OnReleaseEvent(const ReleaseEvent& event) override;
142a3e0fd82Sopenharmony_ci
143a3e0fd82Sopenharmony_ci    /**
144a3e0fd82Sopenharmony_ci     * @fn  virtual void UIButton::OnCancelEvent(const CancelEvent& event) override;
145a3e0fd82Sopenharmony_ci     *
146a3e0fd82Sopenharmony_ci     * @brief   Executes the cancel event action
147a3e0fd82Sopenharmony_ci     *
148a3e0fd82Sopenharmony_ci     * @param   [in] event   The cancel event.
149a3e0fd82Sopenharmony_ci     */
150a3e0fd82Sopenharmony_ci    bool OnCancelEvent(const CancelEvent& event) override;
151a3e0fd82Sopenharmony_ci
152a3e0fd82Sopenharmony_ci    /**
153a3e0fd82Sopenharmony_ci     * @brief Enumerates the images for different button states.
154a3e0fd82Sopenharmony_ci     *
155a3e0fd82Sopenharmony_ci     * You can define a different image for each button state.
156a3e0fd82Sopenharmony_ci     *
157a3e0fd82Sopenharmony_ci     * @since 1.0
158a3e0fd82Sopenharmony_ci     * @version 1.0
159a3e0fd82Sopenharmony_ci     */
160a3e0fd82Sopenharmony_ci    enum ButtonImageSrc : uint8_t {
161a3e0fd82Sopenharmony_ci        /* An enum constant representing the Button image default option */
162a3e0fd82Sopenharmony_ci        BTN_IMAGE_DEFAULT,
163a3e0fd82Sopenharmony_ci        /* An enum constant representing the Button image triggered option */
164a3e0fd82Sopenharmony_ci        BTN_IMAGE_TRIGGERED,
165a3e0fd82Sopenharmony_ci        /* An enum constant representing the Button Image Number option */
166a3e0fd82Sopenharmony_ci        BTN_IMG_NUM,
167a3e0fd82Sopenharmony_ci    };
168a3e0fd82Sopenharmony_ci
169a3e0fd82Sopenharmony_ci    /**
170a3e0fd82Sopenharmony_ci     * @brief Sets the image for this button.
171a3e0fd82Sopenharmony_ci     *
172a3e0fd82Sopenharmony_ci     * @param defaultImgSrc Indicates the default image.
173a3e0fd82Sopenharmony_ci     * @param triggeredImgSrc Indicates the image for a button when it is triggered.
174a3e0fd82Sopenharmony_ci     * @since 1.0
175a3e0fd82Sopenharmony_ci     * @version 1.0
176a3e0fd82Sopenharmony_ci     */
177a3e0fd82Sopenharmony_ci    void SetImageSrc(const char* defaultImgSrc, const char* triggeredImgSrc);
178a3e0fd82Sopenharmony_ci
179a3e0fd82Sopenharmony_ci    /**
180a3e0fd82Sopenharmony_ci     * @brief Sets the image for this button.
181a3e0fd82Sopenharmony_ci     *
182a3e0fd82Sopenharmony_ci     * @param defaultImgSrc Indicates the default image.
183a3e0fd82Sopenharmony_ci     * @param triggeredImgSrc Indicates the image for a button when it is triggered.
184a3e0fd82Sopenharmony_ci     * @since 1.0
185a3e0fd82Sopenharmony_ci     * @version 1.0
186a3e0fd82Sopenharmony_ci     */
187a3e0fd82Sopenharmony_ci    void SetImageSrc(const ImageInfo* defaultImgSrc, const ImageInfo* triggeredImgSrc);
188a3e0fd82Sopenharmony_ci
189a3e0fd82Sopenharmony_ci    /**
190a3e0fd82Sopenharmony_ci     * @brief Sets the position for this image.
191a3e0fd82Sopenharmony_ci     *
192a3e0fd82Sopenharmony_ci     * @param x Indicates the x-coordinate to set.
193a3e0fd82Sopenharmony_ci     * @param y Indicates the y-coordinate to set.
194a3e0fd82Sopenharmony_ci     * @since 1.0
195a3e0fd82Sopenharmony_ci     * @version 1.0
196a3e0fd82Sopenharmony_ci     */
197a3e0fd82Sopenharmony_ci    void SetImagePosition(const int16_t x, const int16_t y)
198a3e0fd82Sopenharmony_ci    {
199a3e0fd82Sopenharmony_ci        imgX_ = x;
200a3e0fd82Sopenharmony_ci        imgY_ = y;
201a3e0fd82Sopenharmony_ci    }
202a3e0fd82Sopenharmony_ci
203a3e0fd82Sopenharmony_ci    /**
204a3e0fd82Sopenharmony_ci     * @brief Obtains the x-coordinate of this image.
205a3e0fd82Sopenharmony_ci     *
206a3e0fd82Sopenharmony_ci     * @return Returns the x-coordinate of this image.
207a3e0fd82Sopenharmony_ci     * @since 1.0
208a3e0fd82Sopenharmony_ci     * @version 1.0
209a3e0fd82Sopenharmony_ci     */
210a3e0fd82Sopenharmony_ci    int16_t GetImageX() const
211a3e0fd82Sopenharmony_ci    {
212a3e0fd82Sopenharmony_ci        return imgX_;
213a3e0fd82Sopenharmony_ci    }
214a3e0fd82Sopenharmony_ci
215a3e0fd82Sopenharmony_ci    /**
216a3e0fd82Sopenharmony_ci     * @brief Obtains the y-coordinate of this image.
217a3e0fd82Sopenharmony_ci     *
218a3e0fd82Sopenharmony_ci     * @return Returns the y-coordinate of this image.
219a3e0fd82Sopenharmony_ci     * @since 1.0
220a3e0fd82Sopenharmony_ci     * @version 1.0
221a3e0fd82Sopenharmony_ci     */
222a3e0fd82Sopenharmony_ci    int16_t GetImageY() const
223a3e0fd82Sopenharmony_ci    {
224a3e0fd82Sopenharmony_ci        return imgY_;
225a3e0fd82Sopenharmony_ci    }
226a3e0fd82Sopenharmony_ci
227a3e0fd82Sopenharmony_ci    /**
228a3e0fd82Sopenharmony_ci     * @brief Obtains the image for the current button state.
229a3e0fd82Sopenharmony_ci     *
230a3e0fd82Sopenharmony_ci     * @return Returns the image for the current button state.
231a3e0fd82Sopenharmony_ci     * @since 1.0
232a3e0fd82Sopenharmony_ci     * @version 1.0
233a3e0fd82Sopenharmony_ci     */
234a3e0fd82Sopenharmony_ci    const Image* GetCurImageSrc() const;
235a3e0fd82Sopenharmony_ci
236a3e0fd82Sopenharmony_ci    /**
237a3e0fd82Sopenharmony_ci     * @brief Enumerates the states of this button.
238a3e0fd82Sopenharmony_ci     *
239a3e0fd82Sopenharmony_ci     * The button has three states.
240a3e0fd82Sopenharmony_ci     *
241a3e0fd82Sopenharmony_ci     * @since 1.0
242a3e0fd82Sopenharmony_ci     * @version 1.0
243a3e0fd82Sopenharmony_ci     */
244a3e0fd82Sopenharmony_ci    enum ButtonState : uint8_t {
245a3e0fd82Sopenharmony_ci        /* An enum constant representing the Button state released option */
246a3e0fd82Sopenharmony_ci        RELEASED = 0,
247a3e0fd82Sopenharmony_ci        /* An enum constant representing the Button state pressed option */
248a3e0fd82Sopenharmony_ci        PRESSED,
249a3e0fd82Sopenharmony_ci        /* An enum constant representing the Button state inactive option */
250a3e0fd82Sopenharmony_ci        INACTIVE,
251a3e0fd82Sopenharmony_ci        /* An enum constant representing the Button state Number option */
252a3e0fd82Sopenharmony_ci        BTN_STATE_NUM,
253a3e0fd82Sopenharmony_ci    };
254a3e0fd82Sopenharmony_ci
255a3e0fd82Sopenharmony_ci    /**
256a3e0fd82Sopenharmony_ci     * @brief Obtains the width of this image.
257a3e0fd82Sopenharmony_ci     *
258a3e0fd82Sopenharmony_ci     * @return Returns the image width.
259a3e0fd82Sopenharmony_ci     * @since 1.0
260a3e0fd82Sopenharmony_ci     * @version 1.0
261a3e0fd82Sopenharmony_ci     */
262a3e0fd82Sopenharmony_ci    int16_t GetWidth() override
263a3e0fd82Sopenharmony_ci    {
264a3e0fd82Sopenharmony_ci        Style* style = buttonStyles_[state_];
265a3e0fd82Sopenharmony_ci        return GetRelativeRect().GetWidth() - (style->paddingLeft_ + style->paddingRight_) -
266a3e0fd82Sopenharmony_ci               (style->borderWidth_ * 2); /* 2: left and right border */
267a3e0fd82Sopenharmony_ci    }
268a3e0fd82Sopenharmony_ci
269a3e0fd82Sopenharmony_ci    /**
270a3e0fd82Sopenharmony_ci     * @brief Obtains the height of this button.
271a3e0fd82Sopenharmony_ci     *
272a3e0fd82Sopenharmony_ci     * @return Returns the image height.
273a3e0fd82Sopenharmony_ci     * @since 1.0
274a3e0fd82Sopenharmony_ci     * @version 1.0
275a3e0fd82Sopenharmony_ci     */
276a3e0fd82Sopenharmony_ci    int16_t GetHeight() override
277a3e0fd82Sopenharmony_ci    {
278a3e0fd82Sopenharmony_ci        Style* style = buttonStyles_[state_];
279a3e0fd82Sopenharmony_ci        return GetRelativeRect().GetHeight() - (style->paddingTop_ + style->paddingBottom_) -
280a3e0fd82Sopenharmony_ci               (style->borderWidth_ * 2); /* 2: top and bottom border */
281a3e0fd82Sopenharmony_ci    }
282a3e0fd82Sopenharmony_ci
283a3e0fd82Sopenharmony_ci    /**
284a3e0fd82Sopenharmony_ci     * @brief Sets the width for this button.
285a3e0fd82Sopenharmony_ci     *
286a3e0fd82Sopenharmony_ci     * @param width Indicates the width to set.
287a3e0fd82Sopenharmony_ci     * @since 1.0
288a3e0fd82Sopenharmony_ci     * @version 1.0
289a3e0fd82Sopenharmony_ci     */
290a3e0fd82Sopenharmony_ci    void SetWidth(int16_t width) override
291a3e0fd82Sopenharmony_ci    {
292a3e0fd82Sopenharmony_ci        contentWidth_ = width;
293a3e0fd82Sopenharmony_ci        UIView::SetWidth(width); /* 2: left and right border */
294a3e0fd82Sopenharmony_ci    }
295a3e0fd82Sopenharmony_ci
296a3e0fd82Sopenharmony_ci    /**
297a3e0fd82Sopenharmony_ci     * @brief Sets the height for this image.
298a3e0fd82Sopenharmony_ci     *
299a3e0fd82Sopenharmony_ci     * @param height Indicates the height to set.
300a3e0fd82Sopenharmony_ci     * @since 1.0
301a3e0fd82Sopenharmony_ci     * @version 1.0
302a3e0fd82Sopenharmony_ci     */
303a3e0fd82Sopenharmony_ci    void SetHeight(int16_t height) override
304a3e0fd82Sopenharmony_ci    {
305a3e0fd82Sopenharmony_ci        contentHeight_ = height;
306a3e0fd82Sopenharmony_ci        UIView::SetHeight(height); /* 2: top and bottom border */
307a3e0fd82Sopenharmony_ci    }
308a3e0fd82Sopenharmony_ci
309a3e0fd82Sopenharmony_ci    /**
310a3e0fd82Sopenharmony_ci     * @brief Obtains a rectangular area that contains coordinate information.
311a3e0fd82Sopenharmony_ci     *
312a3e0fd82Sopenharmony_ci     * @return Returns the rectangle area.
313a3e0fd82Sopenharmony_ci     * @since 1.0
314a3e0fd82Sopenharmony_ci     * @version 1.0
315a3e0fd82Sopenharmony_ci     */
316a3e0fd82Sopenharmony_ci    Rect GetContentRect() override
317a3e0fd82Sopenharmony_ci    {
318a3e0fd82Sopenharmony_ci        Rect contentRect;
319a3e0fd82Sopenharmony_ci        Style* style = buttonStyles_[state_];
320a3e0fd82Sopenharmony_ci        contentRect.SetX(GetRect().GetX() + style->paddingLeft_ + style->borderWidth_);
321a3e0fd82Sopenharmony_ci        contentRect.SetY(GetRect().GetY() + style->paddingTop_ + style->borderWidth_);
322a3e0fd82Sopenharmony_ci        contentRect.SetWidth(GetWidth());
323a3e0fd82Sopenharmony_ci        contentRect.SetHeight(GetHeight());
324a3e0fd82Sopenharmony_ci        return contentRect;
325a3e0fd82Sopenharmony_ci    }
326a3e0fd82Sopenharmony_ci
327a3e0fd82Sopenharmony_ci    Rect GetOrigContentRect() override
328a3e0fd82Sopenharmony_ci    {
329a3e0fd82Sopenharmony_ci        Rect contentRect;
330a3e0fd82Sopenharmony_ci        Style* style = buttonStyles_[state_];
331a3e0fd82Sopenharmony_ci        contentRect.SetX(GetOrigRect().GetX() + style->paddingLeft_ + style->borderWidth_);
332a3e0fd82Sopenharmony_ci        contentRect.SetY(GetOrigRect().GetY() + style->paddingTop_ + style->borderWidth_);
333a3e0fd82Sopenharmony_ci        contentRect.SetWidth(GetWidth());
334a3e0fd82Sopenharmony_ci        contentRect.SetHeight(GetHeight());
335a3e0fd82Sopenharmony_ci        return contentRect;
336a3e0fd82Sopenharmony_ci    }
337a3e0fd82Sopenharmony_ci
338a3e0fd82Sopenharmony_ci    /**
339a3e0fd82Sopenharmony_ci     * @brief Obtains the value of a style.
340a3e0fd82Sopenharmony_ci     *
341a3e0fd82Sopenharmony_ci     * @param key Indicates the key of the style.
342a3e0fd82Sopenharmony_ci     * @return Returns the value of the style.
343a3e0fd82Sopenharmony_ci     * @since 1.0
344a3e0fd82Sopenharmony_ci     * @version 1.0
345a3e0fd82Sopenharmony_ci     */
346a3e0fd82Sopenharmony_ci    int64_t GetStyle(uint8_t key) const override;
347a3e0fd82Sopenharmony_ci
348a3e0fd82Sopenharmony_ci    /**
349a3e0fd82Sopenharmony_ci     * @brief Sets the view style.
350a3e0fd82Sopenharmony_ci     * @param style Indicates the view style.
351a3e0fd82Sopenharmony_ci     * @since 1.0
352a3e0fd82Sopenharmony_ci     * @version 1.0
353a3e0fd82Sopenharmony_ci     */
354a3e0fd82Sopenharmony_ci    void SetStyle(Style& style) override
355a3e0fd82Sopenharmony_ci    {
356a3e0fd82Sopenharmony_ci        UIView::SetStyle(style);
357a3e0fd82Sopenharmony_ci    }
358a3e0fd82Sopenharmony_ci
359a3e0fd82Sopenharmony_ci    /**
360a3e0fd82Sopenharmony_ci     * @brief Sets a style.
361a3e0fd82Sopenharmony_ci     *
362a3e0fd82Sopenharmony_ci     * @param key Indicates the key of the style to set.
363a3e0fd82Sopenharmony_ci     * @param value Indicates the value matching the key.
364a3e0fd82Sopenharmony_ci     * @since 1.0
365a3e0fd82Sopenharmony_ci     * @version 1.0
366a3e0fd82Sopenharmony_ci     */
367a3e0fd82Sopenharmony_ci    void SetStyle(uint8_t key, int64_t value) override;
368a3e0fd82Sopenharmony_ci
369a3e0fd82Sopenharmony_ci    /**
370a3e0fd82Sopenharmony_ci     * @brief Obtains the style of a button in a specific state.
371a3e0fd82Sopenharmony_ci     *
372a3e0fd82Sopenharmony_ci     * @param key Indicates the key of the style.
373a3e0fd82Sopenharmony_ci     * @param state Indicates the button state, as enumerated in {@link ButtonState}.
374a3e0fd82Sopenharmony_ci     * @return Returns the style of the button in the specific state.
375a3e0fd82Sopenharmony_ci     * @since 1.0
376a3e0fd82Sopenharmony_ci     * @version 1.0
377a3e0fd82Sopenharmony_ci     */
378a3e0fd82Sopenharmony_ci    int64_t GetStyleForState(uint8_t key, ButtonState state) const;
379a3e0fd82Sopenharmony_ci
380a3e0fd82Sopenharmony_ci    /**
381a3e0fd82Sopenharmony_ci     * @brief Sets the style for a button in a specific state.
382a3e0fd82Sopenharmony_ci     *
383a3e0fd82Sopenharmony_ci     * @param key Indicates the key of the style to set.
384a3e0fd82Sopenharmony_ci     * @param value Indicates the value matching the key.
385a3e0fd82Sopenharmony_ci     * @param state Indicates the button state, as enumerated in {@link ButtonState}.
386a3e0fd82Sopenharmony_ci     * @since 1.0
387a3e0fd82Sopenharmony_ci     * @version 1.0
388a3e0fd82Sopenharmony_ci     */
389a3e0fd82Sopenharmony_ci    void SetStyleForState(uint8_t key, int64_t value, ButtonState state);
390a3e0fd82Sopenharmony_ci
391a3e0fd82Sopenharmony_ci    /**
392a3e0fd82Sopenharmony_ci     * @brief Disables this button.
393a3e0fd82Sopenharmony_ci     *
394a3e0fd82Sopenharmony_ci     * @since 1.0
395a3e0fd82Sopenharmony_ci     * @version 1.0
396a3e0fd82Sopenharmony_ci     */
397a3e0fd82Sopenharmony_ci    void Disable();
398a3e0fd82Sopenharmony_ci
399a3e0fd82Sopenharmony_ci    /**
400a3e0fd82Sopenharmony_ci     * @brief Enables this button.
401a3e0fd82Sopenharmony_ci     *
402a3e0fd82Sopenharmony_ci     * @since 1.0
403a3e0fd82Sopenharmony_ci     * @version 1.0
404a3e0fd82Sopenharmony_ci     */
405a3e0fd82Sopenharmony_ci    void Enable();
406a3e0fd82Sopenharmony_ci
407a3e0fd82Sopenharmony_ci    /**
408a3e0fd82Sopenharmony_ci     * @brief Sets the state for a button. After the setting, calling {@link SetStyle}
409a3e0fd82Sopenharmony_ci     *        will change the style of this button, but not its state.
410a3e0fd82Sopenharmony_ci     *
411a3e0fd82Sopenharmony_ci     * @param state Indicates the button state, as enumerated in {@link ButtonState}.
412a3e0fd82Sopenharmony_ci     * @since 1.0
413a3e0fd82Sopenharmony_ci     * @version 1.0
414a3e0fd82Sopenharmony_ci     */
415a3e0fd82Sopenharmony_ci    void SetStateForStyle(ButtonState state)
416a3e0fd82Sopenharmony_ci    {
417a3e0fd82Sopenharmony_ci        styleState_ = state;
418a3e0fd82Sopenharmony_ci    }
419a3e0fd82Sopenharmony_ci
420a3e0fd82Sopenharmony_ci#if DEFAULT_ANIMATION
421a3e0fd82Sopenharmony_ci    void EnableButtonAnimation(bool enable)
422a3e0fd82Sopenharmony_ci    {
423a3e0fd82Sopenharmony_ci        enableAnimation_ = enable;
424a3e0fd82Sopenharmony_ci    }
425a3e0fd82Sopenharmony_ci
426a3e0fd82Sopenharmony_ci    /**
427a3e0fd82Sopenharmony_ci     * @brief Obtains the value of a style.
428a3e0fd82Sopenharmony_ci     *
429a3e0fd82Sopenharmony_ci     * @param enableAnimation.
430a3e0fd82Sopenharmony_ci     * @return Returns enableAnimation_.
431a3e0fd82Sopenharmony_ci     */
432a3e0fd82Sopenharmony_ci    bool GetEnableButtonAnimation() const
433a3e0fd82Sopenharmony_ci    {
434a3e0fd82Sopenharmony_ci        return enableAnimation_;
435a3e0fd82Sopenharmony_ci    }
436a3e0fd82Sopenharmony_ci#endif
437a3e0fd82Sopenharmony_ci
438a3e0fd82Sopenharmony_ciprotected:
439a3e0fd82Sopenharmony_ci    Image* defaultImgSrc_;
440a3e0fd82Sopenharmony_ci    Image* triggeredImgSrc_;
441a3e0fd82Sopenharmony_ci    ButtonImageSrc currentImgSrc_;
442a3e0fd82Sopenharmony_ci    int16_t imgX_;
443a3e0fd82Sopenharmony_ci    int16_t imgY_;
444a3e0fd82Sopenharmony_ci    int16_t contentWidth_;
445a3e0fd82Sopenharmony_ci    int16_t contentHeight_;
446a3e0fd82Sopenharmony_ci    void SetState(ButtonState state);
447a3e0fd82Sopenharmony_ci    bool InitImage();
448a3e0fd82Sopenharmony_ci
449a3e0fd82Sopenharmony_ci    ButtonState state_;
450a3e0fd82Sopenharmony_ci    ButtonState styleState_;
451a3e0fd82Sopenharmony_ci    Style* buttonStyles_[BTN_STATE_NUM];
452a3e0fd82Sopenharmony_ci#if DEFAULT_ANIMATION
453a3e0fd82Sopenharmony_ci    bool enableAnimation_;
454a3e0fd82Sopenharmony_ci    friend class ButtonAnimator;
455a3e0fd82Sopenharmony_ci    class ButtonAnimator final : public AnimatorCallback {
456a3e0fd82Sopenharmony_ci    public:
457a3e0fd82Sopenharmony_ci        ButtonAnimator() = delete;
458a3e0fd82Sopenharmony_ci        ButtonAnimator(const ButtonAnimator&) = delete;
459a3e0fd82Sopenharmony_ci        ButtonAnimator& operator=(const ButtonAnimator&) = delete;
460a3e0fd82Sopenharmony_ci        ButtonAnimator(ButtonAnimator&&) = delete;
461a3e0fd82Sopenharmony_ci        ButtonAnimator& operator=(ButtonAnimator&&) = delete;
462a3e0fd82Sopenharmony_ci        ButtonAnimator(UIButton& button) : animator_(this, nullptr, 0, false), button_(button) {}
463a3e0fd82Sopenharmony_ci        ~ButtonAnimator() {}
464a3e0fd82Sopenharmony_ci
465a3e0fd82Sopenharmony_ci        void Start();
466a3e0fd82Sopenharmony_ci        void DrawMask(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea);
467a3e0fd82Sopenharmony_ci        void Callback(UIView* view) override;
468a3e0fd82Sopenharmony_ci        void OnStop(UIView& view) override;
469a3e0fd82Sopenharmony_ci
470a3e0fd82Sopenharmony_ci    private:
471a3e0fd82Sopenharmony_ci        Animator animator_;
472a3e0fd82Sopenharmony_ci        bool isReverseAnimation_ = false;
473a3e0fd82Sopenharmony_ci        float scale_ = 1.0f;
474a3e0fd82Sopenharmony_ci        UIButton& button_;
475a3e0fd82Sopenharmony_ci    } animator_;
476a3e0fd82Sopenharmony_ci#endif
477a3e0fd82Sopenharmony_ci    bool buttonStyleAllocFlag_;
478a3e0fd82Sopenharmony_ci
479a3e0fd82Sopenharmony_ciprivate:
480a3e0fd82Sopenharmony_ci    /** Sets up the theme styles */
481a3e0fd82Sopenharmony_ci    void SetupThemeStyles();
482a3e0fd82Sopenharmony_ci
483a3e0fd82Sopenharmony_ci    void DrawImg(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea, OpacityType opaScale);
484a3e0fd82Sopenharmony_ci};
485a3e0fd82Sopenharmony_ci} // namespace OHOS
486a3e0fd82Sopenharmony_ci#endif // GRAPHIC_LITE_UI_BUTTON_H
487