From 82fdfb34c0e2c1a4f970eaf506661a60e55f9347 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Wed, 25 Nov 2020 10:12:58 +0100 Subject: [PATCH] fix(slider): adjusting the left knob too with encoder https://forum.lvgl.io/t/slider-with-2-knobs-and-encoder-functionality/3770 --- CHANGELOG.md | 1 + src/lv_widgets/lv_bar.c | 13 ++++++++----- src/lv_widgets/lv_slider.c | 20 +++++++++++++++++--- src/lv_widgets/lv_slider.h | 1 + 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84b62abba..8c32b323d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ - fix(value_str) support Arabic letter connections in value string property - fix(indev) in LV_INDEV_TYPE_BUTTON recognize 1 cycle long presses too - fix(arc) make arc work with encoder +- fix(slider) adjusting the left knob too with encoder ## v7.7.2 (17.11.2020) ### Bugfixes diff --git a/src/lv_widgets/lv_bar.c b/src/lv_widgets/lv_bar.c index efd53af91..37112fdce 100644 --- a/src/lv_widgets/lv_bar.c +++ b/src/lv_widgets/lv_bar.c @@ -157,9 +157,11 @@ void lv_bar_set_value(lv_obj_t * bar, int16_t value, lv_anim_enable_t anim) lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); if(ext->cur_value == value) return; - int16_t new_value; - new_value = value > ext->max_value ? ext->max_value : value; + int16_t new_value = value; + new_value = value > ext->max_value ? ext->max_value : new_value; new_value = new_value < ext->min_value ? ext->min_value : new_value; + new_value = new_value < ext->start_value ? ext->start_value : new_value; + if(ext->cur_value == new_value) return; #if LV_USE_ANIMATION == 0 @@ -184,9 +186,10 @@ void lv_bar_set_start_value(lv_obj_t * bar, int16_t start_value, lv_anim_enable_ lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); if(ext->start_value == start_value) return; - int16_t new_value; - new_value = start_value > ext->max_value ? ext->max_value : start_value; - new_value = new_value < ext->min_value ? ext->min_value : start_value; + int16_t new_value = start_value; + new_value = new_value > ext->max_value ? ext->max_value : new_value; + new_value = new_value < ext->min_value ? ext->min_value : new_value; + new_value = new_value > ext->cur_value ? ext->cur_value : new_value; if(ext->start_value == new_value) return; #if LV_USE_ANIMATION == 0 diff --git a/src/lv_widgets/lv_slider.c b/src/lv_widgets/lv_slider.c index 7cc949244..5447d5111 100644 --- a/src/lv_widgets/lv_slider.c +++ b/src/lv_widgets/lv_slider.c @@ -81,6 +81,7 @@ lv_obj_t * lv_slider_create(lv_obj_t * par, const lv_obj_t * copy) /*Initialize the allocated 'ext' */ ext->value_to_set = NULL; ext->dragging = 0; + ext->right_knob_focus = 0; lv_style_list_init(&ext->style_knob); /*The signal and design functions are not copied so set them here*/ @@ -390,11 +391,20 @@ static lv_res_t lv_slider_signal(lv_obj_t * slider, lv_signal_t sign, void * par bool editing = lv_group_get_editing(g); lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); if(indev_type == LV_INDEV_TYPE_ENCODER) { - if(editing) lv_group_set_editing(g, false); + if(editing) { + if(ext->right_knob_focus == 0) ext->right_knob_focus = 1; + else { + ext->right_knob_focus = 0; + lv_group_set_editing(g, false); + } + } } #endif } + else if(sign == LV_SIGNAL_FOCUS) { + ext->right_knob_focus = 0; + } else if(sign == LV_SIGNAL_COORD_CHG) { /* The knob size depends on slider size. * During the drawing method the ext. size is used by the knob so refresh the ext. size.*/ @@ -425,12 +435,16 @@ static lv_res_t lv_slider_signal(lv_obj_t * slider, lv_signal_t sign, void * par char c = *((char *)param); if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { - lv_slider_set_value(slider, lv_slider_get_value(slider) + 1, LV_ANIM_ON); + if(ext->right_knob_focus) lv_slider_set_value(slider, lv_slider_get_value(slider) + 1, LV_ANIM_ON); + else lv_slider_set_left_value(slider, lv_slider_get_left_value(slider) + 1, LV_ANIM_ON); + res = lv_event_send(slider, LV_EVENT_VALUE_CHANGED, NULL); if(res != LV_RES_OK) return res; } else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { - lv_slider_set_value(slider, lv_slider_get_value(slider) - 1, LV_ANIM_ON); + if(ext->right_knob_focus) lv_slider_set_value(slider, lv_slider_get_value(slider) - 1, LV_ANIM_ON); + else lv_slider_set_left_value(slider, lv_slider_get_left_value(slider) - 1, LV_ANIM_ON); + res = lv_event_send(slider, LV_EVENT_VALUE_CHANGED, NULL); if(res != LV_RES_OK) return res; } diff --git a/src/lv_widgets/lv_slider.h b/src/lv_widgets/lv_slider.h index 9012bb4a5..44827409d 100644 --- a/src/lv_widgets/lv_slider.h +++ b/src/lv_widgets/lv_slider.h @@ -49,6 +49,7 @@ typedef struct { lv_area_t right_knob_area; int16_t * value_to_set; /* Which bar value to set */ uint8_t dragging : 1; /*1: the slider is being dragged*/ + uint8_t right_knob_focus :1; /*1: with encoder now the right knob can be adjusted*/ } lv_slider_ext_t; /** Built-in styles of slider*/