1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00

feat(obj_class) separate lv_obj_class_create_obj into lv_obj_class_create_obj and lv_obj_class_init_obj

It allows using the new object reference somewhere before initializing it. Usuful for the Micropython binding.
This commit is contained in:
Gabor Kiss-Vamosi 2021-05-11 13:05:42 +02:00
parent 21a1dca21e
commit a46f20de91
32 changed files with 143 additions and 62 deletions

View File

@ -174,7 +174,10 @@ void lv_deinit(void)
lv_obj_t * lv_obj_create(lv_obj_t * parent)
{
return lv_obj_class_create_obj(&lv_obj_class, parent, NULL);
LV_LOG_INFO("begin")
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -40,7 +40,7 @@ static uint32_t get_instance_size(const lv_obj_class_t * class_p);
* GLOBAL FUNCTIONS
**********************/
lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * parent, void * user_data)
lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * parent)
{
LV_TRACE_OBJ_CREATE("Creating object with %p class on %p parent", class_p, parent);
uint32_t s = get_instance_size(class_p);
@ -49,11 +49,6 @@ lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * pa
lv_memset_00(obj, s);
obj->class_p = class_p;
obj->parent = parent;
#if LV_USE_USER_DATA
obj->user_data = user_data;
#else
LV_UNUSED(user_data);
#endif
/*Create a screen*/
if(parent == NULL) {
@ -99,6 +94,11 @@ lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * pa
}
}
return obj;
}
void lv_obj_class_init_obj(lv_obj_t * obj)
{
lv_obj_mark_layout_as_dirty(obj);
lv_obj_enable_style_refresh(false);
@ -116,6 +116,7 @@ lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * pa
lv_group_add_obj(def_group, obj);
}
lv_obj_t * parent = lv_obj_get_parent(obj);
if(parent) {
/*Call the ancestor's event handler to the parent to notify it about the new child.
*Also triggers layout update*/
@ -124,8 +125,6 @@ lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * pa
/*Invalidate the area if not screen created*/
lv_obj_invalidate(obj);
}
return obj;
}
void _lv_obj_destructor(lv_obj_t * obj)

View File

@ -70,11 +70,11 @@ typedef struct _lv_obj_class_t {
* Create an object form a class descriptor
* @param class_p pointer to a class
* @param parent pointer to an object where the new object should be created
* @param user_data a custom user_data to set in `obj->user_data` in creation time. Requires `LV_USE_USER_DATA 1`
* As some event fire during creation it's useful make user_data available for those events too.
* @return pointer to the created object
*/
struct _lv_obj_t * lv_obj_class_create_obj(const struct _lv_obj_class_t * class_p, struct _lv_obj_t * parent, void * user_data);
struct _lv_obj_t * lv_obj_class_create_obj(const struct _lv_obj_class_t * class_p, struct _lv_obj_t * parent);
void lv_obj_class_init_obj(struct _lv_obj_t * obj);
void _lv_obj_destructor(struct _lv_obj_t * obj);

View File

@ -57,10 +57,12 @@ const lv_obj_class_t lv_animimg_class = {
lv_obj_t * lv_animimg_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_animimg_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(&lv_animimg_class, parent);
lv_obj_class_init_obj(obj);
return obj;
}
void lv_animimg_set_src(lv_obj_t * obj, lv_img_dsc_t ** dsc, uint8_t num)
void lv_animimg_set_src(lv_obj_t * obj, lv_img_dsc_t * dsc[], uint8_t num)
{
lv_animimg_t * animimg = (lv_animimg_t *)obj;
animimg->dsc = dsc;

View File

@ -56,8 +56,9 @@ static const char * day_names_def[7] = LV_CALENDAR_DEFAULT_DAY_NAMES;
lv_obj_t * lv_calendar_create(lv_obj_t * parent)
{
lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_class, parent, NULL);
LV_LOG_INFO("begin")
lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_class, parent);
lv_obj_class_init_obj(obj);
return obj;
}

View File

