1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00

scroll: add scroll throw

This commit is contained in:
Gabor Kiss-Vamosi 2020-07-08 12:29:47 +02:00
parent d813bbe5e2
commit 9cfd399fb3
4 changed files with 77 additions and 50 deletions

View File

@ -1259,7 +1259,6 @@ static void indev_drag(lv_indev_proc_t * proc)
if(target_obj == NULL) return; if(target_obj == NULL) return;
lv_drag_dir_t dirs = LV_DRAG_DIR_VER; //scrollable ? lv_obj_get_scroll_dir(target_obj) : lv_obj_get_drag_dir(target_obj); lv_drag_dir_t dirs = LV_DRAG_DIR_VER; //scrollable ? lv_obj_get_scroll_dir(target_obj) : lv_obj_get_drag_dir(target_obj);
bool just_started = false; bool just_started = false;
/*Get the coordinates of the object and modify them*/ /*Get the coordinates of the object and modify them*/
@ -1379,67 +1378,94 @@ static void indev_drag_throw(lv_indev_proc_t * proc)
{ {
if(proc->types.pointer.drag_in_prog == 0) return; if(proc->types.pointer.drag_in_prog == 0) return;
lv_obj_t * drag_obj = get_dragged_obj(proc->types.pointer.last_obj);
if(drag_obj == NULL) return; bool scrollable = true;
/*Get which object to drad/scroll*/
lv_obj_t * target_obj = get_dragged_obj(proc->types.pointer.last_obj);
if(target_obj == NULL) return;
/*Return if the drag throw is not enabled*/ /*Return if the drag throw is not enabled*/
if(lv_obj_get_drag_throw(drag_obj) == false) { // if(lv_obj_get_drag_throw(target_obj) == false) {
proc->types.pointer.drag_in_prog = 0; // proc->types.pointer.drag_in_prog = 0;
drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_END, indev_act); // target_obj->signal_cb(target_obj, scrollable ? LV_SIGNAL_SCROLL_END : LV_SIGNAL_DRAG_END, indev_act);
if(indev_reset_check(proc)) return; // if(indev_reset_check(proc)) return;
//
lv_event_send(drag_obj, LV_EVENT_DRAG_END, NULL); // lv_event_send(target_obj, LV_EVENT_DRAG_END, NULL);
return; // return;
} // }
lv_drag_dir_t allowed_dirs = lv_obj_get_drag_dir(drag_obj);
/*Reduce the vectors*/ /*Reduce the vectors*/
proc->types.pointer.drag_throw_vect.x = proc->types.pointer.drag_throw_vect.x =
proc->types.pointer.drag_throw_vect.x * (100 - indev_act->driver.drag_throw) / 100; proc->types.pointer.drag_throw_vect.x * (100 - indev_act->driver.drag_throw) / 30;
proc->types.pointer.drag_throw_vect.y = proc->types.pointer.drag_throw_vect.y =
proc->types.pointer.drag_throw_vect.y * (100 - indev_act->driver.drag_throw) / 100; proc->types.pointer.drag_throw_vect.y * (100 - indev_act->driver.drag_throw) / 30;
if(proc->types.pointer.drag_throw_vect.x != 0 || proc->types.pointer.drag_throw_vect.y != 0) { switch(proc->types.pointer.drag_dir) {
/*Get the coordinates and modify them*/ case LV_DRAG_DIR_HOR:
lv_area_t coords_ori; proc->types.pointer.drag_throw_vect.y = 0;
lv_obj_get_coords(drag_obj, &coords_ori); break;
lv_coord_t act_x = lv_obj_get_x(drag_obj) + proc->types.pointer.drag_throw_vect.x; case LV_DRAG_DIR_VER:
lv_coord_t act_y = lv_obj_get_y(drag_obj) + proc->types.pointer.drag_throw_vect.y; proc->types.pointer.drag_throw_vect.x = 0;
break;
if(allowed_dirs == LV_DRAG_DIR_BOTH) lv_obj_set_pos(drag_obj, act_x, act_y);
else if(allowed_dirs == LV_DRAG_DIR_HOR) lv_obj_set_x(drag_obj, act_x);
else if(allowed_dirs == LV_DRAG_DIR_VER) lv_obj_set_y(drag_obj, act_y);
else if(allowed_dirs == LV_DRAG_DIR_ONE) {
if(proc->types.pointer.drag_sum.x) lv_obj_set_x(drag_obj, act_x);
else lv_obj_set_y(drag_obj, act_y);
} }
lv_area_t coord_new;
lv_obj_get_coords(drag_obj, &coord_new); lv_area_t child_box;
lv_obj_get_children_box(target_obj, &child_box);
if((target_obj->scroll.y < 0 && child_box.y2 > target_obj->coords.y2) &&
(proc->types.pointer.drag_throw_vect.x != 0 || proc->types.pointer.drag_throw_vect.y != 0)) {
/*Get the coordinates and modify them*/
if(scrollable) {
if(target_obj->scroll.y + proc->types.pointer.drag_throw_vect.y > 0) {
proc->types.pointer.drag_throw_vect.y = 0;
lv_obj_scroll_to_y(target_obj, 0, LV_ANIM_OFF);
}
if(child_box.y2 + proc->types.pointer.drag_throw_vect.y < target_obj->coords.y2) {
proc->types.pointer.drag_throw_vect.y = 0;
lv_obj_scroll_by(target_obj, 0, -(child_box.y2 - target_obj->coords.y2), LV_ANIM_OFF);
}
lv_obj_scroll_by(target_obj, proc->types.pointer.drag_throw_vect.x, proc->types.pointer.drag_throw_vect.y);
} else {
lv_area_t coords_ori;
lv_obj_get_coords(target_obj, &coords_ori);
lv_coord_t act_x = lv_obj_get_x(target_obj) + proc->types.pointer.drag_throw_vect.x;
lv_coord_t act_y = lv_obj_get_y(target_obj) + proc->types.pointer.drag_throw_vect.y;
lv_obj_set_pos(target_obj, act_x, act_y);
lv_area_t coords_new;
lv_obj_get_coords(target_obj, &coords_new);
/*If non of the coordinates are changed then do not continue throwing*/ /*If non of the coordinates are changed then do not continue throwing*/
if((coords_ori.x1 == coord_new.x1 || proc->types.pointer.drag_throw_vect.x == 0) && if((coords_ori.x1 == coords_new.x1 || proc->types.pointer.drag_throw_vect.x == 0) &&
(coords_ori.y1 == coord_new.y1 || proc->types.pointer.drag_throw_vect.y == 0)) { (coords_ori.y1 == coords_new.y1 || proc->types.pointer.drag_throw_vect.y == 0)) {
proc->types.pointer.drag_in_prog = 0; proc->types.pointer.drag_in_prog = 0;
proc->types.pointer.vect.x = 0; proc->types.pointer.vect.x = 0;
proc->types.pointer.vect.y = 0; proc->types.pointer.vect.y = 0;
proc->types.pointer.drag_throw_vect.x = 0; proc->types.pointer.drag_throw_vect.x = 0;
proc->types.pointer.drag_throw_vect.y = 0; proc->types.pointer.drag_throw_vect.y = 0;
drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_END, indev_act); target_obj->signal_cb(target_obj, LV_SIGNAL_DRAG_END, indev_act);
if(indev_reset_check(proc)) return; if(indev_reset_check(proc)) return;
lv_event_send(drag_obj, LV_EVENT_DRAG_END, NULL); lv_event_send(target_obj, LV_EVENT_DRAG_END, NULL);
if(indev_reset_check(proc)) return; if(indev_reset_check(proc)) return;
} }
}
} }
/*If the types.pointer.vectors become 0 -> types.pointer.drag_in_prog = 0 and send a drag end /*If the types.pointer.vectors become 0 -> types.pointer.drag_in_prog = 0 and send a drag end
signal*/ signal*/
else { else {
proc->types.pointer.drag_in_prog = 0; proc->types.pointer.drag_in_prog = 0;
drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_END, indev_act); target_obj->signal_cb(target_obj, scrollable ? LV_SIGNAL_SCROLL_END : LV_SIGNAL_DRAG_END, indev_act);
if(indev_reset_check(proc)) return; if(indev_reset_check(proc)) return;
lv_event_send(drag_obj, LV_EVENT_DRAG_END, NULL); lv_event_send(target_obj, LV_EVENT_DRAG_END, NULL);
if(indev_reset_check(proc)) return; if(indev_reset_check(proc)) return;
} }
} }

