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