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;
|
||||
|
||||
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;
|
||||
|
||||
/*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;
|
||||
|
||||
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*/
|
||||
if(lv_obj_get_drag_throw(drag_obj) == false) {
|
||||
proc->types.pointer.drag_in_prog = 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);
|
||||
return;
|
||||
}
|
||||
|
||||
lv_drag_dir_t allowed_dirs = lv_obj_get_drag_dir(drag_obj);
|
||||
// if(lv_obj_get_drag_throw(target_obj) == false) {
|
||||
// proc->types.pointer.drag_in_prog = 0;
|
||||
// target_obj->signal_cb(target_obj, scrollable ? LV_SIGNAL_SCROLL_END : LV_SIGNAL_DRAG_END, indev_act);
|
||||
// if(indev_reset_check(proc)) return;
|
||||
//
|
||||
// lv_event_send(target_obj, LV_EVENT_DRAG_END, NULL);
|
||||
// return;
|
||||
// }
|
||||
|
||||
/*Reduce the vectors*/
|
||||
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 * (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) {
|
||||
/*Get the coordinates and modify them*/
|
||||
lv_area_t coords_ori;
|
||||
lv_obj_get_coords(drag_obj, &coords_ori);
|
||||
lv_coord_t act_x = lv_obj_get_x(drag_obj) + proc->types.pointer.drag_throw_vect.x;
|
||||
lv_coord_t act_y = lv_obj_get_y(drag_obj) + proc->types.pointer.drag_throw_vect.y;
|
||||
|
||||
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);
|
||||
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 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((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)) {
|
||||
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;
|
||||
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;
|
||||
|
||||
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 the types.pointer.vectors become 0 -> types.pointer.drag_in_prog = 0 and send a drag end
|
||||
signal*/
|
||||
else {
|
||||
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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
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);
|
||||
}
|
||||
/**
|
||||
@ -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*/
|
||||
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_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;
|
||||
}
|
||||
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->y2 = sbv->y1 + sb_h;
|
||||
|
@ -122,7 +122,6 @@ enum {
|
||||
/*General signals*/
|
||||
LV_SIGNAL_CLEANUP, /**< Object is being deleted */
|
||||
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_PARENT_SIZE_CHG, /**< Parent's size 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_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_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_THROW_BEGIN,
|
||||
LV_SIGNAL_DRAG_END,
|
||||
|
@ -31,7 +31,7 @@
|
||||
* DEFINES
|
||||
*********************/
|
||||
/* Draw translucent random colored areas on the invalidated (redrawn) areas*/
|
||||
#define MASK_AREA_DEBUG 1
|
||||
#define MASK_AREA_DEBUG 0
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
|
Loading…
x
Reference in New Issue
Block a user