View File

@ -1078,7 +1078,7 @@ void lv_obj_scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
obj->scroll.y += y; obj->scroll.y += y;
refresh_children_position(obj, x, y); refresh_children_position(obj, x, y);
lv_signal_send(obj, LV_SIGNAL_SCROLLED, NULL); lv_signal_send(obj, LV_SIGNAL_SCROLL, NULL);
lv_obj_invalidate(obj); lv_obj_invalidate(obj);
} }
/** /**
@ -3890,10 +3890,10 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param)
/*Return 'invalid' if the child change signal is not enabled*/ /*Return 'invalid' if the child change signal is not enabled*/
if(lv_obj_is_protected(obj, LV_PROTECT_CHILD_CHG) != false) res = LV_RES_INV; if(lv_obj_is_protected(obj, LV_PROTECT_CHILD_CHG) != false) res = LV_RES_INV;
} }
else if(sign == LV_SIGNAL_SCROLLED) { else if(sign == LV_SIGNAL_SCROLL) {
} }
else if(sign == LV_SIGNAL_PRESS_LOST || sign == LV_SIGNAL_RELEASED) { else if(sign == LV_SIGNAL_SCROLL_END) {
lv_area_t child_box; lv_area_t child_box;
lv_obj_get_children_box(obj, &child_box); lv_obj_get_children_box(obj, &child_box);
@ -4511,7 +4511,6 @@ static lv_res_t get_scrollbar_area(lv_obj_t * obj, lv_area_t * sbv)
return LV_RES_OK; return LV_RES_OK;
} }
lv_coord_t sb_y = (rem * (child_box.y2 - obj->coords.y2)) / scroll_h; lv_coord_t sb_y = (rem * (child_box.y2 - obj->coords.y2)) / scroll_h;
printf("overflow: sb_h: %d, y: %d\n", sb_h, sb_y);
sbv->y1 = obj->coords.y1 + sb_y; sbv->y1 = obj->coords.y1 + sb_y;
sbv->y2 = sbv->y1 + sb_h; sbv->y2 = sbv->y1 + sb_h;

