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_slider.h
28  *
29  * @brief Defines the attributes and common functions of a slider.
30  *
31  * @since 1.0
32  * @version 1.0
33  */
34 
35 #ifndef GRAPHIC_LITE_UI_SLIDER_H
36 #define GRAPHIC_LITE_UI_SLIDER_H
37 
38 #include "common/image.h"
39 #include "components/ui_box_progress.h"
40 
41 namespace OHOS {
42 /**
43  * @brief Represents a slider.
44  *
45  * Users can drag or click the knob to adjust the progress of an event.
46  *
47  * @see UIBoxProgress
48  * @since 1.0
49  * @version 1.0
50  */
51 class UISlider : public UIBoxProgress {
52 public:
53     /**
54      * @brief A constructor used to create a <b>UISlider</b> instance.
55      *
56      * @since 1.0
57      * @version 1.0
58      */
59     UISlider();
60 
61     /**
62      * @brief A destructor used to delete the <b>UISlider</b> instance.
63      *
64      * @since 1.0
65      * @version 1.0
66      */
67     virtual ~UISlider();
68 
69     /**
70      * @brief Obtains the view type.
71      *
72      * @return Returns the view type, as defined in {@link UIViewType}.
73      * @since 1.0
74      * @version 1.0
75      */
GetViewType()76     UIViewType GetViewType() const override
77     {
78         return UI_SLIDER;
79     }
80 
81     /**
82      * @brief Sets the width for this knob.
83      *
84      * The width of this knob is the same as its height. \n
85      * By default, the width of this knob is the same as the height of the horizontal slider
86      * or the width of the vertical slider. \n
87      *
88      * @param width Indicates the knob width to set.
89      * @see GetKnobWidth
90      * @since 1.0
91      * @version 1.0
92      */
SetKnobWidth(int16_t width)93     void SetKnobWidth(int16_t width)
94     {
95         knobWidth_ = width;
96     }
97 
98     /**
99      * @brief Obtains the knob width.
100      *
101      * @return Returns the knob width.
102      * @see SetKnobWidth
103      * @since 1.0
104      * @version 1.0
105      */
GetKnobWidth()106     int16_t GetKnobWidth()
107     {
108         return knobWidth_;
109     }
110 
111     /**
112      * @brief Sets the image as pixel maps for this slider's knob.
113      *
114      * @param knobImage Indicates the knob image to set.
115      * @since 6
116      */
117     void SetKnobImage(const ImageInfo* knobImage);
118 
119     /**
120      * @brief Sets the image for this slider's knob.
121      *
122      * @param knobImage Indicates the knob image to set.
123      * @since 6
124      */
125     void SetKnobImage(const char* knobImage);
126 
127     /**
128      * @brief Sets the color for this slider's knob.
129      *
130      * @param knobColor Indicates the knob color to set.
131      * @since 6
132      */
SetKnobColor(const ColorType knobColor)133     void SetKnobColor(const ColorType knobColor)
134     {
135         SetKnobStyle(STYLE_BACKGROUND_COLOR, knobColor.full);
136     }
137 
138     /**
139      * @brief Sets the corner radius for this slider's knob.
140      *
141      * @param knobRadius Indicates the knob corner radius to set.
142      * @since 6
143      */
SetKnobRadius(int16_t knobRadius)144     void SetKnobRadius(int16_t knobRadius)
145     {
146         SetKnobStyle(STYLE_BORDER_RADIUS, knobRadius);
147     }
148 
149     /**
150      * @brief Sets the knob style.
151      *
152      * @param style Indicates the knob style to set. For details, see {@link Style}.
153      * @see GetKnobStyle
154      * @since 1.0
155      * @version 1.0
156      */
157     void SetKnobStyle(const Style& style);
158 
159     /**
160      * @brief Sets a knob style.
161      *
162      * @param key Indicates the key of the style to set.
163      * @param value Indicates the value matching the key.
164      * @since 1.0
165      * @version 1.0
166      */
167     void SetKnobStyle(uint8_t key, int64_t value);
168 
169     /**
170      * @brief Obtains the knob style.
171      *
172      * @return Returns the knob style.
173      * @since 1.0
174      * @version 1.0
175      */
176     const Style& GetKnobStyle() const;
177 
178     /**
179      * @brief Obtains the value of a knob style.
180      *
181      * @param key Indicates the key of the style.
182      * @return Returns the value of the style.
183      * @since 1.0
184      * @version 1.0
185      */
186     int64_t GetKnobStyle(uint8_t key) const;
187 
188     /**
189      * @brief Sets the images as pixel maps for this slider, including the background, foreground images.
190      *
191      * @param backgroundImage Indicates the background image to set.
192      * @param foregroundImage Indicates the foreground image to set.
193      * @since 1.0
194      * @version 1.0
195      */
196     void SetImage(const ImageInfo* backgroundImage, const ImageInfo* foregroundImage);
197 
198     /**
199      * @brief Sets the images for this slider, including the background, foreground images.
200      *
201      * @param backgroundImage Indicates the background image to set.
202      * @param foregroundImage Indicates the foreground image to set.
203      * @since 1.0
204      * @version 1.0
205      */
206     void SetImage(const char* backgroundImage, const char* foregroundImage);
207 
208     /**
209      * @brief Sets the colors for this slider, including the background, foreground colors.
210      *
211      * @param backgroundColor Indicates the background color to set.
212      * @param foregroundColor Indicates the foreground color to set.
213      * @since 1.0
214      * @version 1.0
215      */
SetSliderColor(const ColorType backgroundColor,const ColorType foregroundColor)216     void SetSliderColor(const ColorType backgroundColor, const ColorType foregroundColor)
217     {
218         SetBackgroundStyle(STYLE_BACKGROUND_COLOR, backgroundColor.full);
219         SetForegroundStyle(STYLE_BACKGROUND_COLOR, foregroundColor.full);
220     }
221 
222     /**
223      * @brief Sets the corner radiuses for this slider, including the background, foreground corner radiuses.
224      *
225      * @param backgroundRadius Indicates the background corner radius to set.
226      * @param foregroundRadius Indicates the foreground corner radius to set.
227      * @since 1.0
228      * @version 1.0
229      */
SetSliderRadius(int16_t backgroundRadius,int16_t foregroundRadius)230     void SetSliderRadius(int16_t backgroundRadius, int16_t foregroundRadius)
231     {
232         SetBackgroundStyle(STYLE_BORDER_RADIUS, backgroundRadius);
233         SetForegroundStyle(STYLE_BORDER_RADIUS, foregroundRadius);
234     }
235 
236 #if ENABLE_ROTATE_INPUT
237     /**
238      * @brief Obtains the rotation factor.
239      *
240      * @return Returns the rotation factor.
241      * @since 5.0
242      * @version 3.0
243      */
GetRotateFactor()244     float GetRotateFactor()
245     {
246         return rotateFactor_;
247     }
248 
249     /**
250      * @brief Sets the rotation factor.
251      *
252      * @param factor Indicates the rotation factor to set.
253      * @since 5.0
254      * @version 3.0
255      */
SetRotateFactor(float factor)256     void SetRotateFactor(float factor)
257     {
258         if (MATH_ABS(factor) > MAX_ROTATE_FACTOR) {
259             rotateFactor_ = (factor > 0) ? MAX_ROTATE_FACTOR : -MAX_ROTATE_FACTOR;
260             return;
261         }
262         rotateFactor_ = factor;
263     }
264 
265     bool OnRotateEvent(const RotateEvent& event) override;
266 
267     bool OnRotateEndEvent(const RotateEvent& event) override;
268 #endif
269     bool OnClickEvent(const ClickEvent& event) override;
270 
271     bool OnDragEvent(const DragEvent& event) override;
272 
273     bool OnDragEndEvent(const DragEvent& event) override;
274 
OnPreDraw(Rect & invalidatedArea)275     bool OnPreDraw(Rect& invalidatedArea) const override
276     {
277         return false;
278     }
279 
280     void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;
281 
282     /**
283      * @brief Represents the listener for a slider change.
284      *
285      * This is an inner class of <b>UISlider</b> used to listen for slider events and invoke the callback function.
286      *
287      * @see UISlider
288      * @since 1.0
289      * @version 1.0
290      */
291     class UISliderEventListener : public HeapBase {
292     public:
293         /**
294          * @brief A destructor used to delete the <b> UISliderEventListener </b> instance.
295          *
296          * @since 1.0
297          * @version 1.0
298          */
~UISliderEventListener()299         virtual ~UISliderEventListener() {}
300         /**
301          * @brief Called when the slider is dragged or clicked. This is a virtual function, which needs your
302          *        implementation.
303          *
304          * @param value Indicates the current value of the slider.
305          * @since 1.0
306          * @version 1.0
307          */
OnChange(int32_t value)308         virtual void OnChange(int32_t value) {}
309         /**
310          * @brief Called when the slider is released. This is a virtual function, which needs your implementation.
311          *
312          * @param value Indicates the current value of the slider.
313          * @since 1.0
314          * @version 1.0
315          */
OnRelease(int32_t value)316         virtual void OnRelease(int32_t value) {}
317     };
318 
319     /**
320      * @brief Sets the listener for a slider change.
321      *
322      * When a user drags or clicks the slider, listening is triggered and the <b>OnChange</b> callback is invoked.
323      * When a user releases the slider, the <b>OnRelease</b> callback is invoked.
324      *
325      * @param listener Indicates the listener to set. For details, see {@link UISliderEventListener}.
326      * @since 1.0
327      * @version 1.0
328      */
SetSliderEventListener(UISliderEventListener * listener)329     void SetSliderEventListener(UISliderEventListener* listener)
330     {
331         listener_ = listener;
332     }
333 
334 protected:
335     bool InitImage() override;
336 
337 private:
338     static constexpr uint8_t MAX_ROTATE_FACTOR = 128;
339 
340     int16_t knobWidth_;
341     bool knobStyleAllocFlag_;
342     Style* knobStyle_;
343     Image* knobImage_;
344 
345     void DrawKnob(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea, const Rect& foregroundRect);
346     void DrawForeground(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea, Rect& coords);
347     int32_t CalculateCurrentValue(int16_t length, int16_t totalLength);
348     int32_t UpdateCurrentValue(const Point& knobPosition);
349 #if ENABLE_ROTATE_INPUT
350     float rotateFactor_;
351     float cachedRotation_;
352 #endif
353     UISliderEventListener* listener_;
354 }; // class UISlider
355 } // namespace OHOS
356 #endif // GRAPHIC_LITE_UI_SLIDER_H
357