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:
parent
d813bbe5e2
commit
9cfd399fb3
@ -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) {
|
||||||
|
case LV_DRAG_DIR_HOR:
|
||||||
|
proc->types.pointer.drag_throw_vect.y = 0;
|
||||||
|
break;
|
||||||
|
case LV_DRAG_DIR_VER:
|
||||||
|
proc->types.pointer.drag_throw_vect.x = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
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*/
|
/*Get the coordinates and modify them*/
|
||||||
lv_area_t coords_ori;
|
if(scrollable) {
|
||||||
lv_obj_get_coords(drag_obj, &coords_ori);
|
if(target_obj->scroll.y + proc->types.pointer.drag_throw_vect.y > 0) {
|
||||||
lv_coord_t act_x = lv_obj_get_x(drag_obj) + proc->types.pointer.drag_throw_vect.x;
|
proc->types.pointer.drag_throw_vect.y = 0;
|
||||||
lv_coord_t act_y = lv_obj_get_y(drag_obj) + proc->types.pointer.drag_throw_vect.y;
|
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((coords_ori.x1 == coords_new.x1 || proc->types.pointer.drag_throw_vect.x == 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.vect.x = 0;
|
||||||
|
proc->types.pointer.vect.y = 0;
|
||||||
|
proc->types.pointer.drag_throw_vect.x = 0;
|
||||||
|
proc->types.pointer.drag_throw_vect.y = 0;
|
||||||
|
target_obj->signal_cb(target_obj, LV_SIGNAL_DRAG_END, indev_act);
|
||||||
|
if(indev_reset_check(proc)) return;
|
||||||
|
|
||||||
|
lv_event_send(target_obj, LV_EVENT_DRAG_END, NULL);
|
||||||
|
if(indev_reset_check(proc)) return;
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
/*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) &&
|
|
||||||
(coords_ori.y1 == coord_new.y1 || proc->types.pointer.drag_throw_vect.y == 0)) {
|
|
||||||
proc->types.pointer.drag_in_prog = 0;
|
|
||||||
proc->types.pointer.vect.x = 0;
|
|
||||||
proc->types.pointer.vect.y = 0;
|
|
||||||
proc->types.pointer.drag_throw_vect.x = 0;
|
|
||||||
proc->types.pointer.drag_throw_vect.y = 0;
|
|
||||||
drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_END, indev_act);
|
|
||||||
if(indev_reset_check(proc)) return;
|
|
||||||
|
|
||||||
lv_event_send(drag_obj, LV_EVENT_DRAG_END, NULL);
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user