View File

@ -122,7 +122,6 @@ enum {
/*General signals*/ /*General signals*/
LV_SIGNAL_CLEANUP, /**< Object is being deleted */ LV_SIGNAL_CLEANUP, /**< Object is being deleted */
LV_SIGNAL_CHILD_CHG, /**< Child was removed/added */ LV_SIGNAL_CHILD_CHG, /**< Child was removed/added */
LV_SIGNAL_SCROLLED, /**< Object coordinates/size have changed */
LV_SIGNAL_COORD_CHG, /**< Object coordinates/size have changed */ LV_SIGNAL_COORD_CHG, /**< Object coordinates/size have changed */
LV_SIGNAL_PARENT_SIZE_CHG, /**< Parent's size has changed */ LV_SIGNAL_PARENT_SIZE_CHG, /**< Parent's size has changed */
LV_SIGNAL_STYLE_CHG, /**< Object's style has changed */ LV_SIGNAL_STYLE_CHG, /**< Object's style has changed */
@ -140,6 +139,9 @@ enum {
LV_SIGNAL_RELEASED, /**< User pressed object for a short period of time, then released it. Not called if dragged. */ LV_SIGNAL_RELEASED, /**< User pressed object for a short period of time, then released it. Not called if dragged. */
LV_SIGNAL_LONG_PRESS, /**< Object has been pressed for at least `LV_INDEV_LONG_PRESS_TIME`. Not called if dragged.*/ LV_SIGNAL_LONG_PRESS, /**< Object has been pressed for at least `LV_INDEV_LONG_PRESS_TIME`. Not called if dragged.*/
LV_SIGNAL_LONG_PRESS_REP, /**< Called after `LV_INDEV_LONG_PRESS_TIME` in every `LV_INDEV_LONG_PRESS_REP_TIME` ms. Not called if dragged.*/ LV_SIGNAL_LONG_PRESS_REP, /**< Called after `LV_INDEV_LONG_PRESS_TIME` in every `LV_INDEV_LONG_PRESS_REP_TIME` ms. Not called if dragged.*/
LV_SIGNAL_SCROLL_BEGIN, /**< The scrolling has just begun */
LV_SIGNAL_SCROLL, /**< The object has been scrolled */
LV_SIGNAL_SCROLL_END, /**< The scrolling has ended */
LV_SIGNAL_DRAG_BEGIN, LV_SIGNAL_DRAG_BEGIN,
LV_SIGNAL_DRAG_THROW_BEGIN, LV_SIGNAL_DRAG_THROW_BEGIN,
LV_SIGNAL_DRAG_END, LV_SIGNAL_DRAG_END,

View File

@ -31,7 +31,7 @@
* DEFINES * DEFINES
*********************/ *********************/
/* Draw translucent random colored areas on the invalidated (redrawn) areas*/ /* Draw translucent random colored areas on the invalidated (redrawn) areas*/
#define MASK_AREA_DEBUG 1 #define MASK_AREA_DEBUG 0
/********************** /**********************
* TYPEDEFS * TYPEDEFS