diff --git a/docs/src/details/xml/build_ui/events.rst b/docs/src/details/xml/build_ui/events.rst index f119213cf4..abefbb983c 100644 --- a/docs/src/details/xml/build_ui/events.rst +++ b/docs/src/details/xml/build_ui/events.rst @@ -120,9 +120,10 @@ It's possible to set a :ref:`Subject ` value on user interacti - - - + + + + @@ -137,14 +138,18 @@ Incrementing or decrementing a :ref:`Subject ` value can be de - - + + + -The ```` element defines a ``step`` to be added to the subject's current value when the ``trigger`` occurs. -Optionally, ``min`` and/or ``max`` can be set to limit the subject's value. +The ```` element defines a ``step`` to be added to the subject's current value +when the ``trigger`` occurs. Optionally, ``min`` and/or ``max`` can be set to limit the subject's value. + +``subject`` must be an ``int`` or ``float`` subject. If ``step`` is **negative**, the subject's value will be decremented. +Only integer ``step`` values are supported now. **Note:** Only integer subjects are supported by ````. diff --git a/src/others/observer/lv_observer.c b/src/others/observer/lv_observer.c index 44a02da358..9f9d8e71b7 100644 --- a/src/others/observer/lv_observer.c +++ b/src/others/observer/lv_observer.c @@ -45,6 +45,11 @@ typedef struct { int32_t value; } subject_set_int_user_data_t; +typedef struct { + lv_subject_t * subject; + float value; +} subject_set_float_user_data_t; + typedef struct { lv_subject_t * subject; const char * value; @@ -63,6 +68,11 @@ typedef struct { **********************/ static void subject_set_int_cb(lv_event_t * e); + +#if LV_USE_FLOAT + static void subject_set_float_cb(lv_event_t * e); +#endif + static void subject_set_string_cb(lv_event_t * e); static void subject_increment_cb(lv_event_t * e); @@ -574,6 +584,24 @@ void lv_obj_add_subject_set_int_event(lv_obj_t * obj, lv_subject_t * subject, lv lv_obj_add_event_cb(obj, free_user_data_event_cb, LV_EVENT_DELETE, user_data); } +#if LV_USE_FLOAT +void lv_obj_add_subject_set_float_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger, float value) +{ + subject_set_float_user_data_t * user_data = lv_malloc(sizeof(subject_set_float_user_data_t)); + if(user_data == NULL) { + LV_ASSERT_MALLOC(user_data); + LV_LOG_WARN("Couldn't allocate user_data"); + return; + } + + user_data->subject = subject; + user_data->value = value; + + lv_obj_add_event_cb(obj, subject_set_float_cb, trigger, user_data); + lv_obj_add_event_cb(obj, free_user_data_event_cb, LV_EVENT_DELETE, user_data); +} +#endif /*LV_USE_FLOAT*/ + void lv_obj_add_subject_set_string_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger, const char * value) { @@ -846,6 +874,14 @@ static void subject_set_int_cb(lv_event_t * e) lv_subject_set_int(user_data->subject, user_data->value); } +#if LV_USE_FLOAT +static void subject_set_float_cb(lv_event_t * e) +{ + subject_set_float_user_data_t * user_data = lv_event_get_user_data(e); + lv_subject_set_float(user_data->subject, user_data->value); +} +#endif + static void subject_set_string_cb(lv_event_t * e) { subject_set_string_user_data_t * user_data = lv_event_get_user_data(e); @@ -855,12 +891,22 @@ static void subject_set_string_cb(lv_event_t * e) static void subject_increment_cb(lv_event_t * e) { subject_increment_user_data_t * user_data = lv_event_get_user_data(e); - int32_t value = lv_subject_get_int(user_data->subject); - value += user_data->step; - value = LV_CLAMP(user_data->min, value, user_data->max); - lv_subject_set_int(user_data->subject, value); + if(user_data->subject->type == LV_SUBJECT_TYPE_INT) { + int32_t value = lv_subject_get_int(user_data->subject); + value += user_data->step; + value = LV_CLAMP(user_data->min, value, user_data->max); + lv_subject_set_int(user_data->subject, value); + } +#if LV_USE_FLOAT + else if(user_data->subject->type == LV_SUBJECT_TYPE_FLOAT) { + float value = lv_subject_get_float(user_data->subject); + value += (float)user_data->step; + value = LV_CLAMP(user_data->min, value, user_data->max); + lv_subject_set_float(user_data->subject, (float)value); + } +#endif } diff --git a/src/others/observer/lv_observer.h b/src/others/observer/lv_observer.h index f5cb132e93..1ce17c45d4 100644 --- a/src/others/observer/lv_observer.h +++ b/src/others/observer/lv_observer.h @@ -363,6 +363,18 @@ void lv_obj_add_subject_increment_event(lv_obj_t * obj, lv_subject_t * subject, */ void lv_obj_add_subject_set_int_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger, int32_t value); + +#if LV_USE_FLOAT +/** + * Set the value of a float subject. + * @param obj pointer to a widget + * @param subject pointer to a subject to change + * @param trigger the trigger on which the subject should be changed + * @param value the value to set + */ +void lv_obj_add_subject_set_float_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger, float value); +#endif + /** * Set the value of a string subject. * @param obj pointer to a widget diff --git a/src/others/xml/lv_xml.c b/src/others/xml/lv_xml.c index 2a8e7af8c9..fe8ba8ba9e 100644 --- a/src/others/xml/lv_xml.c +++ b/src/others/xml/lv_xml.c @@ -117,6 +117,7 @@ void lv_xml_init(void) lv_xml_widget_register("lv_obj-event_cb", lv_obj_xml_event_cb_create, lv_obj_xml_event_cb_apply); lv_xml_widget_register("lv_obj-subject_set_int_event", lv_obj_xml_subject_set_create, lv_obj_xml_subject_set_apply); + lv_xml_widget_register("lv_obj-subject_set_float_event", lv_obj_xml_subject_set_create, lv_obj_xml_subject_set_apply); lv_xml_widget_register("lv_obj-subject_set_string_event", lv_obj_xml_subject_set_create, lv_obj_xml_subject_set_apply); lv_xml_widget_register("lv_obj-subject_increment_event", lv_obj_xml_subject_increment_create, lv_obj_xml_subject_increment_apply); diff --git a/src/others/xml/parsers/lv_xml_obj_parser.c b/src/others/xml/parsers/lv_xml_obj_parser.c index 5fe8ab64e5..79dfe1e9cf 100644 --- a/src/others/xml/parsers/lv_xml_obj_parser.c +++ b/src/others/xml/parsers/lv_xml_obj_parser.c @@ -279,8 +279,25 @@ void lv_obj_xml_subject_set_apply(lv_xml_parser_state_t * state, const char ** a { /*If the tag_name is */ - bool int_subject = lv_streq(state->tag_name, "lv_obj-subject_set_int") || - lv_streq(state->tag_name, "subject_set_int"); + lv_subject_type_t subject_type = LV_SUBJECT_TYPE_NONE; + if(lv_streq(state->tag_name, "lv_obj-subject_set_int_event") || + lv_streq(state->tag_name, "subject_set_int_event")) { + subject_type = LV_SUBJECT_TYPE_INT; + } +#if LV_USE_FLOAT + else if(lv_streq(state->tag_name, "lv_obj-subject_set_float_event") || + lv_streq(state->tag_name, "subject_set_float_event")) { + subject_type = LV_SUBJECT_TYPE_FLOAT; + } +#endif + else if(lv_streq(state->tag_name, "lv_obj-subject_set_string_event") || + lv_streq(state->tag_name, "subject_set_string_event")) { + subject_type = LV_SUBJECT_TYPE_STRING; + } + else { + LV_LOG_WARN("`%s` is not supported in ", state->tag_name); + return; + } const char * subject_str = lv_xml_get_value_of(attrs, "subject"); const char * trigger_str = lv_xml_get_value_of(attrs, "trigger"); @@ -309,18 +326,23 @@ void lv_obj_xml_subject_set_apply(lv_xml_parser_state_t * state, const char ** a return; } - bool type_ok = (subject->type == LV_SUBJECT_TYPE_INT && int_subject) || - (subject->type == LV_SUBJECT_TYPE_STRING && !int_subject); - if(!type_ok) { + if(subject->type != subject_type) { LV_LOG_WARN("`%s` subject has incorrect type in ", subject_str); return; } void * item = lv_xml_state_get_item(state); - if(int_subject) { + if(subject_type == LV_SUBJECT_TYPE_INT) { lv_obj_add_subject_set_int_event(item, subject, trigger, lv_xml_atoi(value_str)); } - else { + else if(subject_type == LV_SUBJECT_TYPE_FLOAT) { +#if LV_USE_FLOAT + lv_obj_add_subject_set_float_event(item, subject, trigger, lv_xml_atof(value_str)); +#else + LV_LOG_ERROR("Tried to add a subject of type float but LV_USE_FLOAT is not enabled"); +#endif + } + else if(subject_type == LV_SUBJECT_TYPE_STRING) { lv_obj_add_subject_set_string_event(item, subject, trigger, value_str); } } @@ -345,10 +367,7 @@ void lv_obj_xml_subject_increment_apply(lv_xml_parser_state_t * state, const cha return; } - if(step_str == NULL) { - LV_LOG_WARN("`value` is missing in "); - return; - } + if(step_str == NULL) step_str = "1"; lv_event_code_t trigger = LV_EVENT_CLICKED; if(trigger_str) trigger = lv_xml_trigger_text_to_enum_value(trigger_str); @@ -363,14 +382,14 @@ void lv_obj_xml_subject_increment_apply(lv_xml_parser_state_t * state, const cha return; } - if(subject->type != LV_SUBJECT_TYPE_INT) { + if(subject->type != LV_SUBJECT_TYPE_INT && subject->type != LV_SUBJECT_TYPE_FLOAT) { LV_LOG_WARN("`%s` subject should have integer type in ", subject_str); return; } void * item = lv_xml_state_get_item(state); - int32_t step = step_str ? lv_xml_atoi(step_str) : 1; + int32_t step = lv_xml_atoi(step_str); int32_t min_v = min_str ? lv_xml_atoi(min_str) : INT32_MIN; int32_t max_v = max_str ? lv_xml_atoi(max_str) : INT32_MAX; lv_obj_add_subject_increment_event(item, subject, trigger, step, min_v, max_v); diff --git a/xmls/lv_obj.xml b/xmls/lv_obj.xml index 8895707e97..277dd9b68f 100644 --- a/xmls/lv_obj.xml +++ b/xmls/lv_obj.xml @@ -81,14 +81,12 @@ Example - -