From a6f3ed8102e6bcfb56307d3d87116794e5c08594 Mon Sep 17 00:00:00 2001 From: skypoldo <62655436+skypoldo@users.noreply.github.com> Date: Wed, 25 Mar 2020 16:17:01 +0100 Subject: [PATCH 1/5] Added rollover function to spinbox The rollover functionalty allows the spinbox to turn aound the range of values. Increasing over maximum values restarts from minimum value. Decreasing below minimum value restarts fro maximum value. --- src/lv_objx/lv_spinbox.c | 39 +++++++++++++++++++++++++++++++++++++-- src/lv_objx/lv_spinbox.h | 14 ++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/lv_objx/lv_spinbox.c b/src/lv_objx/lv_spinbox.c index 6873085a2..58c5fb9d6 100644 --- a/src/lv_objx/lv_spinbox.c +++ b/src/lv_objx/lv_spinbox.c @@ -73,6 +73,7 @@ lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy) ext->step = 1; ext->range_max = 99999; ext->range_min = -99999; + ext->rollover = false; lv_ta_set_cursor_type(new_spinbox, LV_CURSOR_BLOCK); lv_ta_set_one_line(new_spinbox, true); @@ -116,6 +117,20 @@ lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy) * Setter functions *====================*/ +/** + * Set spinbox rollover function + * @param spinbox pointer to spinbox + * @param b true or false to enable or disable (default) + */ +void lv_spinbox_set_rollover(lv_obj_t * spinbox, bool b) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); + if(ext == NULL) return; + + ext->rollover = b; +} + /** * Set spinbox value * @param spinbox pointer to spinbox @@ -219,6 +234,18 @@ void lv_spinbox_set_padding_left(lv_obj_t * spinbox, uint8_t padding) * Getter functions *====================*/ +/** + * Get spinbox rollover function status + * @param spinbox pointer to spinbox + */ +bool lv_spinbox_get_rollover(lv_obj_t * spinbox) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); + + return ext->rollover; +} + /** * Get the spinbox numeral value (user has to convert to float according to its digit format) * @param spinbox pointer to spinbox @@ -289,7 +316,11 @@ void lv_spinbox_increment(lv_obj_t * spinbox) ext->value += ext->step; } else { - ext->value = ext->range_max; + // Rollover? + if (ext->rollover) + ext->value = ext->range_min + ext->step - 1; + else + ext->value = ext->range_max; } lv_spinbox_updatevalue(spinbox); @@ -310,7 +341,11 @@ void lv_spinbox_decrement(lv_obj_t * spinbox) if((ext->value - ext->step) < 0 && ext->value > 0) ext->value = -ext->value; ext->value -= ext->step; } else { - ext->value = ext->range_min; + // Rollover? + if (ext->rollover) + ext->value = ext->range_max - ext->step + 1; + else + ext->value = ext->range_min; } lv_spinbox_updatevalue(spinbox); diff --git a/src/lv_objx/lv_spinbox.h b/src/lv_objx/lv_spinbox.h index ea60169e3..bab9e5a38 100644 --- a/src/lv_objx/lv_spinbox.h +++ b/src/lv_objx/lv_spinbox.h @@ -47,6 +47,7 @@ typedef struct int32_t range_max; int32_t range_min; int32_t step; + bool rollover; // Set to true for rollover functionality uint16_t digit_count : 4; uint16_t dec_point_pos : 4; /*if 0, there is no separator and the number is an integer*/ uint16_t digit_padding_left : 4; @@ -76,6 +77,13 @@ lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy); * Setter functions *====================*/ +/** + * Set spinbox rollover function + * @param spinbox pointer to spinbox + * @param b true or false to enable or disable (default) + */ +void lv_spinbox_set_rollover(lv_obj_t * spinbox, bool b); + /** * Set a style of a spinbox. * @param templ pointer to template object @@ -129,6 +137,12 @@ void lv_spinbox_set_padding_left(lv_obj_t * spinbox, uint8_t padding); * Getter functions *====================*/ +/** + * Get spinbox rollover function status + * @param spinbox pointer to spinbox + */ +bool lv_spinbox_get_rollover(lv_obj_t * spinbox); + /** * Get style of a spinbox. * @param templ pointer to template object From 3ab2d8470b63d1aa5db9c697ad4c0378a80637ab Mon Sep 17 00:00:00 2001 From: paolog <62655436+skypoldo@users.noreply.github.com> Date: Wed, 25 Mar 2020 17:36:33 +0100 Subject: [PATCH 2/5] Changed rollover field type --- src/lv_objx/lv_spinbox.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lv_objx/lv_spinbox.h b/src/lv_objx/lv_spinbox.h index bab9e5a38..d9d6f661d 100644 --- a/src/lv_objx/lv_spinbox.h +++ b/src/lv_objx/lv_spinbox.h @@ -47,7 +47,7 @@ typedef struct int32_t range_max; int32_t range_min; int32_t step; - bool rollover; // Set to true for rollover functionality + uint8_t rollover : 1; // Set to true for rollover functionality uint16_t digit_count : 4; uint16_t dec_point_pos : 4; /*if 0, there is no separator and the number is an integer*/ uint16_t digit_padding_left : 4; From f8d67a4968acbf3ef5979d1548350f6108b2a168 Mon Sep 17 00:00:00 2001 From: paolog <62655436+skypoldo@users.noreply.github.com> Date: Wed, 25 Mar 2020 17:37:36 +0100 Subject: [PATCH 3/5] Removed NULL check --- src/lv_objx/lv_spinbox.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lv_objx/lv_spinbox.c b/src/lv_objx/lv_spinbox.c index 58c5fb9d6..f3691ab80 100644 --- a/src/lv_objx/lv_spinbox.c +++ b/src/lv_objx/lv_spinbox.c @@ -126,7 +126,6 @@ void lv_spinbox_set_rollover(lv_obj_t * spinbox, bool b) { LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); - if(ext == NULL) return; ext->rollover = b; } From a049df2db63d2287595b96e27d0d8edbd9886995 Mon Sep 17 00:00:00 2001 From: paolog <62655436+skypoldo@users.noreply.github.com> Date: Wed, 25 Mar 2020 20:50:21 +0100 Subject: [PATCH 4/5] Copy rollover extra field Added copy of the new extra field when creating a new spinbox copying an existing one --- src/lv_objx/lv_spinbox.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lv_objx/lv_spinbox.c b/src/lv_objx/lv_spinbox.c index f3691ab80..a09d620ca 100644 --- a/src/lv_objx/lv_spinbox.c +++ b/src/lv_objx/lv_spinbox.c @@ -101,6 +101,7 @@ lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy) lv_spinbox_set_digit_format(new_spinbox, (uint8_t)copy_ext->digit_count, (uint8_t)copy_ext->dec_point_pos); lv_spinbox_set_range(new_spinbox, copy_ext->range_min, copy_ext->range_max); lv_spinbox_set_step(new_spinbox, copy_ext->step); + lv_spinbox_set_rollover(new_spinbox, copy_ext->rollover); /*Refresh the style with new signal function*/ lv_obj_refresh_style(new_spinbox); From adcfd69f358b951c85a1c71c698cd4e074e3874d Mon Sep 17 00:00:00 2001 From: skypoldo <62655436+skypoldo@users.noreply.github.com> Date: Tue, 31 Mar 2020 17:39:20 +0200 Subject: [PATCH 5/5] Update lv_spinbox.c Rollover functionakity changed. Increase: if new value is over max, set to max first, then reset to minimum Decrease: if new value is below min, set to min first, then reset to maximum --- src/lv_objx/lv_spinbox.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lv_objx/lv_spinbox.c b/src/lv_objx/lv_spinbox.c index a09d620ca..7f9fbbe86 100644 --- a/src/lv_objx/lv_spinbox.c +++ b/src/lv_objx/lv_spinbox.c @@ -317,8 +317,8 @@ void lv_spinbox_increment(lv_obj_t * spinbox) } else { // Rollover? - if (ext->rollover) - ext->value = ext->range_min + ext->step - 1; + if ((ext->rollover) && (ext->value == ext->range_max)) + ext->value = ext->range_min; else ext->value = ext->range_max; } @@ -342,8 +342,8 @@ void lv_spinbox_decrement(lv_obj_t * spinbox) ext->value -= ext->step; } else { // Rollover? - if (ext->rollover) - ext->value = ext->range_max - ext->step + 1; + if ((ext->rollover) && (ext->value == ext->range_min)) + ext->value = ext->range_max; else ext->value = ext->range_min; }