1 /*
2  * Copyright (c) 2020-2021 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 /**
17  * @addtogroup UI_Components
18  * @{
19  *
20  * @brief Defines UI components such as buttons, texts, images, lists, and progress bars.
21  *
22  * @since 1.0
23  * @version 1.0
24  */
25 
26 /**
27  * @file ui_box_progress.h
28  *
29  * @brief Defines the attributes and common functions of a linear progress bar.
30  *
31  * @since 1.0
32  * @version 1.0
33  */
34 
35 #ifndef GRAPHIC_LITE_UI_BOX_PROGRESS_H
36 #define GRAPHIC_LITE_UI_BOX_PROGRESS_H
37 
38 #include "components/ui_abstract_progress.h"
39 
40 namespace OHOS {
41 /**
42  * @brief Represents a linear progress bar.
43  *
44  * This class is used to set the range and current value to display the linear progress bar
45  * which can be in multiple directions.
46  *
47  * @see UIAbstractProgress
48  * @since 1.0
49  * @version 1.0
50  */
51 class UIBoxProgress : public UIAbstractProgress {
52 public:
53     /**
54      * @brief Enumerates the directions of the progress bar.
55      */
56     enum class Direction : uint8_t {
57         /** Filling from left to right */
58         DIR_LEFT_TO_RIGHT,
59         /** Filling from right to left */
60         DIR_RIGHT_TO_LEFT,
61         /** Filling from top to bottom */
62         DIR_TOP_TO_BOTTOM,
63         /** Filling from bottom to top */
64         DIR_BOTTOM_TO_TOP,
65     };
66 
67     /**
68      * @brief A constructor used to create a <b>UIBoxProgress</b> instance.
69      *
70      * @since 1.0
71      * @version 1.0
72      */
73     UIBoxProgress();
74 
75     /**
76      * @brief A destructor used to delete the <b>UIBoxProgress</b> instance.
77      *
78      * @since 1.0
79      * @version 1.0
80      */
~UIBoxProgress()81     virtual ~UIBoxProgress() {}
82 
83     /**
84      * @brief Obtains the view type.
85      *
86      * @return Returns the view type, as defined in {@link UIViewType}.
87      * @since 1.0
88      * @version 1.0
89      */
GetViewType()90     UIViewType GetViewType() const override
91     {
92         return UI_BOX_PROGRESS;
93     }
94 
95     /**
96      * @brief Sets the width for the view holding this progress bar.
97      *
98      * The width of the view must be greater than or equal to the actual width of the progress bar
99      * to ensure a normal display. \n
100      *
101      * @param width Indicates the width of the view.
102      * @see SetHeight | SetValidWidth | SetValidHeight
103      * @since 1.0
104      * @version 1.0
105      */
SetWidth(int16_t width)106     void SetWidth(int16_t width) override
107     {
108         UIView::SetWidth(width);
109         if (!isValidWidthSet_) {
110             progressWidth_ = width;
111         }
112     }
113 
114     /**
115      * @brief Sets the height for this view.
116      *
117      * The height of the view must be greater than or equal to the actual height of the progress bar
118      * to ensure a normal display. \n
119      *
120      * @param height Indicates the height to set.
121      * @see SetWidth | SetValidWidth | SetValidHeight
122      * @since 1.0
123      * @version 1.0
124      */
SetHeight(int16_t height)125     void SetHeight(int16_t height) override
126     {
127         UIView::SetHeight(height);
128         if (!isValidHeightSet_) {
129             progressHeight_ = height;
130         }
131     }
132 
133     /**
134      * @brief Sets the direction for this progress bar.
135      *
136      * @param direction Indicates the direction to set. The default direction is from left to right.
137      * For details, see {@link Direction}.
138      * @see GetDirection
139      * @since 1.0
140      * @version 1.0
141      */
SetDirection(const Direction & direction)142     void SetDirection(const Direction& direction)
143     {
144         direction_ = direction;
145     }
146 
147     /**
148      * @brief Obtains the direction of this progress bar.
149      *
150      * @return Returns the direction of this progress bar, as defined in {@link Direction}.
151      * @see SetDirection
152      * @since 1.0
153      * @version 1.0
154      */
GetDirection()155     Direction GetDirection() const
156     {
157         return direction_;
158     }
159 
160     /**
161      * @brief Sets the actual width for this progress bar.
162      *
163      * The progress bar is centered in the view after the setting. By default, the width of the progress bar
164      * is the same as that of the view. \n
165      * If the width of the progress bar is greater than that of the view, the excess part cannot be displayed. \n
166      *
167      * @param width Indicates the actual width of this progress bar.
168      * @see GetValidWidth
169      * @since 1.0
170      * @version 1.0
171      */
SetValidWidth(int16_t width)172     void SetValidWidth(int16_t width)
173     {
174         progressWidth_ = width;
175         isValidWidthSet_ = true;
176     }
177 
178     /**
179      * @brief Obtains the actual width of this progress bar.
180      *
181      * @return Returns the actual width of this progress bar.
182      * @see SetValidWidth
183      * @since 1.0
184      * @version 1.0
185      */
GetValidWidth()186     int16_t GetValidWidth() const
187     {
188         return progressWidth_;
189     }
190 
191     /**
192      * @brief Sets the actual height for this progress bar.
193      *
194      * The progress bar is centered in the view after the setting. By default, the height of the progress bar
195      * is the same as that of the view. \n
196      * If the height of the progress bar is greater than that of the view, the excess part cannot be displayed. \n
197      *
198      * @param height Indicates the actual height to set.
199      * @see GetValidHeight
200      * @since 1.0
201      * @version 1.0
202      */
SetValidHeight(int16_t height)203     void SetValidHeight(int16_t height)
204     {
205         progressHeight_ = height;
206         isValidHeightSet_ = true;
207     }
208 
209     /**
210      * @brief Obtains the actual height of this progress bar.
211      *
212      * @return Returns the actual height of this progress bar.
213      * @see SetValidHeight
214      * @since 1.0
215      * @version 1.0
216      */
GetValidHeight()217     int16_t GetValidHeight() const
218     {
219         return progressHeight_;
220     }
221 
222     void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;
223 
224 protected:
225     void GetBackgroundParam(Point& startPoint, int16_t& width, int16_t& height, uint16_t& radius, const Style& style);
226     void DrawBackground(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea);
227     void DrawForeground(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea, Rect& coords);
228     void DrawRoundCap(BufferInfo& gfxDstBuffer,
229                       const Image* image,
230                       const Point& imgPos,
231                       const Rect& rect,
232                       const Rect& invalidatedArea,
233                       uint16_t radius,
234                       const Style& style);
235     void DrawValidRect(BufferInfo& gfxDstBuffer,
236                        const Image* image,
237                        const Rect& rect,
238                        const Rect& invalidatedArea,
239                        const Style& style,
240                        uint16_t radius);
241 
242     uint16_t progressWidth_;
243     uint16_t progressHeight_;
244     Direction direction_;
245     bool isValidWidthSet_ : 1;
246     bool isValidHeightSet_ : 1;
247 };
248 } // namespace OHOS
249 #endif // GRAPHIC_LITE_UI_BOX_PROGRESS_H
250