1 /**
2  * @file lv_spinbox.h
3  *
4  */
5 
6 #ifndef LV_SPINBOX_H
7 #define LV_SPINBOX_H
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 /*********************
14  *      INCLUDES
15  *********************/
16 #include "../../../lvgl.h"
17 
18 #if LV_USE_SPINBOX
19 
20 /*Testing of dependencies*/
21 #if LV_USE_TEXTAREA == 0
22 #error "lv_spinbox: lv_ta is required. Enable it in lv_conf.h (LV_USE_TEXTAREA  1) "
23 #endif
24 
25 /*********************
26  *      DEFINES
27  *********************/
28 #define LV_SPINBOX_MAX_DIGIT_COUNT 10
29 
30 /**********************
31  *      TYPEDEFS
32  **********************/
33 
34 /*Data of spinbox*/
35 typedef struct {
36     lv_textarea_t ta;   /*Ext. of ancestor*/
37     /*New data for this type*/
38     int32_t value;
39     int32_t range_max;
40     int32_t range_min;
41     int32_t step;
42     uint16_t digit_count : 4;
43     uint16_t dec_point_pos : 4; /*if 0, there is no separator and the number is an integer*/
44     uint16_t rollover : 1;   // Set to true for rollover functionality
45     uint16_t digit_step_dir : 2; // the direction the digit will step on encoder button press when editing
46 } lv_spinbox_t;
47 
48 extern const lv_obj_class_t lv_spinbox_class;
49 
50 /**********************
51  * GLOBAL PROTOTYPES
52  **********************/
53 
54 /**
55  * Create a Spinbox object
56  * @param parent pointer to an object, it will be the parent of the new spinbox
57  * @return pointer to the created spinbox
58  */
59 lv_obj_t * lv_spinbox_create(lv_obj_t * parent);
60 
61 /*=====================
62  * Setter functions
63  *====================*/
64 
65 /**
66  * Set spinbox value
67  * @param obj pointer to spinbox
68  * @param i value to be set
69  */
70 void lv_spinbox_set_value(lv_obj_t * obj, int32_t i);
71 
72 /**
73  * Set spinbox rollover function
74  * @param obj pointer to spinbox
75  * @param b true or false to enable or disable (default)
76  */
77 void lv_spinbox_set_rollover(lv_obj_t * obj, bool b);
78 
79 /**
80  * Set spinbox digit format (digit count and decimal format)
81  * @param obj pointer to spinbox
82  * @param digit_count number of digit excluding the decimal separator and the sign
83  * @param separator_position number of digit before the decimal point. If 0, decimal point is not
84  * shown
85  */
86 void lv_spinbox_set_digit_format(lv_obj_t * obj, uint8_t digit_count, uint8_t separator_position);
87 
88 /**
89  * Set spinbox step
90  * @param obj pointer to spinbox
91  * @param step steps on increment/decrement. Can be 1, 10, 100, 1000, etc the digit that will change.
92  */
93 void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step);
94 
95 /**
96  * Set spinbox value range
97  * @param obj pointer to spinbox
98  * @param range_min maximum value, inclusive
99  * @param range_max minimum value, inclusive
100  */
101 void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max);
102 
103 /**
104  * Set cursor position to a specific digit for edition
105  * @param obj pointer to spinbox
106  * @param pos selected position in spinbox
107  */
108 void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint8_t pos);
109 
110 /**
111  * Set direction of digit step when clicking an encoder button while in editing mode
112  * @param obj pointer to spinbox
113  * @param direction the direction (LV_DIR_RIGHT or LV_DIR_LEFT)
114  */
115 void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction);
116 
117 /*=====================
118  * Getter functions
119  *====================*/
120 
121 /**
122  * Get spinbox rollover function status
123  * @param obj pointer to spinbox
124  */
125 bool lv_spinbox_get_rollover(lv_obj_t * obj);
126 
127 /**
128  * Get the spinbox numeral value (user has to convert to float according to its digit format)
129  * @param obj pointer to spinbox
130  * @return value integer value of the spinbox
131  */
132 int32_t lv_spinbox_get_value(lv_obj_t * obj);
133 
134 /**
135  * Get the spinbox step value (user has to convert to float according to its digit format)
136  * @param obj pointer to spinbox
137  * @return value integer step value of the spinbox
138  */
139 int32_t lv_spinbox_get_step(lv_obj_t * obj);
140 
141 /*=====================
142  * Other functions
143  *====================*/
144 
145 /**
146  * Select next lower digit for edition by dividing the step by 10
147  * @param obj pointer to spinbox
148  */
149 void lv_spinbox_step_next(lv_obj_t * obj);
150 
151 /**
152  * Select next higher digit for edition by multiplying the step by 10
153  * @param obj pointer to spinbox
154  */
155 void lv_spinbox_step_prev(lv_obj_t * obj);
156 
157 /**
158  * Increment spinbox value by one step
159  * @param obj pointer to spinbox
160  */
161 void lv_spinbox_increment(lv_obj_t * obj);
162 
163 /**
164  * Decrement spinbox value by one step
165  * @param obj pointer to spinbox
166  */
167 void lv_spinbox_decrement(lv_obj_t * obj);
168 
169 /**********************
170  *      MACROS
171  **********************/
172 
173 /* It was ambiguous in MicroPython. See https://github.com/lvgl/lvgl/issues/3301
174  * TODO remove in v9*/
175 #define lv_spinbox_set_pos lv_spinbox_set_cursor_pos
176 
177 #endif /*LV_USE_SPINBOX*/
178 
179 #ifdef __cplusplus
180 } /*extern "C"*/
181 #endif
182 #endif /*LV_SPINBOX_H*/
183