diff --git a/lv_conf_checker.h b/lv_conf_checker.h index b818dd1c8..f899fa568 100644 --- a/lv_conf_checker.h +++ b/lv_conf_checker.h @@ -61,7 +61,7 @@ #endif #if LV_MEM_CUSTOM == 0 #ifndef LV_MEM_SIZE -# define LV_MEM_SIZE (16U * 1024U) /*Size memory used by `lv_mem_alloc` in bytes (>= 2kB)*/ +# define LV_MEM_SIZE (32U * 1024U) /*Size memory used by `lv_mem_alloc` in bytes (>= 2kB)*/ #endif #ifndef LV_MEM_ATTR # define LV_MEM_ATTR /*Complier prefix for big array declaration*/ diff --git a/lv_conf_templ.h b/lv_conf_templ.h index f43efeda6..fb60dbe3a 100644 --- a/lv_conf_templ.h +++ b/lv_conf_templ.h @@ -182,8 +182,7 @@ typedef void * lv_indev_drv_user_data_t; /*Type of user data in t /*=================== * LV_OBJ SETTINGS *==================*/ -#define LV_OBJ_FREE_NUM_TYPE uint32_t /*Type of free number attribute (comment out disable free number)*/ -#define LV_OBJ_FREE_PTR 1 /*Enable the free pointer attribute*/ +typedef void * lv_obj_user_data_t; /*Declare the type of the user data of object (can be e.g. `void *`, `int`, `struct`)*/ #define LV_OBJ_REALIGN 1 /*Enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/ /*================== diff --git a/lv_core/lv_obj.c b/lv_core/lv_obj.c index e63d43b2d..2c057e6f0 100644 --- a/lv_core/lv_obj.c +++ b/lv_core/lv_obj.c @@ -164,17 +164,19 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) } else { new_obj->style_p = &lv_style_scr; } - /*Set virtual functions*/ + /*Set the callbacks*/ lv_obj_set_signal_cb(new_obj, lv_obj_signal); lv_obj_set_design_cb(new_obj, lv_obj_design); + new_obj->event_cb = NULL; - /*Set free data*/ -#ifdef LV_OBJ_FREE_NUM_TYPE - new_obj->free_num = 0; + /*Init. user date*/ +#if USE_LV_USER_DATA_SINGLE + memset(&new_obj->user_data, 0, sizeof(lv_obj_user_data_t)); #endif - -#if LV_OBJ_FREE_PTR != 0 - new_obj->free_ptr = NULL; +#if USE_LV_USER_DATA_MULTI + memset(&new_obj->event_user_data, 0, sizeof(lv_obj_user_data_t)); + memset(&new_obj->signal_user_data, 0, sizeof(lv_obj_user_data_t)); + memset(&new_obj->design_user_data, 0, sizeof(lv_obj_user_data_t)); #endif #if USE_LV_GROUP @@ -232,17 +234,21 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) new_obj->style_p = &lv_style_plain_color; } - /*Set callbacks*/ + /*Set the callbacks*/ lv_obj_set_signal_cb(new_obj, lv_obj_signal); lv_obj_set_design_cb(new_obj, lv_obj_design); + new_obj->event_cb = NULL; - /*Set free data*/ -#ifdef LV_OBJ_FREE_NUM_TYPE - new_obj->free_num = 0; + /*Init. user date*/ +#if USE_LV_USER_DATA_SINGLE + memset(&new_obj->user_data, 0, sizeof(lv_obj_user_data_t)); #endif -#if LV_OBJ_FREE_PTR != 0 - new_obj->free_ptr = NULL; +#if USE_LV_USER_DATA_MULTI + memset(&new_obj->event_user_data, 0, sizeof(lv_obj_user_data_t)); + memset(&new_obj->signal_user_data, 0, sizeof(lv_obj_user_data_t)); + memset(&new_obj->design_user_data, 0, sizeof(lv_obj_user_data_t)); #endif + #if USE_LV_GROUP new_obj->group_p = NULL; #endif @@ -261,16 +267,19 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) new_obj->ext_attr = NULL; } + /*Copy the attributes if required*/ if(copy != NULL) { lv_area_copy(&new_obj->coords, ©->coords); new_obj->ext_size = copy->ext_size; /*Set free data*/ -#ifdef LV_OBJ_FREE_NUM_TYPE - new_obj->free_num = copy->free_num; +#if USE_LV_USER_DATA_SINGLE + memcpy(&new_obj->user_data, ©->user_data, sizeof(lv_obj_user_data_t)); #endif -#if LV_OBJ_FREE_PTR != 0 - new_obj->free_ptr = copy->free_ptr; +#if USE_LV_USER_DATA_MULTI + memcpy(&new_obj->event_user_data, ©->event_user_data, sizeof(lv_obj_user_data_t)); + memcpy(&new_obj->signal_user_data, ©->signal_user_data, sizeof(lv_obj_user_data_t)); + memcpy(&new_obj->design_user_data, ©->design_user_data, sizeof(lv_obj_user_data_t)); #endif /*Copy realign*/ @@ -282,7 +291,10 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) new_obj->realign.auto_realign = copy->realign.auto_realign; #endif - /*Set attributes*/ + /*Only copy the `event_cb`. `signal_cb` and `design_cb` will be copied the the derived object type (e.g. `lv_btn`)*/ + new_obj-> event_cb = copy->event_cb; + + /*Copy attributes*/ new_obj->click = copy->click; new_obj->drag = copy->drag; new_obj->drag_throw = copy->drag_throw; @@ -1150,6 +1162,10 @@ void lv_obj_set_event_cb(lv_obj_t * obj, lv_event_cb_t cb) void lv_obj_send_event(lv_obj_t * obj, lv_event_t event) { if(obj->event_cb) obj->event_cb(obj, event); + + if(obj->event_parent && obj->par) { + lv_obj_send_event(obj->par, event); + } } /** @@ -1212,32 +1228,6 @@ void lv_obj_refresh_ext_size(lv_obj_t * obj) lv_obj_invalidate(obj); } -#ifdef LV_OBJ_FREE_NUM_TYPE -/** - * Set an application specific number for an object. - * It can help to identify objects in the application. - * @param obj pointer to an object - * @param free_num the new free number - */ -void lv_obj_set_free_num(lv_obj_t * obj, LV_OBJ_FREE_NUM_TYPE free_num) -{ - obj->free_num = free_num; -} -#endif - -#if LV_OBJ_FREE_PTR != 0 -/** - * Set an application specific pointer for an object. - * It can help to identify objects in the application. - * @param obj pointer to an object - * @param free_p the new free pinter - */ -void lv_obj_set_free_ptr(lv_obj_t * obj, void * free_p) -{ - obj->free_ptr = free_p; -} -#endif - #if USE_LV_ANIMATION /** * Animate an object @@ -1745,31 +1735,18 @@ void lv_obj_get_type(lv_obj_t * obj, lv_obj_type_t * buf) } } -#ifdef LV_OBJ_FREE_NUM_TYPE +#if USE_LV_USER_DATA_SINGLE /** - * Get the free number + * Get a pointer to the pbject's user data * @param obj pointer to an object * @return the free number */ -LV_OBJ_FREE_NUM_TYPE lv_obj_get_free_num(const lv_obj_t * obj) +lv_obj_user_data_t * lv_obj_get_user_data(lv_obj_t * obj) { - return obj->free_num; + return &obj->user_data; } #endif -#if LV_OBJ_FREE_PTR != 0 -/** - * Get the free pointer - * @param obj pointer to an object - * @return the free pointer - */ -void * lv_obj_get_free_ptr(const lv_obj_t * obj) -{ - return obj->free_ptr; -} -#endif - - #if USE_LV_GROUP /** * Get the group of the object diff --git a/lv_core/lv_obj.h b/lv_core/lv_obj.h index 656c5cb39..6800914b8 100644 --- a/lv_core/lv_obj.h +++ b/lv_core/lv_obj.h @@ -180,10 +180,6 @@ typedef struct _lv_obj_t void * ext_attr; /*Object type specific extended data*/ lv_style_t * style_p; /*Pointer to the object's style*/ -#if LV_OBJ_FREE_PTR != 0 - void * free_ptr; /*Application specific pointer (set it freely)*/ -#endif - #if USE_LV_GROUP != 0 void * group_p; /*Pointer to the group of the object*/ #endif @@ -195,6 +191,7 @@ typedef struct _lv_obj_t uint8_t hidden :1; /*1: Object is hidden*/ uint8_t top :1; /*1: If the object or its children is clicked it goes to the foreground*/ uint8_t opa_scale_en :1; /*1: opa_scale is set*/ + uint8_t event_parent :1; /*1: Send the object's events to the parent too. */ uint8_t protect; /*Automatically happening actions can be prevented. 'OR'ed values from `lv_protect_t`*/ lv_opa_t opa_scale; /*Scale down the opacity by this factor. Effects all children as well*/ @@ -203,9 +200,16 @@ typedef struct _lv_obj_t lv_reailgn_t realign; #endif -#ifdef LV_OBJ_FREE_NUM_TYPE - LV_OBJ_FREE_NUM_TYPE free_num; /*Application specific identifier (set it freely)*/ +#if USE_LV_USER_DATA_SINGLE + lv_obj_user_data_t user_data; #endif + +#if USE_LV_USER_DATA_MULTI + lv_obj_user_data_t event_user_data; + lv_obj_user_data_t signal_user_data; + lv_obj_user_data_t design_user_data; +#endif + } lv_obj_t; /*Protect some attributes (max. 8 bit)*/ @@ -539,26 +543,6 @@ void * lv_obj_allocate_ext_attr(lv_obj_t * obj, uint16_t ext_size); */ void lv_obj_refresh_ext_size(lv_obj_t * obj); -#ifdef LV_OBJ_FREE_NUM_TYPE -/** - * Set an application specific number for an object. - * It can help to identify objects in the application. - * @param obj pointer to an object - * @param free_num the new free number - */ -void lv_obj_set_free_num(lv_obj_t * obj, LV_OBJ_FREE_NUM_TYPE free_num); -#endif - -#if LV_OBJ_FREE_PTR != 0 -/** - * Set an application specific pointer for an object. - * It can help to identify objects in the application. - * @param obj pointer to an object - * @param free_p the new free pinter - */ -void lv_obj_set_free_ptr(lv_obj_t * obj, void * free_p); -#endif - #if USE_LV_ANIMATION /** * Animate an object @@ -799,22 +783,14 @@ void * lv_obj_get_ext_attr(const lv_obj_t * obj); */ void lv_obj_get_type(lv_obj_t * obj, lv_obj_type_t * buf); -#ifdef LV_OBJ_FREE_NUM_TYPE + +#if USE_LV_USER_DATA_SINGLE /** - * Get the free number + * Get a pointer to the pbject's user data * @param obj pointer to an object * @return the free number */ -LV_OBJ_FREE_NUM_TYPE lv_obj_get_free_num(const lv_obj_t * obj); -#endif - -#if LV_OBJ_FREE_PTR != 0 -/** - * Get the free pointer - * @param obj pointer to an object - * @return the free pointer - */ -void * lv_obj_get_free_ptr(const lv_obj_t * obj); +lv_obj_user_data_t * lv_obj_get_user_data(lv_obj_t * obj); #endif #if USE_LV_GROUP diff --git a/lv_objx/lv_tileview.c b/lv_objx/lv_tileview.c index 33c1ac1ea..3e27b2103 100644 --- a/lv_objx/lv_tileview.c +++ b/lv_objx/lv_tileview.c @@ -34,7 +34,7 @@ **********************/ static lv_res_t lv_tileview_signal(lv_obj_t * tileview, lv_signal_t sign, void * param); static lv_res_t lv_tileview_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void * param); -static lv_res_t element_signal_func(lv_obj_t * element, lv_signal_t sign, void * param); +static void tileview_scrl_event_cb(lv_obj_t * scrl, lv_event_t event); static void drag_end_handler(lv_obj_t * tileview); static bool set_valid_drag_dirs(lv_obj_t * tileview); @@ -92,6 +92,7 @@ lv_obj_t * lv_tileview_create(lv_obj_t * par, const lv_obj_t * copy) lv_obj_set_size(new_tileview, LV_DPI * 3, LV_DPI * 3); lv_obj_set_drag_throw(lv_page_get_scrl(new_tileview), false); lv_page_set_scrl_fit(new_tileview, LV_FIT_TIGHT); + lv_obj_set_event_cb(ext->page.scrl, tileview_scrl_event_cb); /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); if(th) { @@ -131,8 +132,9 @@ lv_obj_t * lv_tileview_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_tileview_add_element(lv_obj_t * element) { - lv_obj_set_free_ptr(element, lv_obj_get_signal_func(element)); - lv_obj_set_signal_cb(element, element_signal_func); + /* Let objects eventto propaget to the scrollable part of the tileview. + * It is required the handle dargging of the tileview with the element.*/ + element->event_parent = 1; lv_obj_set_drag_parent(element, true); } @@ -422,76 +424,34 @@ static lv_res_t lv_tileview_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void if(ext->drag_hor == 0) lv_obj_set_x(scrl, - ext->act_id.x * lv_obj_get_width(tileview)); } } - return res; - } -/** - * This function is applied called for the elements of the tileview. Used when the element is - * @param element - * @param sign - * @param param - * @return - */ -static lv_res_t element_signal_func(lv_obj_t * element, lv_signal_t sign, void * param) -{ - lv_res_t res; - /* Include the ancient signal function */ - lv_signal_cb_t sign_func = lv_obj_get_free_ptr(element); - res = sign_func(element, sign, param); - if(res != LV_RES_OK) return res; +static void tileview_scrl_event_cb(lv_obj_t * scrl, lv_event_t event) +{ + lv_obj_t * tileview = lv_obj_get_parent(scrl); /*Initialize some variables on PRESS*/ - if(sign == LV_SIGNAL_PRESSED) { - /*Get the tileview from the element*/ - lv_obj_t * tileview = lv_obj_get_parent(element); - while(tileview) { - if(lv_obj_get_signal_func(tileview) != lv_tileview_signal) tileview = lv_obj_get_parent(tileview); - else break; - } - - if(tileview) { - lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); - ext->drag_hor = 0; - ext->drag_ver = 0; - set_valid_drag_dirs(tileview); - } + if(event == LV_EVENT_PRESSED) { + lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); + ext->drag_hor = 0; + ext->drag_ver = 0; + set_valid_drag_dirs(tileview); } - /*Animate the tabview to the correct location on RELEASE*/ - else if(sign == LV_SIGNAL_PRESS_LOST || sign == LV_SIGNAL_RELEASED) { - - /*Get the tileview from the element*/ - lv_obj_t * tileview = lv_obj_get_parent(element); - while(tileview) { - if(lv_obj_get_signal_func(tileview) != lv_tileview_signal) tileview = lv_obj_get_parent(tileview); - else break; + else if(event == LV_EVENT_PRESS_LOST || event == LV_EVENT_RELEASED) { + /* If the element was dragged and it moved the tileview finish the drag manually to + * let the tileview to finish the move.*/ + lv_indev_t * indev = lv_indev_get_act(); + lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); + if(lv_indev_is_dragging(indev) && (ext->drag_hor || ext->drag_ver)) { + indev->proc.types.pointer.drag_in_prog = 0; +// if(drag_obj) drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_END, NULL); } - if(tileview) { - /* If the element was dragged and it moved the tileview finish the drag manually to - * let the tileview to finish the move.*/ - lv_indev_t * indev = lv_indev_get_act(); - lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); - if(lv_indev_is_dragging(indev) && (ext->drag_hor || ext->drag_ver)) { - - lv_obj_t * drag_obj = element; - while(lv_obj_get_drag_parent(drag_obj)) { - drag_obj = lv_obj_get_parent(drag_obj); - if(drag_obj == NULL) break; - } - - indev->proc.types.pointer.drag_in_prog = 0; - if(drag_obj) drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_END, NULL); - } - - drag_end_handler(tileview); - } + drag_end_handler(tileview); } - - return res; } /**