@ -65,7 +65,9 @@ const lv_obj_class_t lv_chart_class = {
lv_obj_t * lv_chart_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_chart_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
void lv_chart_set_type(lv_obj_t * obj, lv_chart_type_t type)

View File

@ -74,8 +74,12 @@ static bool create_knob_recolor;
*/
lv_obj_t * lv_colorwheel_create(lv_obj_t * parent, bool knob_recolor)
{
LV_LOG_INFO("begin")
create_knob_recolor = knob_recolor;
return lv_obj_class_create_obj(&lv_colorwheel_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -55,7 +55,10 @@ const lv_obj_class_t lv_imgbtn_class = {
*/
lv_obj_t * lv_imgbtn_create(lv_obj_t * parent)
{
return lv_obj_class_create_obj(&lv_imgbtn_class, parent, NULL);
LV_LOG_INFO("begin")
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -121,7 +121,10 @@ static const lv_btnmatrix_ctrl_t * kb_ctrl[5] = {
*/
lv_obj_t * lv_keyboard_create(lv_obj_t * parent)
{
return lv_obj_class_create_obj(&lv_keyboard_class, parent, NULL);
LV_LOG_INFO("begin")
lv_obj_t * obj = lv_obj_class_create_obj(&lv_keyboard_class, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -59,7 +59,10 @@ const lv_obj_class_t lv_led_class = {
*/
lv_obj_t * lv_led_create(lv_obj_t * parent)
{
return lv_obj_class_create_obj(&lv_led_class, parent, NULL);
LV_LOG_INFO("begin")
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -55,42 +55,45 @@ const lv_obj_class_t lv_list_text_class = {
lv_obj_t * lv_list_create(lv_obj_t * parent)
{
lv_obj_t * list = lv_obj_class_create_obj(&lv_list_class, parent, NULL);
lv_obj_set_flex_flow(list, LV_FLEX_FLOW_COLUMN);
return list;
LV_LOG_INFO("begin")
lv_obj_t * obj = lv_obj_class_create_obj(&lv_list_class, parent);
lv_obj_class_init_obj(obj);
lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN);
return obj;
}
lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt)
{
lv_obj_t * label = lv_obj_class_create_obj(&lv_list_text_class, list, NULL);
lv_label_set_text(label, txt);
lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR);
lv_obj_set_width(label, LV_PCT(100));
return label;
LV_LOG_INFO("begin")
lv_obj_t * obj = lv_obj_class_create_obj(&lv_list_text_class, list);
lv_obj_class_init_obj(obj);
lv_label_set_text(obj, txt);
lv_label_set_long_mode(obj, LV_LABEL_LONG_SCROLL_CIRCULAR);
lv_obj_set_width(obj, LV_PCT(100));
return obj;
}
lv_obj_t * lv_list_add_btn(lv_obj_t * list, const char * icon, const char * txt, lv_event_cb_t event_cb)
{
lv_obj_t * btn = lv_obj_class_create_obj(&lv_list_btn_class, list, NULL);
lv_obj_set_size(btn, LV_PCT(100), LV_SIZE_CONTENT);
if(event_cb) {
lv_obj_add_event_cb(btn, event_cb, LV_EVENT_ALL, NULL);
}
LV_LOG_INFO("begin")
lv_obj_t * obj = lv_obj_class_create_obj(&lv_list_btn_class, list);
lv_obj_class_init_obj(obj);
lv_obj_set_size(obj, LV_PCT(100), LV_SIZE_CONTENT);
if(event_cb) lv_obj_add_event_cb(obj, event_cb, LV_EVENT_ALL, NULL);
if(icon) {
lv_obj_t * img = lv_img_create(btn);
lv_obj_t * img = lv_img_create(obj);
lv_img_set_src(img, icon);
}
if(txt) {
lv_obj_t * label = lv_label_create(btn);
lv_obj_t * label = lv_label_create(obj);
lv_label_set_text(label, txt);
lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR);
lv_obj_set_flex_grow(label, 1);
}
return btn;
return obj;
}
const char * lv_list_get_btn_text(lv_obj_t * list, lv_obj_t * btn)

View File

@ -52,7 +52,9 @@ const lv_obj_class_t lv_meter_class = {
lv_obj_t * lv_meter_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_meter_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -39,6 +39,7 @@ const lv_obj_class_t lv_msgbox_class = {.base_class = &lv_obj_class};
lv_obj_t * lv_msgbox_create(lv_obj_t * parent, const char * title, const char * txt, const char * btn_txts[], bool add_close_btn)
{
LV_LOG_INFO("begin")
bool auto_parent = false;
if(parent == NULL) {
auto_parent = true;
@ -49,7 +50,8 @@ lv_obj_t * lv_msgbox_create(lv_obj_t * parent, const char * title, const char *
lv_obj_set_size(parent, LV_PCT(100), LV_PCT(100));
}
lv_obj_t * mbox = lv_obj_class_create_obj(&lv_msgbox_class, parent, NULL);
lv_obj_t * mbox = lv_obj_class_create_obj(&lv_msgbox_class, parent);
lv_obj_class_init_obj(mbox);
LV_ASSERT_MALLOC(mbox);
if(mbox == NULL) return NULL;

View File

@ -46,7 +46,10 @@ const lv_obj_class_t lv_spinbox_class = {
lv_obj_t * lv_spinbox_create(lv_obj_t * parent)
{
return lv_obj_class_create_obj(&lv_spinbox_class, parent, NULL);
LV_LOG_INFO("begin")
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -49,9 +49,13 @@ static lv_coord_t tabsize_create;
lv_obj_t * lv_tabview_create(lv_obj_t * parent, lv_dir_t tab_pos, lv_coord_t tab_size)
{
LV_LOG_INFO("begin")
tabpos_create = tab_pos;
tabsize_create = tab_size;
return lv_obj_class_create_obj(&lv_tabview_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(&lv_tabview_class, parent);
lv_obj_class_init_obj(obj);
return obj;
}
lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name)

View File

@ -50,7 +50,10 @@ static uint32_t create_row_id;
lv_obj_t * lv_tileview_create(lv_obj_t * parent)
{
return lv_obj_class_create_obj(&lv_tileview_class, parent, NULL);
LV_LOG_INFO("begin")
lv_obj_t * obj = lv_obj_class_create_obj(&lv_tileview_class, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*======================
@ -59,10 +62,14 @@ lv_obj_t * lv_tileview_create(lv_obj_t * parent)
lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir)
{
LV_LOG_INFO("begin")
create_dir = dir;
create_col_id = col_id;
create_row_id = row_id;
return lv_obj_class_create_obj(&lv_tileview_tile_class, tv, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(&lv_tileview_tile_class, tv);
lv_obj_class_init_obj(obj);
return obj;
}
void lv_obj_set_tile(lv_obj_t * tv, lv_obj_t * tile_obj, lv_anim_enable_t anim_en)

View File

@ -44,8 +44,12 @@ static lv_coord_t create_header_height;
lv_obj_t * lv_win_create(lv_obj_t * parent, lv_coord_t header_height)
{
LV_LOG_INFO("begin")
create_header_height = header_height;
return lv_obj_class_create_obj(&lv_win_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(&lv_win_class, parent);
lv_obj_class_init_obj(obj);
return obj;
}
lv_obj_t * lv_win_add_title(lv_obj_t * win, const char * txt)

View File

@ -65,7 +65,9 @@ const lv_obj_class_t lv_arc_class = {
lv_obj_t * lv_arc_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_arc_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*======================

View File

@ -78,7 +78,9 @@ const lv_obj_class_t lv_bar_class = {
lv_obj_t * lv_bar_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_bar_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -15,6 +15,7 @@
/*********************
* DEFINES
*********************/
#define MY_CLASS &lv_btn_class
/**********************
* TYPEDEFS
@ -48,7 +49,9 @@ const lv_obj_class_t lv_btn_class = {
lv_obj_t * lv_btn_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_btn_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/**********************

View File

@ -79,7 +79,9 @@ const lv_obj_class_t lv_btnmatrix_class = {
lv_obj_t * lv_btnmatrix_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_btnmatrix_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -67,7 +67,9 @@ const lv_obj_class_t lv_canvas_class = {
lv_obj_t * lv_canvas_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_canvas_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -56,7 +56,9 @@ const lv_obj_class_t lv_checkbox_class = {
lv_obj_t * lv_checkbox_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_checkbox_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -90,7 +90,9 @@ const lv_obj_class_t lv_dropdownlist_class = {
lv_obj_t * lv_dropdown_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_dropdown_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(&lv_dropdown_class, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================
@ -517,7 +519,10 @@ void lv_dropdown_close(lv_obj_t * obj)
static lv_obj_t * lv_dropdown_list_create(lv_obj_t * parent)
{
return lv_obj_class_create_obj(&lv_dropdownlist_class, parent, NULL);
LV_LOG_INFO("begin")
lv_obj_t * obj = lv_obj_class_create_obj(&lv_dropdownlist_class, parent);
lv_obj_class_init_obj(obj);
return obj;
}
static void lv_dropdown_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)

View File

@ -57,7 +57,9 @@ const lv_obj_class_t lv_img_class = {
lv_obj_t * lv_img_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_img_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -73,7 +73,9 @@ const lv_obj_class_t lv_label_class = {
lv_obj_t * lv_label_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_label_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -54,7 +54,9 @@ const lv_obj_class_t lv_line_class = {
lv_obj_t * lv_line_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_line_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -77,7 +77,9 @@ const lv_obj_class_t lv_roller_label_class = {
lv_obj_t * lv_roller_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_roller_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================
@ -297,7 +299,9 @@ static void lv_roller_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj
lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN);
lv_obj_class_create_obj(&lv_roller_label_class, obj, NULL);
LV_LOG_INFO("begin")
lv_obj_t * label = lv_obj_class_create_obj(&lv_roller_label_class, obj);
lv_obj_class_init_obj(label);
lv_roller_set_options(obj, "Option 1\nOption 2\nOption 3\nOption 4\nOption 5", LV_ROLLER_MODE_NORMAL);
LV_LOG_TRACE("finshed");

View File

@ -59,7 +59,9 @@ const lv_obj_class_t lv_slider_class = {
lv_obj_t * lv_slider_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_slider_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
bool lv_slider_is_dragged(const lv_obj_t * obj)

View File

@ -61,7 +61,9 @@ const lv_obj_class_t lv_switch_class = {
lv_obj_t * lv_switch_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_switch_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/**********************

View File

@ -64,7 +64,9 @@ const lv_obj_class_t lv_table_class = {
lv_obj_t * lv_table_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_table_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*=====================

View File

@ -84,7 +84,9 @@ static const char * ta_insert_replace;
lv_obj_t * lv_textarea_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin")
return lv_obj_class_create_obj(&lv_textarea_class, parent, NULL);
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
return obj;
}
/*======================