From dd588dd56d6c6d2ed504eb10eb29ff922ebf711d Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 23 Feb 2021 09:28:18 +0100 Subject: [PATCH] minor fixes --- src/lv_core/lv_indev_scroll.c | 2 +- src/lv_core/lv_obj_draw.h | 2 +- src/lv_core/lv_obj_scroll.c | 24 ++++++++++++++++-------- src/lv_hal/lv_hal_indev.c | 4 ++-- src/lv_hal/lv_hal_indev.h | 4 ++-- src/lv_widgets/lv_slider.c | 31 ++++++++++++++++++++++++++----- 6 files changed, 48 insertions(+), 19 deletions(-) diff --git a/src/lv_core/lv_indev_scroll.c b/src/lv_core/lv_indev_scroll.c index 80fcf9a98..0950e243c 100644 --- a/src/lv_core/lv_indev_scroll.c +++ b/src/lv_core/lv_indev_scroll.c @@ -86,7 +86,7 @@ void _lv_indev_scroll_handler(lv_indev_proc_t * proc) /*Respect the scroll limit area*/ scroll_limit_diff(proc, &diff_x, &diff_y); - _lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y); + lv_obj_scroll_by(scroll_obj, diff_x, diff_y, LV_ANIM_OFF); proc->types.pointer.scroll_sum.x += diff_x; proc->types.pointer.scroll_sum.y += diff_y; } diff --git a/src/lv_core/lv_obj_draw.h b/src/lv_core/lv_obj_draw.h index b8cab00a3..57918ab64 100644 --- a/src/lv_core/lv_obj_draw.h +++ b/src/lv_core/lv_obj_draw.h @@ -36,7 +36,7 @@ typedef enum { typedef struct { - const lv_area_t * draw_area; + lv_area_t * draw_area; const lv_area_t * clip_area; lv_draw_rect_dsc_t * rect_dsc; lv_draw_label_dsc_t * label_dsc; diff --git a/src/lv_core/lv_obj_scroll.c b/src/lv_core/lv_obj_scroll.c index 5587bb2c4..cc8dae145 100644 --- a/src/lv_core/lv_obj_scroll.c +++ b/src/lv_core/lv_obj_scroll.c @@ -347,23 +347,25 @@ void lv_obj_scroll_to_view(lv_obj_t * obj, lv_anim_enable_t anim_en) { lv_obj_t * parent = lv_obj_get_parent(obj); - lv_coord_t pleft = lv_obj_get_style_pad_left(parent, LV_PART_MAIN); - lv_coord_t pright = lv_obj_get_style_pad_right(parent, LV_PART_MAIN); - lv_coord_t ptop = lv_obj_get_style_pad_top(parent, LV_PART_MAIN); - lv_coord_t pbottom = lv_obj_get_style_pad_bottom(parent, LV_PART_MAIN); + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(parent); + - lv_coord_t left_diff = parent->coords.x1 + pleft - obj->coords.x1; - lv_coord_t right_diff = -(parent->coords.x2 - pright - obj->coords.x2); - lv_coord_t top_diff = parent->coords.y1 + ptop - obj->coords.y1; - lv_coord_t bottom_diff = -(parent->coords.y2 - pbottom - obj->coords.y2); lv_coord_t y_scroll = 0; + lv_coord_t ptop = lv_obj_get_style_pad_top(parent, LV_PART_MAIN); + lv_coord_t pbottom = lv_obj_get_style_pad_bottom(parent, LV_PART_MAIN); + lv_coord_t top_diff = parent->coords.y1 + ptop - obj->coords.y1; + lv_coord_t bottom_diff = -(parent->coords.y2 - pbottom - obj->coords.y2); if((top_diff > 0 || bottom_diff > 0)) { if(LV_ABS(top_diff) < LV_ABS(bottom_diff)) y_scroll = top_diff; else y_scroll = -bottom_diff; } lv_coord_t x_scroll = 0; + lv_coord_t pleft = lv_obj_get_style_pad_left(parent, LV_PART_MAIN); + lv_coord_t pright = lv_obj_get_style_pad_right(parent, LV_PART_MAIN); + lv_coord_t left_diff = parent->coords.x1 + pleft - obj->coords.x1; + lv_coord_t right_diff = -(parent->coords.x2 - pright - obj->coords.x2); if((left_diff > 0 || right_diff > 0)) { if(LV_ABS(left_diff) < LV_ABS(right_diff)) x_scroll = left_diff; else x_scroll = -right_diff; @@ -373,6 +375,11 @@ void lv_obj_scroll_to_view(lv_obj_t * obj, lv_anim_enable_t anim_en) lv_anim_del(parent, (lv_anim_exec_xcb_t)scroll_anim_x_cb); lv_anim_del(parent, (lv_anim_exec_xcb_t)scroll_anim_y_cb); + if((scroll_dir & LV_DIR_LEFT) == 0 && x_scroll < 0) x_scroll = 0; + if((scroll_dir & LV_DIR_RIGHT) == 0 && x_scroll > 0) x_scroll = 0; + if((scroll_dir & LV_DIR_TOP) == 0 && y_scroll < 0) y_scroll = 0; + if((scroll_dir & LV_DIR_BOTTOM) == 0 && y_scroll > 0) y_scroll = 0; + lv_obj_scroll_by(parent, x_scroll, y_scroll, anim_en); } @@ -397,6 +404,7 @@ static void scroll_anim_x_cb(lv_obj_t * obj, lv_anim_value_t v) static void scroll_anim_y_cb(lv_obj_t * obj, lv_anim_value_t v) { + printf("scrl_anim %d\n", v); _lv_obj_scroll_by_raw(obj, 0, v + lv_obj_get_scroll_y(obj)); } diff --git a/src/lv_hal/lv_hal_indev.c b/src/lv_hal/lv_hal_indev.c index 176adcabc..c55e201fe 100644 --- a/src/lv_hal/lv_hal_indev.c +++ b/src/lv_hal/lv_hal_indev.c @@ -55,8 +55,8 @@ void lv_indev_drv_init(lv_indev_drv_t * driver) lv_memset_00(driver, sizeof(lv_indev_drv_t)); driver->type = LV_INDEV_TYPE_NONE; - driver->scroll_limit = LV_INDEV_DEF_DRAG_LIMIT; - driver->scroll_throw = LV_INDEV_DEF_DRAG_THROW; + driver->scroll_limit = LV_INDEV_DEF_SCROLL_LIMIT; + driver->scroll_throw = 3;//LV_INDEV_DEF_SCROLL_THROW; driver->long_press_time = LV_INDEV_DEF_LONG_PRESS_TIME; driver->long_press_rep_time = LV_INDEV_DEF_LONG_PRESS_REP_TIME; driver->gesture_limit = LV_INDEV_DEF_GESTURE_LIMIT; diff --git a/src/lv_hal/lv_hal_indev.h b/src/lv_hal/lv_hal_indev.h index 86db51649..0ee62d720 100644 --- a/src/lv_hal/lv_hal_indev.h +++ b/src/lv_hal/lv_hal_indev.h @@ -27,10 +27,10 @@ extern "C" { *********************/ /* Drag threshold in pixels */ -#define LV_INDEV_DEF_DRAG_LIMIT 10 +#define LV_INDEV_DEF_SCROLL_LIMIT 10 /* Drag throw slow-down in [%]. Greater value -> faster slow-down */ -#define LV_INDEV_DEF_DRAG_THROW 10 +#define LV_INDEV_DEF_SCROLL_THROW 10 /* Long press time in milliseconds. * Time to send `LV_EVENT_LONG_PRESSSED`) */ diff --git a/src/lv_widgets/lv_slider.c b/src/lv_widgets/lv_slider.c index 41283ee6c..83732550c 100644 --- a/src/lv_widgets/lv_slider.c +++ b/src/lv_widgets/lv_slider.c @@ -378,10 +378,26 @@ static void draw_knob(lv_obj_t * obj, const lv_area_t * clip_area) position_knob(obj, &knob_area, knob_size, hor); lv_area_copy(&slider->right_knob_area, &knob_area); - /*Handle custom drawer*/ - lv_draw_rect(&slider->right_knob_area, clip_area, &knob_rect_dsc); + lv_obj_draw_hook_dsc_t hook_dsc; + lv_obj_draw_hook_dsc_init(&hook_dsc, clip_area); + hook_dsc.part = LV_PART_KNOB; + hook_dsc.sub_part_id = 0; + hook_dsc.draw_area = &slider->right_knob_area; + hook_dsc.rect_dsc = &knob_rect_dsc; + + if(lv_slider_get_type(obj) != LV_SLIDER_TYPE_RANGE) { + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &hook_dsc); + lv_draw_rect(&slider->right_knob_area, clip_area, &knob_rect_dsc); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &hook_dsc); + } else { + /*Save the draw dsc. because it can be modified in the hook*/ + lv_draw_rect_dsc_t knob_rect_dsc_tmp; + lv_memcpy(&knob_rect_dsc_tmp, &knob_rect_dsc, sizeof(lv_draw_rect_dsc_t)); + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &hook_dsc); + lv_draw_rect(&slider->right_knob_area, clip_area, &knob_rect_dsc); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &hook_dsc); - if(lv_slider_get_type(obj) == LV_SLIDER_TYPE_RANGE) { /* Draw a second knob for the start_value side */ if(hor) { knob_area.x1 = LV_SLIDER_KNOB_COORD(hor, base_dir != LV_BIDI_DIR_RTL, slider->bar.indic_area); @@ -390,11 +406,16 @@ static void draw_knob(lv_obj_t * obj, const lv_area_t * clip_area) knob_area.y1 = slider->bar.indic_area.y2; } position_knob(obj, &knob_area, knob_size, hor); - lv_area_copy(&slider->left_knob_area, &knob_area); - /*Draw the knob if the custom drawer allows it*/ + lv_memcpy(&knob_rect_dsc, &knob_rect_dsc_tmp, sizeof(lv_draw_rect_dsc_t)); + hook_dsc.draw_area = &slider->left_knob_area; + hook_dsc.rect_dsc = &knob_rect_dsc; + hook_dsc.sub_part_id = 1; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &hook_dsc); lv_draw_rect(&slider->left_knob_area, clip_area, &knob_rect_dsc); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &hook_dsc); } }