1 /** 2 * @file lv_obj_scroll.h 3 * 4 */ 5 6 #ifndef LV_OBJ_SCROLL_H 7 #define LV_OBJ_SCROLL_H 8 9 #ifdef __cplusplus 10 extern "C" { 11 #endif 12 13 /********************* 14 * INCLUDES 15 *********************/ 16 #include "../misc/lv_area.h" 17 #include "../misc/lv_anim.h" 18 #include "../misc/lv_types.h" 19 20 /********************* 21 * DEFINES 22 *********************/ 23 24 /********************** 25 * TYPEDEFS 26 **********************/ 27 28 /*Can't include lv_obj.h because it includes this header file*/ 29 struct _lv_obj_t; 30 31 /** Scrollbar modes: shows when should the scrollbars be visible*/ 32 enum { 33 LV_SCROLLBAR_MODE_OFF, /**< Never show scrollbars*/ 34 LV_SCROLLBAR_MODE_ON, /**< Always show scrollbars*/ 35 LV_SCROLLBAR_MODE_ACTIVE, /**< Show scroll bars when object is being scrolled*/ 36 LV_SCROLLBAR_MODE_AUTO, /**< Show scroll bars when the content is large enough to be scrolled*/ 37 }; 38 typedef uint8_t lv_scrollbar_mode_t; 39 40 41 /** Scroll span align options. Tells where to align the snappable children when scroll stops.*/ 42 enum { 43 LV_SCROLL_SNAP_NONE, /**< Do not align, leave where it is*/ 44 LV_SCROLL_SNAP_START, /**< Align to the left/top*/ 45 LV_SCROLL_SNAP_END, /**< Align to the right/bottom*/ 46 LV_SCROLL_SNAP_CENTER /**< Align to the center*/ 47 }; 48 typedef uint8_t lv_scroll_snap_t; 49 50 /********************** 51 * GLOBAL PROTOTYPES 52 **********************/ 53 54 /*===================== 55 * Setter functions 56 *====================*/ 57 58 /** 59 * Set how the scrollbars should behave. 60 * @param obj pointer to an object 61 * @param mode LV_SCROLL_MODE_ON/OFF/AUTO/ACTIVE 62 */ 63 void lv_obj_set_scrollbar_mode(struct _lv_obj_t * obj, lv_scrollbar_mode_t mode); 64 65 /** 66 * Set the object in which directions can be scrolled 67 * @param obj pointer to an object 68 * @param dir the allow scroll directions. An element or OR-ed values of `lv_dir_t` 69 */ 70 void lv_obj_set_scroll_dir(struct _lv_obj_t * obj, lv_dir_t dir); 71 72 /** 73 * Set where to snap the children when scrolling ends horizontally 74 * @param obj pointer to an object 75 * @param align the snap align to set from `lv_scroll_snap_t` 76 */ 77 void lv_obj_set_scroll_snap_x(struct _lv_obj_t * obj, lv_scroll_snap_t align); 78 79 /** 80 * Set where to snap the children when scrolling ends vertically 81 * @param obj pointer to an object 82 * @param align the snap align to set from `lv_scroll_snap_t` 83 */ 84 void lv_obj_set_scroll_snap_y(struct _lv_obj_t * obj, lv_scroll_snap_t align); 85 86 /*===================== 87 * Getter functions 88 *====================*/ 89 90 /** 91 * Get the current scroll mode (when to hide the scrollbars) 92 * @param obj pointer to an object 93 * @return the current scroll mode from `lv_scrollbar_mode_t` 94 */ 95 lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const struct _lv_obj_t * obj); 96 97 /** 98 * Get the object in which directions can be scrolled 99 * @param obj pointer to an object 100 * @param dir the allow scroll directions. An element or OR-ed values of `lv_dir_t` 101 */ 102 lv_dir_t lv_obj_get_scroll_dir(const struct _lv_obj_t * obj); 103 104 /** 105 * Get where to snap the children when scrolling ends horizontally 106 * @param obj pointer to an object 107 * @return the current snap align from `lv_scroll_snap_t` 108 */ 109 lv_scroll_snap_t lv_obj_get_scroll_snap_x(const struct _lv_obj_t * obj); 110 111 /** 112 * Get where to snap the children when scrolling ends vertically 113 * @param obj pointer to an object 114 * @return the current snap align from `lv_scroll_snap_t` 115 */ 116 lv_scroll_snap_t lv_obj_get_scroll_snap_y(const struct _lv_obj_t * obj); 117 118 /** 119 * Get current X scroll position. 120 * @param obj pointer to an object 121 * @return the current scroll position from the left edge. 122 * If the object is not scrolled return 0 123 * If scrolled return > 0 124 * If scrolled in (elastic scroll) return < 0 125 */ 126 lv_coord_t lv_obj_get_scroll_x(const struct _lv_obj_t * obj); 127 128 /** 129 * Get current Y scroll position. 130 * @param obj pointer to an object 131 * @return the current scroll position from the top edge. 132 * If the object is not scrolled return 0 133 * If scrolled return > 0 134 * If scrolled inside return < 0 135 */ 136 lv_coord_t lv_obj_get_scroll_y(const struct _lv_obj_t * obj); 137 138 /** 139 * Return the height of the area above the object. 140 * That is the number of pixels the object can be scrolled down. 141 * Normally positive but can be negative when scrolled inside. 142 * @param obj pointer to an object 143 * @return the scrollable area above the object in pixels 144 */ 145 lv_coord_t lv_obj_get_scroll_top(struct _lv_obj_t * obj); 146 147 /** 148 * Return the height of the area below the object. 149 * That is the number of pixels the object can be scrolled down. 150 * Normally positive but can be negative when scrolled inside. 151 * @param obj pointer to an object 152 * @return the scrollable area below the object in pixels 153 */ 154 lv_coord_t lv_obj_get_scroll_bottom(struct _lv_obj_t * obj); 155 156 /** 157 * Return the width of the area on the left the object. 158 * That is the number of pixels the object can be scrolled down. 159 * Normally positive but can be negative when scrolled inside. 160 * @param obj pointer to an object 161 * @return the scrollable area on the left the object in pixels 162 */ 163 lv_coord_t lv_obj_get_scroll_left(struct _lv_obj_t * obj); 164 165 /** 166 * Return the width of the area on the right the object. 167 * That is the number of pixels the object can be scrolled down. 168 * Normally positive but can be negative when scrolled inside. 169 * @param obj pointer to an object 170 * @return the scrollable area on the right the object in pixels 171 */ 172 lv_coord_t lv_obj_get_scroll_right(struct _lv_obj_t * obj); 173 174 /** 175 * Get the X and Y coordinates where the scrolling will end for this object if a scrolling animation is in progress. 176 * If no scrolling animation, give the current `x` or `y` scroll position. 177 * @param obj pointer to an object 178 * @param end pointer to store the result 179 */ 180 void lv_obj_get_scroll_end(struct _lv_obj_t * obj, lv_point_t * end); 181 182 /*===================== 183 * Other functions 184 *====================*/ 185 186 /** 187 * Scroll by a given amount of pixels 188 * @param obj pointer to an object to scroll 189 * @param dx pixels to scroll horizontally 190 * @param dy pixels to scroll vertically 191 * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately 192 * @note > 0 value means scroll right/bottom (show the more content on the right/bottom) 193 * @note e.g. dy = -20 means scroll down 20 px 194 */ 195 void lv_obj_scroll_by(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_anim_enable_t anim_en); 196 197 /** 198 * Scroll by a given amount of pixels. 199 * `dx` and `dy` will be limited internally to allow scrolling only on the content area. 200 * @param obj pointer to an object to scroll 201 * @param dx pixels to scroll horizontally 202 * @param dy pixels to scroll vertically 203 * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately 204 * @note e.g. dy = -20 means scroll down 20 px 205 */ 206 void lv_obj_scroll_by_bounded(struct _lv_obj_t * obj, lv_coord_t dx, lv_coord_t dy, lv_anim_enable_t anim_en); 207 208 /** 209 * Scroll to a given coordinate on an object. 210 * `x` and `y` will be limited internally to allow scrolling only on the content area. 211 * @param obj pointer to an object to scroll 212 * @param x pixels to scroll horizontally 213 * @param y pixels to scroll vertically 214 * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately 215 */ 216 void lv_obj_scroll_to(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_anim_enable_t anim_en); 217 218 /** 219 * Scroll to a given X coordinate on an object. 220 * `x` will be limited internally to allow scrolling only on the content area. 221 * @param obj pointer to an object to scroll 222 * @param x pixels to scroll horizontally 223 * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately 224 */ 225 void lv_obj_scroll_to_x(struct _lv_obj_t * obj, lv_coord_t x, lv_anim_enable_t anim_en); 226 227 /** 228 * Scroll to a given Y coordinate on an object 229 * `y` will be limited internally to allow scrolling only on the content area. 230 * @param obj pointer to an object to scroll 231 * @param y pixels to scroll vertically 232 * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately 233 */ 234 void lv_obj_scroll_to_y(struct _lv_obj_t * obj, lv_coord_t y, lv_anim_enable_t anim_en); 235 236 /** 237 * Scroll to an object until it becomes visible on its parent 238 * @param obj pointer to an object to scroll into view 239 * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately 240 */ 241 void lv_obj_scroll_to_view(struct _lv_obj_t * obj, lv_anim_enable_t anim_en); 242 243 /** 244 * Scroll to an object until it becomes visible on its parent. 245 * Do the same on the parent's parent, and so on. 246 * Therefore the object will be scrolled into view even it has nested scrollable parents 247 * @param obj pointer to an object to scroll into view 248 * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately 249 */ 250 void lv_obj_scroll_to_view_recursive(struct _lv_obj_t * obj, lv_anim_enable_t anim_en); 251 252 253 /** 254 * Low level function to scroll by given x and y coordinates. 255 * `LV_EVENT_SCROLL` is sent. 256 * @param obj pointer to an object to scroll 257 * @param x pixels to scroll horizontally 258 * @param y pixels to scroll vertically 259 * @return `LV_RES_INV`: to object was deleted in `LV_EVENT_SCROLL`; 260 * `LV_RES_OK`: if the object is still valid 261 */ 262 lv_res_t _lv_obj_scroll_by_raw(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y); 263 264 /** 265 * Tell whether an object is being scrolled or not at this moment 266 * @param obj pointer to an object 267 * @return true: `obj` is being scrolled 268 */ 269 bool lv_obj_is_scrolling(const struct _lv_obj_t * obj); 270 271 /** 272 * Check the children of `obj` and scroll `obj` to fulfill the scroll_snap settings 273 * @param obj an object whose children needs to checked and snapped 274 * @param anim_en LV_ANIM_ON/OFF 275 */ 276 void lv_obj_update_snap(struct _lv_obj_t * obj, lv_anim_enable_t anim_en); 277 278 /** 279 * Get the area of the scrollbars 280 * @param obj pointer to an object 281 * @param hor pointer to store the area of the horizontal scrollbar 282 * @param ver pointer to store the area of the vertical scrollbar 283 */ 284 void lv_obj_get_scrollbar_area(struct _lv_obj_t * obj, lv_area_t * hor, lv_area_t * ver); 285 286 /** 287 * Invalidate the area of the scrollbars 288 * @param obj pointer to an object 289 */ 290 void lv_obj_scrollbar_invalidate(struct _lv_obj_t * obj); 291 292 /** 293 * Checked if the content is scrolled "in" and adjusts it to a normal position. 294 * @param obj pointer to an object 295 * @param anim_en LV_ANIM_ON/OFF 296 */ 297 void lv_obj_readjust_scroll(struct _lv_obj_t * obj, lv_anim_enable_t anim_en); 298 299 /********************** 300 * MACROS 301 **********************/ 302 303 #ifdef __cplusplus 304 } /*extern "C"*/ 305 #endif 306 307 #endif /*LV_OBJ_SCROLL_H*/ 308