fix(slider): adjusting the left knob too with encoder

https://forum.lvgl.io/t/slider-with-2-knobs-and-encoder-functionality/3770
This commit is contained in:
Gabor Kiss-Vamosi
2020-11-25 10:12:58 +01:00
parent a2535fe6f1
commit 82fdfb34c0
4 changed files with 27 additions and 8 deletions

View File

@@ -16,6 +16,7 @@
- fix(value_str) support Arabic letter connections in value string property - 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(indev) in LV_INDEV_TYPE_BUTTON recognize 1 cycle long presses too
- fix(arc) make arc work with encoder - fix(arc) make arc work with encoder
- fix(slider) adjusting the left knob too with encoder
## v7.7.2 (17.11.2020) ## v7.7.2 (17.11.2020)
### Bugfixes ### Bugfixes

View File

@@ -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); lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar);
if(ext->cur_value == value) return; if(ext->cur_value == value) return;
int16_t new_value; int16_t new_value = value;
new_value = value > ext->max_value ? ext->max_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->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(ext->cur_value == new_value) return;
#if LV_USE_ANIMATION == 0 #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); lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar);
if(ext->start_value == start_value) return; if(ext->start_value == start_value) return;
int16_t new_value; int16_t new_value = start_value;
new_value = start_value > ext->max_value ? ext->max_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 : start_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(ext->start_value == new_value) return;
#if LV_USE_ANIMATION == 0 #if LV_USE_ANIMATION == 0

View File

@@ -81,6 +81,7 @@ lv_obj_t * lv_slider_create(lv_obj_t * par, const lv_obj_t * copy)
/*Initialize the allocated 'ext' */ /*Initialize the allocated 'ext' */
ext->value_to_set = NULL; ext->value_to_set = NULL;
ext->dragging = 0; ext->dragging = 0;
ext->right_knob_focus = 0;
lv_style_list_init(&ext->style_knob); lv_style_list_init(&ext->style_knob);
/*The signal and design functions are not copied so set them here*/ /*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); bool editing = lv_group_get_editing(g);
lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act());
if(indev_type == LV_INDEV_TYPE_ENCODER) { 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 #endif
} }
else if(sign == LV_SIGNAL_FOCUS) {
ext->right_knob_focus = 0;
}
else if(sign == LV_SIGNAL_COORD_CHG) { else if(sign == LV_SIGNAL_COORD_CHG) {
/* The knob size depends on slider size. /* The knob size depends on slider size.
* During the drawing method the ext. size is used by the knob so refresh the ext. 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); char c = *((char *)param);
if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { 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); res = lv_event_send(slider, LV_EVENT_VALUE_CHANGED, NULL);
if(res != LV_RES_OK) return res; if(res != LV_RES_OK) return res;
} }
else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { 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); res = lv_event_send(slider, LV_EVENT_VALUE_CHANGED, NULL);
if(res != LV_RES_OK) return res; if(res != LV_RES_OK) return res;
} }

View File

@@ -49,6 +49,7 @@ typedef struct {
lv_area_t right_knob_area; lv_area_t right_knob_area;
int16_t * value_to_set; /* Which bar value to set */ int16_t * value_to_set; /* Which bar value to set */
uint8_t dragging : 1; /*1: the slider is being dragged*/ 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; } lv_slider_ext_t;
/** Built-in styles of slider*/ /** Built-in styles of slider*/