diff --git a/src/lv_core/lv_grid.c b/src/lv_core/lv_grid.c index cd0170d1a..df8754834 100644 --- a/src/lv_core/lv_grid.c +++ b/src/lv_core/lv_grid.c @@ -37,12 +37,6 @@ static void report_grid_change_core(const lv_grid_t * grid, lv_obj_t * obj); /********************** * STATIC VARIABLES **********************/ -static const lv_coord_t lv_grid_1_dsc[1] = {LV_GRID_FR(1)}; -const lv_grid_t lv_grid_center = { - .col_dsc = lv_grid_1_dsc, - .col_dsc_len = 1, - .col_place = LV_GRID_CENTER, - .row_place = LV_GRID_CENTER}; /********************** * MACROS diff --git a/src/lv_core/lv_grid.h b/src/lv_core/lv_grid.h index 4c524ffe5..331ea4302 100644 --- a/src/lv_core/lv_grid.h +++ b/src/lv_core/lv_grid.h @@ -166,7 +166,6 @@ void lv_grid_item_refr_pos(lv_obj_t * item); /********************** * GLOBAL VARIABLES **********************/ -extern const lv_grid_t lv_grid_center; /********************** * MACROS diff --git a/src/lv_themes/lv_theme.c b/src/lv_themes/lv_theme.c index 70bac97dc..e3a2b7512 100644 --- a/src/lv_themes/lv_theme.c +++ b/src/lv_themes/lv_theme.c @@ -424,10 +424,9 @@ static void clear_styles(lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_TEXTAREA case LV_THEME_TEXTAREA: - _lv_obj_reset_style_list_no_refr(obj, LV_TEXTAREA_PART_BG); + _lv_obj_reset_style_list_no_refr(obj, LV_TEXTAREA_PART_MAIN); _lv_obj_reset_style_list_no_refr(obj, LV_TEXTAREA_PART_PLACEHOLDER); _lv_obj_reset_style_list_no_refr(obj, LV_TEXTAREA_PART_CURSOR); - _lv_obj_reset_style_list_no_refr(obj, LV_TEXTAREA_PART_SCROLLBAR); break; #endif diff --git a/src/lv_themes/lv_theme_material.c b/src/lv_themes/lv_theme_material.c index 1dd0b110c..49c4934c5 100644 --- a/src/lv_themes/lv_theme_material.c +++ b/src/lv_themes/lv_theme_material.c @@ -1261,7 +1261,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_TABLE case LV_THEME_TABLE: { - list = lv_obj_get_style_list(obj, LV_TABLE_PART_BG); + list = _lv_obj_get_style_list(obj, LV_TABLE_PART_BG); _lv_style_list_add_style(list, &styles->bg); int idx = 1; /* start value should be 1, not zero, since cell styles @@ -1269,7 +1269,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) in the enum (lv_table.h) */ /* declaring idx outside loop to work with older compilers */ for (;idx <= LV_TABLE_CELL_STYLE_CNT; idx ++ ) { - list = lv_obj_get_style_list(obj, idx); + list = _lv_obj_get_style_list(obj, idx); _lv_style_list_add_style(list, &styles->table_cell); } break; @@ -1299,7 +1299,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_TEXTAREA case LV_THEME_TEXTAREA: - list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_BG); + list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_MAIN); _lv_style_list_add_style(list, &styles->bg); _lv_style_list_add_style(list, &styles->pad_small); @@ -1308,9 +1308,6 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_CURSOR); _lv_style_list_add_style(list, &styles->ta_cursor); - - list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_SCROLLBAR); - _lv_style_list_add_style(list, &styles->sb); break; #endif diff --git a/src/lv_themes/lv_theme_mono.c b/src/lv_themes/lv_theme_mono.c index bc12cad59..bbf828feb 100644 --- a/src/lv_themes/lv_theme_mono.c +++ b/src/lv_themes/lv_theme_mono.c @@ -865,7 +865,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_TABLE case LV_THEME_TABLE: { - list = lv_obj_get_style_list(obj, LV_TABLE_PART_BG); + list = _lv_obj_get_style_list(obj, LV_TABLE_PART_BG); _lv_style_list_add_style(list, &styles->bg); int idx = 1; /* start value should be 1, not zero, since cell styles @@ -873,7 +873,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) in the enum (lv_table.h) */ /* declaring idx outside loop to work with older compilers */ for (; idx <= LV_TABLE_CELL_STYLE_CNT; idx ++ ) { - list = lv_obj_get_style_list(obj, idx); + list = _lv_obj_get_style_list(obj, idx); _lv_style_list_add_style(list, &styles->bg); _lv_style_list_add_style(list, &styles->no_radius); } @@ -905,14 +905,11 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_TEXTAREA case LV_THEME_TEXTAREA: - list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_BG); + list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_MAIN); _lv_style_list_add_style(list, &styles->bg); list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_CURSOR); _lv_style_list_add_style(list, &styles->ta_cursor); - - list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_SCROLLBAR); - _lv_style_list_add_style(list, &styles->sb); break; #endif diff --git a/src/lv_themes/lv_theme_template.c b/src/lv_themes/lv_theme_template.c index 39a15dcf8..9040c99e3 100644 --- a/src/lv_themes/lv_theme_template.c +++ b/src/lv_themes/lv_theme_template.c @@ -718,7 +718,7 @@ void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_TABLE case LV_THEME_TABLE: { - list = lv_obj_get_style_list(obj, LV_TABLE_PART_BG); + list = _lv_obj_get_style_list(obj, LV_TABLE_PART_BG); _lv_style_list_add_style(list, &styles->bg); int idx = 1; /* start value should be 1, not zero, since cell styles @@ -726,7 +726,7 @@ void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) in the enum (lv_table.h) */ /* declaring idx outside loop to work with older compilers */ for (; idx <= LV_TABLE_CELL_STYLE_CNT; idx ++ ) { - list = lv_obj_get_style_list(obj, idx); + list = _lv_obj_get_style_list(obj, idx); _lv_style_list_add_style(list, &styles->bg); } break; @@ -757,7 +757,7 @@ void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_TEXTAREA case LV_THEME_TEXTAREA: - list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_BG); + list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_MAIN); _lv_style_list_add_style(list, &styles->bg); list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_PLACEHOLDER); @@ -766,9 +766,6 @@ void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_CURSOR); _lv_style_list_add_style(list, &styles->bg); _lv_style_list_add_style(list, &styles->tight); - - list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_SCROLLBAR); - _lv_style_list_add_style(list, &styles->bg); break; #endif diff --git a/src/lv_widgets/lv_btn.c b/src/lv_widgets/lv_btn.c index 376999675..b30744c3d 100644 --- a/src/lv_widgets/lv_btn.c +++ b/src/lv_widgets/lv_btn.c @@ -71,7 +71,6 @@ lv_obj_t * lv_btn_create(lv_obj_t * parent, const lv_obj_t * copy) /*Set layout if the button is not a screen*/ if(parent) { lv_obj_set_size(btn, LV_DPI, LV_DPI / 3); - lv_obj_set_grid(btn, &lv_grid_center); } lv_theme_apply(btn, LV_THEME_BTN); diff --git a/src/lv_widgets/lv_imgbtn.c b/src/lv_widgets/lv_imgbtn.c index 6caa98f19..a84a04935 100644 --- a/src/lv_widgets/lv_imgbtn.c +++ b/src/lv_widgets/lv_imgbtn.c @@ -30,6 +30,7 @@ static lv_design_res_t lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_imgbtn_signal(lv_obj_t * imgbtn, lv_signal_t sign, void * param); static void refr_img(lv_obj_t * imgbtn); +lv_imgbtn_state_t get_state(const lv_obj_t * imgbtn); /********************** * STATIC VARIABLES @@ -100,7 +101,7 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy) #endif ext->tiled = copy_ext->tiled; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(imgbtn, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); + _lv_obj_refresh_style(imgbtn, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("image button created"); @@ -115,10 +116,10 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy) /** * Set images for a state of the image button * @param imgbtn pointer to an image button object - * @param state for which state set the new image (from `lv_btn_state_t`) ` + * @param state for which state set the new image * @param src pointer to an image source (a C array or path to a file) */ -void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src) +void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_imgbtn_state_t state, const void * src) { LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); @@ -137,7 +138,7 @@ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src /** * Set images for a state of the image button * @param imgbtn pointer to an image button object - * @param state for which state set the new image (from `lv_btn_state_t`) ` + * @param state for which state set the new image * @param src_left pointer to an image source for the left side of the button (a C array or path to * a file) * @param src_mid pointer to an image source for the middle of the button (ideally 1px wide) (a C @@ -145,7 +146,7 @@ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src * @param src_right pointer to an image source for the right side of the button (a C array or path * to a file) */ -void lv_imgbtn_set_src_tiled(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src_left, const void * src_mid, +void lv_imgbtn_set_src_tiled(lv_obj_t * imgbtn, lv_imgbtn_state_t state, const void * src_left, const void * src_mid, const void * src_right) { LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); @@ -180,7 +181,7 @@ void lv_imgbtn_set_src_tiled(lv_obj_t * imgbtn, lv_btn_state_t state, const void * @param state the state where to get the image (from `lv_btn_state_t`) ` * @return pointer to an image source (a C array or path to a file) */ -const void * lv_imgbtn_get_src(lv_obj_t * imgbtn, lv_btn_state_t state) +const void * lv_imgbtn_get_src(lv_obj_t * imgbtn, lv_imgbtn_state_t state) { LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); @@ -196,7 +197,7 @@ const void * lv_imgbtn_get_src(lv_obj_t * imgbtn, lv_btn_state_t state) * @param state the state where to get the image (from `lv_btn_state_t`) ` * @return pointer to the left image source (a C array or path to a file) */ -const void * lv_imgbtn_get_src_left(lv_obj_t * imgbtn, lv_btn_state_t state) +const void * lv_imgbtn_get_src_left(lv_obj_t * imgbtn, lv_imgbtn_state_t state) { LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); @@ -211,7 +212,7 @@ const void * lv_imgbtn_get_src_left(lv_obj_t * imgbtn, lv_btn_state_t state) * @param state the state where to get the image (from `lv_btn_state_t`) ` * @return pointer to the middle image source (a C array or path to a file) */ -const void * lv_imgbtn_get_src_middle(lv_obj_t * imgbtn, lv_btn_state_t state) +const void * lv_imgbtn_get_src_middle(lv_obj_t * imgbtn, lv_imgbtn_state_t state) { LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); @@ -226,7 +227,7 @@ const void * lv_imgbtn_get_src_middle(lv_obj_t * imgbtn, lv_btn_state_t state) * @param state the state where to get the image (from `lv_btn_state_t`) ` * @return pointer to the left image source (a C array or path to a file) */ -const void * lv_imgbtn_get_src_right(lv_obj_t * imgbtn, lv_btn_state_t state) +const void * lv_imgbtn_get_src_right(lv_obj_t * imgbtn, lv_imgbtn_state_t state) { LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); @@ -307,7 +308,7 @@ static lv_design_res_t lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * cli /*Just draw an image*/ lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); - lv_btn_state_t state = lv_imgbtn_get_state(imgbtn); + lv_imgbtn_state_t state = get_state(imgbtn); /*Simply draw the middle src if no tiled*/ if(!ext->tiled) { @@ -449,9 +450,10 @@ static lv_res_t lv_imgbtn_signal(lv_obj_t * imgbtn, lv_signal_t sign, void * par /* Include the ancient signal function */ res = ancestor_signal(imgbtn, sign, param); if(res != LV_RES_OK) return res; - if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); - - if(sign == LV_SIGNAL_STYLE_CHG) { + if(sign == LV_SIGNAL_GET_TYPE) { + return _lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); + } + else if(sign == LV_SIGNAL_STYLE_CHG) { /* If the style changed then the button was clicked, released etc. so probably the state was * changed as well Set the new image for the new state.*/ refr_img(imgbtn); @@ -478,7 +480,7 @@ static lv_res_t lv_imgbtn_signal(lv_obj_t * imgbtn, lv_signal_t sign, void * par static void refr_img(lv_obj_t * imgbtn) { lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); - lv_btn_state_t state = lv_imgbtn_get_state(imgbtn); + lv_imgbtn_state_t state = get_state(imgbtn); lv_img_header_t header; const void * src = ext->img_src_mid[state]; @@ -508,4 +510,26 @@ static void refr_img(lv_obj_t * imgbtn) lv_obj_invalidate(imgbtn); } +lv_imgbtn_state_t get_state(const lv_obj_t * imgbtn) +{ + LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); + + lv_state_t obj_state = lv_obj_get_state(imgbtn); + + if(obj_state & LV_STATE_DISABLED) { + if(obj_state & LV_STATE_CHECKED) return LV_IMGBTN_STATE_CHECKED_DISABLED; + else return LV_IMGBTN_STATE_DISABLED; + } + + if(obj_state & LV_STATE_CHECKED) { + if(obj_state & LV_STATE_PRESSED) return LV_IMGBTN_STATE_CHECKED_PRESSED; + else return LV_IMGBTN_STATE_CHECKED_RELEASED; + } + else { + if(obj_state & LV_STATE_PRESSED) return LV_IMGBTN_STATE_PRESSED; + else return LV_IMGBTN_STATE_RELEASED; + } +} + + #endif diff --git a/src/lv_widgets/lv_imgbtn.h b/src/lv_widgets/lv_imgbtn.h index 5f7d35a62..59019e316 100644 --- a/src/lv_widgets/lv_imgbtn.h +++ b/src/lv_widgets/lv_imgbtn.h @@ -17,11 +17,6 @@ extern "C" { #if LV_USE_IMGBTN != 0 -/*Testing of dependencies*/ -#if LV_USE_BTN == 0 -#error "lv_imgbtn: lv_btn is required. Enable it in lv_conf.h (LV_USE_BTN 1) " -#endif - #include "../lv_core/lv_obj.h" #include "lv_btn.h" #include "../lv_draw/lv_draw_img.h" @@ -29,18 +24,26 @@ extern "C" { /********************* * DEFINES *********************/ +typedef enum { + LV_IMGBTN_STATE_RELEASED, + LV_IMGBTN_STATE_PRESSED, + LV_IMGBTN_STATE_DISABLED, + LV_IMGBTN_STATE_CHECKED_RELEASED, + LV_IMGBTN_STATE_CHECKED_PRESSED, + LV_IMGBTN_STATE_CHECKED_DISABLED, + _LV_IMGBTN_STATE_NUM, +}lv_imgbtn_state_t; /********************** * TYPEDEFS **********************/ /*Data of image button*/ typedef struct { - lv_btn_ext_t btn; /*Ext. of ancestor*/ /*New data for this type */ - const void * img_src_mid[_LV_BTN_STATE_LAST]; /*Store center images to each state*/ + const void * img_src_mid[_LV_IMGBTN_STATE_NUM]; /*Store center images to each state*/ #if LV_IMGBTN_TILED - const void * img_src_left[_LV_BTN_STATE_LAST]; /*Store left side images to each state*/ - const void * img_src_right[_LV_BTN_STATE_LAST]; /*Store right side images to each state*/ + const void * img_src_left[_LV_IMGBTN_STATE_NUM]; /*Store left side images to each state*/ + const void * img_src_right[_LV_IMGBTN_STATE_NUM]; /*Store right side images to each state*/ #endif lv_img_cf_t act_cf; /*Color format of the currently active image*/ uint8_t tiled : 1; /*1: the middle src will be repeated to fill the user defined width*/ @@ -76,16 +79,16 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy); /** * Set images for a state of the image button * @param imgbtn pointer to an image button object - * @param state for which state set the new image (from `lv_btn_state_t`) ` + * @param state for which state set the new image * @param src pointer to an image source (a C array or path to a file) */ -void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src); +void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_imgbtn_state_t state, const void * src); #if LV_IMGBTN_TILED /** * Set images for a state of the image button * @param imgbtn pointer to an image button object - * @param state for which state set the new image (from `lv_btn_state_t`) ` + * @param state for which state set the new image * @param src_left pointer to an image source for the left side of the button (a C array or path to * a file) * @param src_mid pointer to an image source for the middle of the button (ideally 1px wide) (a C @@ -93,40 +96,11 @@ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src * @param src_right pointer to an image source for the right side of the button (a C array or path * to a file) */ -void lv_imgbtn_set_src_tiled(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src_left, const void * src_mid, +void lv_imgbtn_set_src_tiled(lv_obj_t * imgbtn, lv_imgbtn_state_t state, const void * src_left, const void * src_mid, const void * src_right); #endif -/** - * Enable the toggled states. On release the button will change from/to toggled state. - * @param imgbtn pointer to an image button object - * @param tgl true: enable toggled states, false: disable - */ -static inline void lv_imgbtn_set_checkable(lv_obj_t * imgbtn, bool tgl) -{ - lv_btn_set_checkable(imgbtn, tgl); -} - -/** - * Set the state of the image button - * @param imgbtn pointer to an image button object - * @param state the new state of the button (from lv_btn_state_t enum) - */ -static inline void lv_imgbtn_set_state(lv_obj_t * imgbtn, lv_btn_state_t state) -{ - lv_btn_set_state(imgbtn, state); -} - -/** - * Toggle the state of the image button (ON->OFF, OFF->ON) - * @param imgbtn pointer to a image button object - */ -static inline void lv_imgbtn_toggle(lv_obj_t * imgbtn) -{ - lv_btn_toggle(imgbtn); -} - /*===================== * Getter functions *====================*/ @@ -138,7 +112,7 @@ static inline void lv_imgbtn_toggle(lv_obj_t * imgbtn) * @param state the state where to get the image (from `lv_btn_state_t`) ` * @return pointer to an image source (a C array or path to a file) */ -const void * lv_imgbtn_get_src(lv_obj_t * imgbtn, lv_btn_state_t state); +const void * lv_imgbtn_get_src(lv_obj_t * imgbtn, lv_imgbtn_state_t state); #else @@ -148,7 +122,7 @@ const void * lv_imgbtn_get_src(lv_obj_t * imgbtn, lv_btn_state_t state); * @param state the state where to get the image (from `lv_btn_state_t`) ` * @return pointer to the left image source (a C array or path to a file) */ -const void * lv_imgbtn_get_src_left(lv_obj_t * imgbtn, lv_btn_state_t state); +const void * lv_imgbtn_get_src_left(lv_obj_t * imgbtn, lv_imgbtn_state_t state); /** * Get the middle image in a given state @@ -156,7 +130,7 @@ const void * lv_imgbtn_get_src_left(lv_obj_t * imgbtn, lv_btn_state_t state); * @param state the state where to get the image (from `lv_btn_state_t`) ` * @return pointer to the middle image source (a C array or path to a file) */ -const void * lv_imgbtn_get_src_middle(lv_obj_t * imgbtn, lv_btn_state_t state); +const void * lv_imgbtn_get_src_middle(lv_obj_t * imgbtn, lv_imgbtn_state_t state); /** * Get the right image in a given state @@ -164,28 +138,10 @@ const void * lv_imgbtn_get_src_middle(lv_obj_t * imgbtn, lv_btn_state_t state); * @param state the state where to get the image (from `lv_btn_state_t`) ` * @return pointer to the left image source (a C array or path to a file) */ -const void * lv_imgbtn_get_src_right(lv_obj_t * imgbtn, lv_btn_state_t state); +const void * lv_imgbtn_get_src_right(lv_obj_t * imgbtn, lv_imgbtn_state_t state); #endif -/** - * Get the current state of the image button - * @param imgbtn pointer to a image button object - * @return the state of the button (from lv_btn_state_t enum) - */ -static inline lv_btn_state_t lv_imgbtn_get_state(const lv_obj_t * imgbtn) -{ - return lv_btn_get_state(imgbtn); -} -/** - * Get the toggle enable attribute of the image button - * @param imgbtn pointer to a image button object - * @return true: toggle enabled, false: disabled - */ -static inline bool lv_imgbtn_get_checkable(const lv_obj_t * imgbtn) -{ - return lv_btn_get_checkable(imgbtn); -} /*===================== * Other functions diff --git a/src/lv_widgets/lv_table.c b/src/lv_widgets/lv_table.c index 501af6a24..c79a64999 100644 --- a/src/lv_widgets/lv_table.c +++ b/src/lv_widgets/lv_table.c @@ -81,6 +81,7 @@ lv_obj_t * lv_table_create(lv_obj_t * par, const lv_obj_t * copy) ext->col_cnt = 0; ext->row_cnt = 0; ext->row_h = NULL; + ext->col_w = NULL; ext->cell_types = 1; uint16_t i; @@ -88,16 +89,22 @@ lv_obj_t * lv_table_create(lv_obj_t * par, const lv_obj_t * copy) lv_style_list_init(&ext->cell_style[i]); } - for(i = 0; i < LV_TABLE_COL_MAX; i++) { - ext->col_w[i] = LV_DPI; - } - /*The signal and design functions are not copied so set them here*/ lv_obj_set_signal_cb(table, lv_table_signal); lv_obj_set_design_cb(table, lv_table_design); /*Init the new table table*/ if(copy == NULL) { + ext->col_cnt = 1; + ext->row_cnt = 1; + ext->col_w = lv_mem_alloc(ext->col_cnt * sizeof(ext->col_w[0])); + ext->row_h = lv_mem_alloc(ext->row_cnt * sizeof(ext->row_h[0])); + ext->col_w[0] = LV_DPI; + ext->row_h[0] = LV_DPI; /*It will be overwritten when the theme is applied*/ + ext->cell_data = lv_mem_realloc(ext->cell_data, ext->row_cnt * ext->col_cnt * sizeof(char *)); + + lv_obj_set_size(table, LV_SIZE_AUTO, 80); + lv_theme_apply(table, LV_THEME_TABLE); } /*Copy an existing table*/ @@ -110,7 +117,7 @@ lv_obj_t * lv_table_create(lv_obj_t * par, const lv_obj_t * copy) lv_table_set_col_cnt(table, copy_ext->col_cnt); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(table, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); + _lv_obj_refresh_style(table, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("table created"); @@ -136,15 +143,10 @@ void lv_table_set_cell_value(lv_obj_t * table, uint16_t row, uint16_t col, const LV_ASSERT_NULL(txt); lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - if(col >= ext->col_cnt) { - LV_LOG_WARN("lv_table_set_cell_value: invalid column"); - return; - } /*Auto expand*/ - if(row >= ext->row_cnt) { - lv_table_set_row_cnt(table, row + 1); - } + if(col >= ext->col_cnt) lv_table_set_col_cnt(table, col + 1); + if(row >= ext->row_cnt) lv_table_set_row_cnt(table, row + 1); uint32_t cell = row * ext->col_cnt + col; lv_table_cell_format_t format; @@ -192,31 +194,19 @@ void lv_table_set_row_cnt(lv_obj_t * table, uint16_t row_cnt) uint16_t old_row_cnt = ext->row_cnt; ext->row_cnt = row_cnt; - if(ext->row_cnt > 0) { - ext->row_h = lv_mem_realloc(ext->row_h, ext->row_cnt * sizeof(ext->row_h[0])); - LV_ASSERT_MEM(ext->row_h); - if(ext->row_h == NULL) return; - } - else { - lv_mem_free(ext->row_h); - ext->row_h = NULL; - } + ext->row_h = lv_mem_realloc(ext->row_h, ext->row_cnt * sizeof(ext->row_h[0])); + LV_ASSERT_MEM(ext->row_h); + if(ext->row_h == NULL) return; - if(ext->row_cnt > 0 && ext->col_cnt > 0) { - ext->cell_data = lv_mem_realloc(ext->cell_data, ext->row_cnt * ext->col_cnt * sizeof(char *)); - LV_ASSERT_MEM(ext->cell_data); - if(ext->cell_data == NULL) return; + ext->cell_data = lv_mem_realloc(ext->cell_data, ext->row_cnt * ext->col_cnt * sizeof(char *)); + LV_ASSERT_MEM(ext->cell_data); + if(ext->cell_data == NULL) return; - /*Initialize the new fields*/ - if(old_row_cnt < row_cnt) { - uint16_t old_cell_cnt = old_row_cnt * ext->col_cnt; - uint32_t new_cell_cnt = ext->col_cnt * ext->row_cnt; - _lv_memset_00(&ext->cell_data[old_cell_cnt], (new_cell_cnt - old_cell_cnt) * sizeof(ext->cell_data[0])); - } - } - else { - lv_mem_free(ext->cell_data); - ext->cell_data = NULL; + /*Initialize the new fields*/ + if(old_row_cnt < row_cnt) { + uint32_t old_cell_cnt = old_row_cnt * ext->col_cnt; + uint32_t new_cell_cnt = ext->col_cnt * ext->row_cnt; + _lv_memset_00(&ext->cell_data[old_cell_cnt], (new_cell_cnt - old_cell_cnt) * sizeof(ext->cell_data[0])); } refr_size(table); @@ -225,38 +215,35 @@ void lv_table_set_row_cnt(lv_obj_t * table, uint16_t row_cnt) /** * Set the number of columns * @param table table pointer to a Table object - * @param col_cnt number of columns. Must be < LV_TABLE_COL_MAX + * @param col_cnt number of columns. */ void lv_table_set_col_cnt(lv_obj_t * table, uint16_t col_cnt) { LV_ASSERT_OBJ(table, LV_OBJX_NAME); - if(col_cnt >= LV_TABLE_COL_MAX) { - LV_LOG_WARN("lv_table_set_col_cnt: too many columns. Must be < LV_TABLE_COL_MAX."); - return; - } - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); uint16_t old_col_cnt = ext->col_cnt; ext->col_cnt = col_cnt; + ext->col_w = lv_mem_realloc(ext->col_w, col_cnt * sizeof(ext->row_h[0])); + LV_ASSERT_MEM(ext->col_w); + if(ext->col_w == NULL) return; - if(ext->row_cnt > 0 && ext->col_cnt > 0) { - ext->cell_data = lv_mem_realloc(ext->cell_data, ext->row_cnt * ext->col_cnt * sizeof(char *)); - LV_ASSERT_MEM(ext->cell_data); - if(ext->cell_data == NULL) return; + ext->cell_data = lv_mem_realloc(ext->cell_data, ext->row_cnt * ext->col_cnt * sizeof(char *)); + LV_ASSERT_MEM(ext->cell_data); + if(ext->cell_data == NULL) return; - /*Initialize the new fields*/ - if(old_col_cnt < col_cnt) { - uint16_t old_cell_cnt = old_col_cnt * ext->row_cnt; - uint32_t new_cell_cnt = ext->col_cnt * ext->row_cnt; - _lv_memset_00(&ext->cell_data[old_cell_cnt], (new_cell_cnt - old_cell_cnt) * sizeof(ext->cell_data[0])); + /*Initialize the new fields*/ + if(old_col_cnt < col_cnt) { + uint32_t old_cell_cnt = old_col_cnt * ext->row_cnt; + uint32_t new_cell_cnt = ext->col_cnt * ext->row_cnt; + _lv_memset_00(&ext->cell_data[old_cell_cnt], (new_cell_cnt - old_cell_cnt) * sizeof(ext->cell_data[0])); + + uint32_t col; + for(col = old_cell_cnt; col < new_cell_cnt; col++) { + ext->col_w[col] = LV_DPI; } + } - } - else { - lv_mem_free(ext->cell_data); - ext->cell_data = NULL; - } refr_size(table); } @@ -270,13 +257,12 @@ void lv_table_set_col_width(lv_obj_t * table, uint16_t col_id, lv_coord_t w) { LV_ASSERT_OBJ(table, LV_OBJX_NAME); - if(col_id >= LV_TABLE_COL_MAX) { - LV_LOG_WARN("lv_table_set_col_width: too big 'col_id'. Must be < LV_TABLE_COL_MAX."); - return; - } - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - ext->col_w[col_id] = w; + + /*Auto expand*/ + if(col_id >= ext->col_cnt) lv_table_set_col_cnt(table, col_id + 1); + + ext->col_w[col_id] = w; refr_size(table); } @@ -292,15 +278,11 @@ void lv_table_set_cell_align(lv_obj_t * table, uint16_t row, uint16_t col, lv_la LV_ASSERT_OBJ(table, LV_OBJX_NAME); lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - if(col >= ext->col_cnt) { - LV_LOG_WARN("lv_table_set_cell_align: invalid column"); - return; - } /*Auto expand*/ - if(row >= ext->row_cnt) { - lv_table_set_row_cnt(table, row + 1); - } + if(col >= ext->col_cnt) lv_table_set_col_cnt(table, col + 1); + if(row >= ext->row_cnt) lv_table_set_row_cnt(table, row + 1); + uint32_t cell = row * ext->col_cnt + col; if(ext->cell_data[cell] == NULL) { @@ -330,15 +312,10 @@ void lv_table_set_cell_type(lv_obj_t * table, uint16_t row, uint16_t col, uint8_ LV_ASSERT_OBJ(table, LV_OBJX_NAME); lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - if(col >= ext->col_cnt) { - LV_LOG_WARN("lv_table_set_cell_type: invalid column"); - return; - } /*Auto expand*/ - if(row >= ext->row_cnt) { - lv_table_set_row_cnt(table, row + 1); - } + if(col >= ext->col_cnt) lv_table_set_col_cnt(table, col + 1); + if(row >= ext->row_cnt) lv_table_set_row_cnt(table, row + 1); uint32_t cell = row * ext->col_cnt + col; @@ -374,15 +351,10 @@ void lv_table_set_cell_crop(lv_obj_t * table, uint16_t row, uint16_t col, bool c LV_ASSERT_OBJ(table, LV_OBJX_NAME); lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - if(col >= ext->col_cnt) { - LV_LOG_WARN("lv_table_set_cell_crop: invalid column"); - return; - } /*Auto expand*/ - if(row >= ext->row_cnt) { - lv_table_set_row_cnt(table, row + 1); - } + if(col >= ext->col_cnt) lv_table_set_col_cnt(table, col + 1); + if(row >= ext->row_cnt) lv_table_set_row_cnt(table, row + 1); uint32_t cell = row * ext->col_cnt + col; @@ -413,15 +385,10 @@ void lv_table_set_cell_merge_right(lv_obj_t * table, uint16_t row, uint16_t col, LV_ASSERT_OBJ(table, LV_OBJX_NAME); lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - if(col >= ext->col_cnt) { - LV_LOG_WARN("lv_table_set_cell_merge_right: invalid column"); - return; - } /*Auto expand*/ - if(row >= ext->row_cnt) { - lv_table_set_row_cnt(table, row + 1); - } + if(col >= ext->col_cnt) lv_table_set_col_cnt(table, col + 1); + if(row >= ext->row_cnt) lv_table_set_row_cnt(table, row + 1); uint32_t cell = row * ext->col_cnt + col; @@ -504,12 +471,13 @@ lv_coord_t lv_table_get_col_width(lv_obj_t * table, uint16_t col_id) { LV_ASSERT_OBJ(table, LV_OBJX_NAME); - if(col_id >= LV_TABLE_COL_MAX) { + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); + + if(col_id >= ext->col_cnt) { LV_LOG_WARN("lv_table_set_col_width: too big 'col_id'. Must be < LV_TABLE_COL_MAX."); return 0; } - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); return ext->col_w[col_id]; } @@ -741,7 +709,7 @@ static lv_design_res_t lv_table_design(lv_obj_t * table, const lv_area_t * clip_ uint16_t row; uint16_t cell = 0; - cell_area.y2 = table->coords.y1 + bg_top - 1; + cell_area.y2 = table->coords.y1 + bg_top - 1 - lv_obj_get_scroll_top(table); for(row = 0; row < ext->row_cnt; row++) { lv_coord_t h_row = ext->row_h[row]; @@ -898,21 +866,24 @@ static lv_design_res_t lv_table_design(lv_obj_t * table, const lv_area_t * clip_ static lv_res_t lv_table_signal(lv_obj_t * table, lv_signal_t sign, void * param) { lv_res_t res; - if(sign == LV_SIGNAL_GET_STYLE) { + + /* Include the ancient signal function */ + res = ancestor_signal(table, sign, param); + if(res != LV_RES_OK) return res; + + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); + + if(sign == LV_SIGNAL_GET_TYPE) { + return _lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); + } + else if(sign == LV_SIGNAL_GET_STYLE) { lv_get_style_info_t * info = param; info->result = lv_table_get_style(table, info->part); if(info->result != NULL) return LV_RES_OK; else return ancestor_signal(table, sign, param); } - - /* Include the ancient signal function */ - res = ancestor_signal(table, sign, param); - if(res != LV_RES_OK) return res; - if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); - - if(sign == LV_SIGNAL_CLEANUP) { + else if(sign == LV_SIGNAL_CLEANUP) { /*Free the cell texts*/ - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); uint16_t i; for(i = 0; i < ext->col_cnt * ext->row_cnt; i++) { if(ext->cell_data[i]) { @@ -925,12 +896,24 @@ static lv_res_t lv_table_signal(lv_obj_t * table, lv_signal_t sign, void * param if(ext->row_h) lv_mem_free(ext->row_h); for(i = 0; i < LV_TABLE_CELL_STYLE_CNT; i++) { - lv_obj_clean_style_list(table, LV_TABLE_PART_CELL1 + i); + _lv_obj_reset_style_list_no_refr(table, LV_TABLE_PART_CELL1 + i); } } else if(sign == LV_SIGNAL_STYLE_CHG) { refr_size(table); } + else if(sign == LV_SIGNAL_GET_SELF_SIZE) { + lv_point_t * p = param; + uint32_t i; + lv_coord_t w = 0; + for(i = 0; i < ext->col_cnt; i++) w += ext->col_w[i]; + + lv_coord_t h = 0; + for(i = 0; i < ext->row_cnt; i++) h += ext->row_h[i]; + + p->x = w; + p->y = h; + } return res; } @@ -961,20 +944,9 @@ static lv_style_list_t * lv_table_get_style(lv_obj_t * table, uint8_t part) static void refr_size(lv_obj_t * table) { - - lv_coord_t h = 0; - lv_coord_t w = 0; - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - if(ext->row_cnt == 0 || ext->col_cnt == 0) { - lv_obj_set_size(table, w, h); - return; - } - uint16_t i; - for(i = 0; i < ext->col_cnt; i++) { - w += ext->col_w[i]; - } + uint32_t i; lv_style_int_t cell_left[LV_TABLE_CELL_STYLE_CNT]; lv_style_int_t cell_right[LV_TABLE_CELL_STYLE_CNT]; @@ -999,18 +971,9 @@ static void refr_size(lv_obj_t * table) for(i = 0; i < ext->row_cnt; i++) { ext->row_h[i] = get_row_height(table, i, font, letter_space, line_space, cell_left, cell_right, cell_top, cell_bottom); - h += ext->row_h[i]; } - lv_style_int_t bg_top = lv_obj_get_style_pad_top(table, LV_TABLE_PART_BG); - lv_style_int_t bg_bottom = lv_obj_get_style_pad_bottom(table, LV_TABLE_PART_BG); - lv_style_int_t bg_left = lv_obj_get_style_pad_left(table, LV_TABLE_PART_BG); - lv_style_int_t bg_right = lv_obj_get_style_pad_right(table, LV_TABLE_PART_BG); - w += bg_left + bg_right; - h += bg_top + bg_bottom; - - lv_obj_set_size(table, w + 1, h + 1); - lv_obj_invalidate(table); /*Always invalidate even if the size hasn't changed*/ + _lv_obj_handle_self_size_chg(table); } static lv_coord_t get_row_height(lv_obj_t * table, uint16_t row_id, const lv_font_t ** font, diff --git a/src/lv_widgets/lv_table.h b/src/lv_widgets/lv_table.h index d05f2ce9a..f1c2131b7 100644 --- a/src/lv_widgets/lv_table.h +++ b/src/lv_widgets/lv_table.h @@ -41,8 +41,9 @@ extern "C" { # define LV_TABLE_CELL_STYLE_CNT 4 #endif #if (LV_TABLE_CELL_STYLE_CNT > 16) -# error LV_TABLE_CELL_STYLE_CNT cannot exceed 16 +# error "LV_TABLE_CELL_STYLE_CNT cannot exceed 16" #endif + /********************** * TYPEDEFS **********************/ @@ -70,7 +71,7 @@ typedef struct { char ** cell_data; lv_coord_t * row_h; lv_style_list_t cell_style[LV_TABLE_CELL_STYLE_CNT]; - lv_coord_t col_w[LV_TABLE_COL_MAX]; + lv_coord_t * col_w; uint16_t cell_types : LV_TABLE_CELL_STYLE_CNT; /*Keep track which cell types exists to avoid dealing with unused ones*/ } lv_table_ext_t; diff --git a/src/lv_widgets/lv_textarea.c b/src/lv_widgets/lv_textarea.c index 2b1489462..2a53d123e 100644 --- a/src/lv_widgets/lv_textarea.c +++ b/src/lv_widgets/lv_textarea.c @@ -13,6 +13,7 @@ #include "../lv_misc/lv_debug.h" #include "../lv_core/lv_group.h" #include "../lv_core/lv_refr.h" +#include "../lv_core/lv_indev.h" #include "../lv_draw/lv_draw.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_anim.h" @@ -46,10 +47,7 @@ * STATIC PROTOTYPES **********************/ static lv_design_res_t lv_textarea_design(lv_obj_t * ta, const lv_area_t * clip_area, lv_design_mode_t mode); -static lv_design_res_t lv_textarea_scrollable_design(lv_obj_t * scrl, const lv_area_t * clip_area, - lv_design_mode_t mode); static lv_res_t lv_textarea_signal(lv_obj_t * ta, lv_signal_t sign, void * param); -static lv_res_t lv_textarea_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, void * param); static lv_style_list_t * lv_textarea_get_style(lv_obj_t * ta, uint8_t part); #if LV_USE_ANIMATION static void cursor_blink_anim(lv_obj_t * ta, lv_anim_value_t show); @@ -61,6 +59,8 @@ static bool char_is_accepted(lv_obj_t * ta, uint32_t c); static void refr_cursor_area(lv_obj_t * ta); static void update_cursor_position_on_click(lv_obj_t * ta, lv_signal_t sign, lv_indev_t * click_source); static lv_res_t insert_handler(lv_obj_t * ta, const char * txt); +static void draw_placeholder(lv_obj_t * ta, const lv_area_t * clip_area); +static void draw_cursor(lv_obj_t * ta, const lv_area_t * clip_area); /********************** * STATIC VARIABLES @@ -90,14 +90,12 @@ lv_obj_t * lv_textarea_create(lv_obj_t * par, const lv_obj_t * copy) LV_LOG_TRACE("text area create started"); /*Create the ancestor object*/ - lv_obj_t * ta = lv_page_create(par, copy); + lv_obj_t * ta = lv_obj_create(par, copy); LV_ASSERT_MEM(ta); if(ta == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(ta); if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(ta); - if(scrl_signal == NULL) scrl_signal = lv_obj_get_signal_cb(lv_page_get_scrollable(ta)); - if(scrl_design == NULL) scrl_design = lv_obj_get_design_cb(lv_page_get_scrollable(ta)); /*Allocate the object type specific extended data*/ lv_textarea_ext_t * ext = lv_obj_allocate_ext_attr(ta, sizeof(lv_textarea_ext_t)); @@ -134,30 +132,19 @@ lv_obj_t * lv_textarea_create(lv_obj_t * par, const lv_obj_t * copy) #endif lv_obj_set_signal_cb(ta, lv_textarea_signal); - lv_obj_set_signal_cb(lv_page_get_scrollable(ta), lv_textarea_scrollable_signal); lv_obj_set_design_cb(ta, lv_textarea_design); /*Init the new text area object*/ if(copy == NULL) { - lv_page_set_scrollable_fit2(ta, LV_FIT_PARENT, LV_FIT_TIGHT); - ext->label = lv_label_create(ta, NULL); - - lv_obj_set_design_cb(ext->page.scrl, lv_textarea_scrollable_design); - lv_label_set_long_mode(ext->label, LV_LABEL_LONG_BREAK); lv_label_set_text(ext->label, "Text area"); - lv_obj_set_click(ext->label, false); lv_obj_set_size(ta, LV_TEXTAREA_DEF_WIDTH, LV_TEXTAREA_DEF_HEIGHT); - lv_textarea_set_scrollbar_mode(ta, LV_SCROLLBAR_MODE_DRAG); - - lv_obj_reset_style_list(ta, LV_PAGE_PART_SCROLLABLE); lv_theme_apply(ta, LV_THEME_TEXTAREA); } /*Copy an existing object*/ else { - lv_obj_set_design_cb(ext->page.scrl, lv_textarea_scrollable_design); lv_textarea_ext_t * copy_ext = lv_obj_get_ext_attr(copy); ext->label = lv_label_create(ta, copy_ext->label); ext->pwd_mode = copy_ext->pwd_mode; @@ -188,7 +175,7 @@ lv_obj_t * lv_textarea_create(lv_obj_t * par, const lv_obj_t * copy) if(copy_ext->one_line) lv_textarea_set_one_line(ta, true); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(ta, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); + _lv_obj_refresh_style(ta, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } #if LV_USE_ANIMATION @@ -261,10 +248,6 @@ void lv_textarea_add_char(lv_obj_t * ta, uint32_t c) } - /*If a new line was added it shouldn't show edge flash effect*/ - bool edge_flash_en = lv_textarea_get_edge_flash(ta); - lv_textarea_set_edge_flash(ta, false); - if(ext->pwd_mode != 0) pwd_char_hider(ta); /*Make sure all the current text contains only '*'*/ /*If the textarea is empty, invalidate it to hide the placeholder*/ @@ -313,9 +296,6 @@ void lv_textarea_add_char(lv_obj_t * ta, uint32_t c) /*Move the cursor after the new character*/ lv_textarea_set_cursor_pos(ta, lv_textarea_get_cursor_pos(ta) + 1); - /*Revert the original edge flash state*/ - lv_textarea_set_edge_flash(ta, edge_flash_en); - lv_event_send(ta, LV_EVENT_VALUE_CHANGED, NULL); } @@ -346,10 +326,6 @@ void lv_textarea_add_text(lv_obj_t * ta, const char * txt) lv_res_t res = insert_handler(ta, txt); if(res != LV_RES_OK) return; - /*If a new line was added it shouldn't show edge flash effect*/ - bool edge_flash_en = lv_textarea_get_edge_flash(ta); - lv_textarea_set_edge_flash(ta, false); - /*If the textarea is empty, invalidate it to hide the placeholder*/ if(ext->placeholder_txt) { const char * txt_act = lv_label_get_text(ext->label); @@ -395,9 +371,6 @@ void lv_textarea_add_text(lv_obj_t * ta, const char * txt) /*Move the cursor after the new text*/ lv_textarea_set_cursor_pos(ta, lv_textarea_get_cursor_pos(ta) + _lv_txt_get_encoded_length(txt)); - /*Revert the original edge flash state*/ - lv_textarea_set_edge_flash(ta, edge_flash_en); - lv_event_send(ta, LV_EVENT_VALUE_CHANGED, NULL); } @@ -434,12 +407,6 @@ void lv_textarea_del_char(lv_obj_t * ta) if(txt[0] == '\0') lv_obj_invalidate(ta); } - /*Don't let 'width == 0' because cursor will not be visible*/ - if(lv_obj_get_width(ext->label) == 0) { - lv_style_int_t border_width = lv_obj_get_style_border_width(ta, LV_TEXTAREA_PART_CURSOR); - lv_obj_set_width(ext->label, border_width == 0 ? 1 : border_width); - } - if(ext->pwd_mode != 0) { uint32_t byte_pos = _lv_txt_encoded_get_byte_id(ext->pwd_tmp, ext->cursor.pos - 1); _lv_txt_cut(ext->pwd_tmp, ext->cursor.pos - 1, _lv_txt_encoded_size(&ext->pwd_tmp[byte_pos])); @@ -513,12 +480,6 @@ void lv_textarea_set_text(lv_obj_t * ta, const char * txt) if(txt_act[0] == '\0') lv_obj_invalidate(ta); } - /*Don't let 'width == 0' because the cursor will not be visible*/ - if(lv_obj_get_width(ext->label) == 0) { - lv_style_int_t border_width = lv_obj_get_style_border_width(ta, LV_TEXTAREA_PART_CURSOR); - lv_obj_set_width(ext->label, border_width == 0 ? 1 : border_width); - } - if(ext->pwd_mode != 0) { ext->pwd_tmp = lv_mem_realloc(ext->pwd_tmp, strlen(txt) + 1); LV_ASSERT_MEM(ext->pwd_tmp); @@ -619,9 +580,9 @@ void lv_textarea_set_cursor_pos(lv_obj_t * ta, int32_t pos) /*Position the label to make the cursor visible*/ lv_obj_t * label_par = lv_obj_get_parent(ext->label); lv_point_t cur_pos; - const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_BG); - lv_style_int_t top = lv_obj_get_style_pad_top(ta, LV_TEXTAREA_PART_BG); - lv_style_int_t bottom = lv_obj_get_style_pad_bottom(ta, LV_TEXTAREA_PART_BG); + const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_MAIN); + lv_style_int_t top = lv_obj_get_style_pad_top(ta, LV_TEXTAREA_PART_MAIN); + lv_style_int_t bottom = lv_obj_get_style_pad_bottom(ta, LV_TEXTAREA_PART_MAIN); lv_area_t label_cords; lv_area_t ta_cords; lv_label_get_letter_pos(ext->label, pos, &cur_pos); @@ -630,25 +591,25 @@ void lv_textarea_set_cursor_pos(lv_obj_t * ta, int32_t pos) /*Check the top*/ lv_coord_t font_h = lv_font_get_line_height(font); - if(lv_obj_get_y(label_par) + cur_pos.y < 0) { - lv_obj_set_y(label_par, -cur_pos.y + top); + if(cur_pos.y < lv_obj_get_scroll_top(ta)) { + lv_obj_scroll_to_y(label_par, cur_pos.y, LV_ANIM_ON); } - /*Check the bottom*/ - if(label_cords.y1 + cur_pos.y + font_h + bottom > ta_cords.y2) { - lv_obj_set_y(label_par, -(cur_pos.y - lv_obj_get_height(ta) + font_h + top + bottom)); - } - /*Check the left (use the font_h as general unit)*/ - if(lv_obj_get_x(label_par) + cur_pos.x < font_h) { - lv_obj_set_x(label_par, -cur_pos.x + font_h); - } - - lv_style_int_t right = lv_obj_get_style_pad_right(ta, LV_TEXTAREA_PART_BG); - lv_style_int_t left = lv_obj_get_style_pad_left(ta, LV_TEXTAREA_PART_BG); - /*Check the right (use the font_h as general unit)*/ - if(label_cords.x1 + cur_pos.x + font_h + right > ta_cords.x2) { - lv_obj_set_x(label_par, -(cur_pos.x - lv_obj_get_width(ta) + font_h + left + right)); - } +// /*Check the bottom*/ +// if(label_cords.y1 + cur_pos.y + font_h + bottom > ta_cords.y2) { +// lv_obj_set_y(label_par, -(cur_pos.y - lv_obj_get_height(ta) + font_h + top + bottom)); +// } +// /*Check the left (use the font_h as general unit)*/ +// if(lv_obj_get_x(label_par) + cur_pos.x < font_h) { +// lv_obj_set_x(label_par, -cur_pos.x + font_h); +// } +// +// lv_style_int_t right = lv_obj_get_style_pad_right(ta, LV_TEXTAREA_PART_MAIN); +// lv_style_int_t left = lv_obj_get_style_pad_left(ta, LV_TEXTAREA_PART_MAIN); +// /*Check the right (use the font_h as general unit)*/ +// if(label_cords.x1 + cur_pos.x + font_h + right > ta_cords.x2) { +// lv_obj_set_x(label_par, -(cur_pos.x - lv_obj_get_width(ta) + font_h + left + right)); +// } ext->cursor.valid_x = cur_pos.x; @@ -757,27 +718,20 @@ void lv_textarea_set_one_line(lv_obj_t * ta, bool en) lv_label_align_t old_align = lv_label_get_align(ext->label); if(en) { - lv_style_int_t top = lv_obj_get_style_pad_top(ta, LV_TEXTAREA_PART_BG); - lv_style_int_t bottom = lv_obj_get_style_pad_bottom(ta, LV_TEXTAREA_PART_BG); - lv_style_int_t left = lv_obj_get_style_pad_left(ta, LV_TEXTAREA_PART_BG); - const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_BG); + const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_MAIN); lv_coord_t font_h = lv_font_get_line_height(font); ext->one_line = 1; - lv_page_set_scrollable_fit2(ta, LV_FIT_MAX, LV_FIT_PARENT); - lv_obj_set_height(ta, font_h + top + bottom); + lv_obj_set_content_height(ta, font_h); lv_label_set_long_mode(ext->label, LV_LABEL_LONG_EXPAND); - lv_obj_set_pos(lv_page_get_scrollable(ta), left, top); + lv_obj_scroll_to(ta, 0, 0, LV_ANIM_OFF); } else { - lv_style_int_t top = lv_obj_get_style_pad_top(ta, LV_TEXTAREA_PART_BG); - lv_style_int_t left = lv_obj_get_style_pad_left(ta, LV_TEXTAREA_PART_BG); ext->one_line = 0; - lv_page_set_scrollable_fit2(ta, LV_FIT_PARENT, LV_FIT_TIGHT); lv_label_set_long_mode(ext->label, LV_LABEL_LONG_BREAK); lv_obj_set_height(ta, LV_TEXTAREA_DEF_HEIGHT); - lv_obj_set_pos(lv_page_get_scrollable(ta), left, top); + lv_obj_scroll_to(ta, 0, 0, LV_ANIM_OFF); } /* `refr_cursor_area` is called at the end of lv_ta_set_text_align */ @@ -804,15 +758,13 @@ void lv_textarea_set_text_align(lv_obj_t * ta, lv_label_align_t align) /*Normal left align. Just let the text expand*/ if(align == LV_LABEL_ALIGN_LEFT) { lv_label_set_long_mode(label, LV_LABEL_LONG_EXPAND); - lv_page_set_scrollable_fit2(ta, LV_FIT_MAX, LV_FIT_PARENT); lv_label_set_align(label, align); } /*Else use fix label width equal to the Text area width*/ else { lv_label_set_long_mode(label, LV_LABEL_LONG_CROP); - lv_obj_set_width(label, lv_page_get_width_fit(ta)); + lv_obj_set_width(label, lv_obj_get_width_fit(ta)); lv_label_set_align(label, align); - lv_page_set_scrollable_fit2(ta, LV_FIT_PARENT, LV_FIT_PARENT); } } @@ -1227,8 +1179,8 @@ void lv_textarea_cursor_down(lv_obj_t * ta) /*Increment the y with one line and keep the valid x*/ - lv_style_int_t line_space = lv_obj_get_style_text_line_space(ta, LV_TEXTAREA_PART_BG); - const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_BG); + lv_style_int_t line_space = lv_obj_get_style_text_line_space(ta, LV_TEXTAREA_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_MAIN); lv_coord_t font_h = lv_font_get_line_height(font); pos.y += font_h + line_space + 1; pos.x = ext->cursor.valid_x; @@ -1259,8 +1211,8 @@ void lv_textarea_cursor_up(lv_obj_t * ta) lv_label_get_letter_pos(ext->label, lv_textarea_get_cursor_pos(ta), &pos); /*Decrement the y with one line and keep the valid x*/ - lv_style_int_t line_space = lv_obj_get_style_text_line_space(ta, LV_TEXTAREA_PART_BG); - const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_BG); + lv_style_int_t line_space = lv_obj_get_style_text_line_space(ta, LV_TEXTAREA_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_MAIN); lv_coord_t font_h = lv_font_get_line_height(font); pos.y -= font_h + line_space - 1; pos.x = ext->cursor.valid_x; @@ -1295,103 +1247,16 @@ static lv_design_res_t lv_textarea_design(lv_obj_t * ta, const lv_area_t * clip_ else if(mode == LV_DESIGN_DRAW_MAIN) { /*Draw the object*/ ancestor_design(ta, clip_area, mode); + draw_placeholder(ta, clip_area); } else if(mode == LV_DESIGN_DRAW_POST) { ancestor_design(ta, clip_area, mode); + draw_cursor(ta, clip_area); } return LV_DESIGN_RES_OK; } -/** - * An extended scrollable design of the page. Calls the normal design function and draws a cursor. - * @param scrl pointer to the scrollable part of the Text area - * @param clip_area the object will be drawn only in this area - * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area - * (return 'true' if yes) - * LV_DESIGN_DRAW_MAIN: draw the object (always return 'true') - * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @return return true/false, depends on 'mode' - */ -static lv_design_res_t lv_textarea_scrollable_design(lv_obj_t * scrl, const lv_area_t * clip_area, - lv_design_mode_t mode) -{ - if(mode == LV_DESIGN_COVER_CHK) { - /*Return false if the object is not covers the mask_p area*/ - return scrl_design(scrl, clip_area, mode); - } - else if(mode == LV_DESIGN_DRAW_MAIN) { - /*Draw the object*/ - scrl_design(scrl, clip_area, mode); - } - else if(mode == LV_DESIGN_DRAW_POST) { - scrl_design(scrl, clip_area, mode); - - lv_obj_t * ta = lv_obj_get_parent(scrl); - lv_textarea_ext_t * ext = lv_obj_get_ext_attr(ta); - const char * txt = lv_label_get_text(ext->label); - - /*Draw the place holder*/ - if(txt[0] == '\0' && ext->placeholder_txt && ext->placeholder_txt[0] != 0) { - lv_draw_label_dsc_t ph_dsc; - lv_draw_label_dsc_init(&ph_dsc); - lv_obj_init_draw_label_dsc(ta, LV_TEXTAREA_PART_PLACEHOLDER, &ph_dsc); - switch(lv_label_get_align(ext->label)) { - case LV_LABEL_ALIGN_CENTER: - ph_dsc.flag |= LV_TXT_FLAG_CENTER; - break; - case LV_LABEL_ALIGN_RIGHT: - ph_dsc.flag |= LV_TXT_FLAG_RIGHT; - break; - default: - break; - } - - if(ext->one_line) ph_dsc.flag |= LV_TXT_FLAG_EXPAND; - - lv_draw_label(&scrl->coords, clip_area, &ph_dsc, ext->placeholder_txt, NULL); - } - - /*Draw the cursor*/ - - if(ext->cursor.hidden || ext->cursor.state == 0) { - return LV_DESIGN_RES_OK; /*The cursor is not visible now*/ - } - - lv_draw_rect_dsc_t cur_dsc; - lv_draw_rect_dsc_init(&cur_dsc); - lv_obj_init_draw_rect_dsc(ta, LV_TEXTAREA_PART_CURSOR, &cur_dsc); - - /*Draw he cursor according to the type*/ - lv_area_t cur_area; - lv_area_copy(&cur_area, &ext->cursor.area); - - cur_area.x1 += ext->label->coords.x1; - cur_area.y1 += ext->label->coords.y1; - cur_area.x2 += ext->label->coords.x1; - cur_area.y2 += ext->label->coords.y1; - - lv_draw_rect(&cur_area, clip_area, &cur_dsc); - - char letter_buf[8] = {0}; - _lv_memcpy(letter_buf, &txt[ext->cursor.txt_byte_pos], _lv_txt_encoded_size(&txt[ext->cursor.txt_byte_pos])); - - if(cur_dsc.bg_opa == LV_OPA_COVER) { - lv_style_int_t left = lv_obj_get_style_pad_left(ta, LV_TEXTAREA_PART_CURSOR); - lv_style_int_t top = lv_obj_get_style_pad_top(ta, LV_TEXTAREA_PART_CURSOR); - cur_area.x1 += left; - cur_area.y1 += top; - - lv_draw_label_dsc_t cur_label_dsc; - lv_draw_label_dsc_init(&cur_label_dsc); - lv_obj_init_draw_label_dsc(ta, LV_TEXTAREA_PART_CURSOR, &cur_label_dsc); - lv_draw_label(&cur_area, clip_area, &cur_label_dsc, letter_buf, NULL); - } - } - - return LV_DESIGN_RES_OK; -} - /** * Signal function of the text area * @param ta pointer to a text area object @@ -1402,41 +1267,38 @@ static lv_design_res_t lv_textarea_scrollable_design(lv_obj_t * scrl, const lv_a static lv_res_t lv_textarea_signal(lv_obj_t * ta, lv_signal_t sign, void * param) { lv_res_t res; - if(sign == LV_SIGNAL_GET_STYLE) { - lv_get_style_info_t * info = param; - info->result = lv_textarea_get_style(ta, info->part); - if(info->result != NULL) return LV_RES_OK; - else return ancestor_signal(ta, sign, param); - } - else if(sign == LV_SIGNAL_GET_STATE_DSC) { - return ancestor_signal(ta, sign, param); - } - /* Include the ancient signal function */ res = ancestor_signal(ta, sign, param); if(res != LV_RES_OK) return res; - if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_textarea_ext_t * ext = lv_obj_get_ext_attr(ta); - if(sign == LV_SIGNAL_CLEANUP) { + + if(sign == LV_SIGNAL_GET_TYPE) { + return _lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); + } + else if(sign == LV_SIGNAL_GET_STYLE) { + lv_get_style_info_t * info = param; + info->result = lv_textarea_get_style(ta, info->part); + if(info->result != NULL) return LV_RES_OK; + } + else if(sign == LV_SIGNAL_CLEANUP) { if(ext->pwd_tmp != NULL) lv_mem_free(ext->pwd_tmp); if(ext->placeholder_txt != NULL) lv_mem_free(ext->placeholder_txt); ext->pwd_tmp = NULL; ext->placeholder_txt = NULL; - lv_obj_clean_style_list(ta, LV_TEXTAREA_PART_CURSOR); - lv_obj_clean_style_list(ta, LV_TEXTAREA_PART_PLACEHOLDER); + _lv_obj_reset_style_list_no_refr(ta, LV_TEXTAREA_PART_CURSOR); + _lv_obj_reset_style_list_no_refr(ta, LV_TEXTAREA_PART_PLACEHOLDER); /* (The created label will be deleted automatically) */ - } else if(sign == LV_SIGNAL_STYLE_CHG) { if(ext->label) { if(ext->one_line) { - lv_style_int_t top = lv_obj_get_style_pad_top(ta, LV_TEXTAREA_PART_BG); - lv_style_int_t bottom = lv_obj_get_style_pad_bottom(ta, LV_TEXTAREA_PART_BG); - const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_BG); + lv_style_int_t top = lv_obj_get_style_pad_top(ta, LV_TEXTAREA_PART_MAIN); + lv_style_int_t bottom = lv_obj_get_style_pad_bottom(ta, LV_TEXTAREA_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_MAIN); /*In one line mode refresh the Text Area height because 'vpad' can modify it*/ lv_coord_t font_h = lv_font_get_line_height(font); @@ -1445,7 +1307,7 @@ static lv_res_t lv_textarea_signal(lv_obj_t * ta, lv_signal_t sign, void * param } else { /*In not one line mode refresh the Label width because 'hpad' can modify it*/ - lv_obj_set_width(ext->label, lv_page_get_width_fit(ta)); + lv_obj_set_width(ext->label, lv_obj_get_width_fit(ta)); lv_obj_set_pos(ext->label, 0, 0); /*Be sure the Label is in the correct position*/ } @@ -1457,7 +1319,7 @@ static lv_res_t lv_textarea_signal(lv_obj_t * ta, lv_signal_t sign, void * param /*Set the label width according to the text area width*/ if(ext->label) { if(lv_obj_get_width(ta) != lv_area_get_width(param) || lv_obj_get_height(ta) != lv_area_get_height(param)) { - lv_obj_set_width(ext->label, lv_page_get_width_fit(ta)); + lv_obj_set_width(ext->label, lv_obj_get_width_fit(ta)); lv_obj_set_pos(ext->label, 0, 0); lv_label_set_text(ext->label, NULL); /*Refresh the label*/ @@ -1504,57 +1366,6 @@ static lv_res_t lv_textarea_signal(lv_obj_t * ta, lv_signal_t sign, void * param return res; } -/** - * Signal function of the scrollable part of the text area - * @param scrl pointer to scrollable part of a text area object - * @param sign a signal type from lv_signal_t enum - * @param param pointer to a signal specific variable - * @return LV_RES_OK: the object is not deleted in the function; LV_RES_INV: the object is deleted - */ -static lv_res_t lv_textarea_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* Include the ancient signal function */ - res = scrl_signal(scrl, sign, param); - - if(res != LV_RES_OK) return res; - if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, ""); - - lv_obj_t * ta = lv_obj_get_parent(scrl); - lv_textarea_ext_t * ext = lv_obj_get_ext_attr(ta); - - if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { - /*Set ext. size because the cursor might be out of this object*/ - lv_style_int_t line_space = lv_obj_get_style_text_line_space(ta, LV_TEXTAREA_PART_BG); - const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_BG); - lv_coord_t font_h = lv_font_get_line_height(font); - scrl->ext_draw_pad = LV_MATH_MAX(scrl->ext_draw_pad, line_space + font_h); - } - else if(sign == LV_SIGNAL_COORD_CHG) { - /*Set the label width according to the text area width*/ - if(ext->label) { - if(lv_obj_get_width(scrl) != lv_area_get_width(param) || - lv_obj_get_height(scrl) != lv_area_get_height(param)) { - - lv_obj_set_width(ext->label, lv_page_get_width_fit(ta)); - lv_obj_set_pos(ext->label, 0, 0); - - lv_label_set_text(ext->label, NULL); /*Refresh the label*/ - refr_cursor_area(ta); - } - - } - - } - else if(sign == LV_SIGNAL_PRESSING || sign == LV_SIGNAL_PRESSED || sign == LV_SIGNAL_PRESS_LOST || - sign == LV_SIGNAL_RELEASED) { - update_cursor_position_on_click(ta, sign, (lv_indev_t *)param); - } - - return res; -} - /** * Get the style descriptor of a part of the object * @param page pointer the object @@ -1569,20 +1380,12 @@ static lv_style_list_t * lv_textarea_get_style(lv_obj_t * ta, uint8_t part) lv_style_list_t * style_dsc_p; switch(part) { - case LV_TEXTAREA_PART_BG: + case LV_TEXTAREA_PART_MAIN: style_dsc_p = &ta->style_list; break; - case LV_TEXTAREA_PART_SCROLLBAR: - style_dsc_p = &ext->page.scrlbar.style; - break; case LV_TEXTAREA_PART_CURSOR: style_dsc_p = &ext->cursor.style; break; -#if LV_USE_ANIMATION - case LV_TEXTAREA_PART_EDGE_FLASH: - style_dsc_p = &ext->page.edge_flash.style; - break; -#endif case LV_TEXTAREA_PART_PLACEHOLDER: style_dsc_p = &ext->style_placeholder; break; @@ -1654,7 +1457,7 @@ static void pwd_char_hider(lv_obj_t * ta) if(enc_len == 0) return; /*If the textarea's font has "bullet" character use it else fallback to "*"*/ - const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_BG); + const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_MAIN); lv_font_glyph_dsc_t g; bool has_bullet; has_bullet = lv_font_get_glyph_dsc(font, &g, LV_TEXTAREA_PWD_BULLET_UNICODE, 0); @@ -1715,8 +1518,8 @@ static void refr_cursor_area(lv_obj_t * ta) { lv_textarea_ext_t * ext = lv_obj_get_ext_attr(ta); - const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_BG); - lv_style_int_t line_space = lv_obj_get_style_text_line_space(ta, LV_TEXTAREA_PART_BG); + const lv_font_t * font = lv_obj_get_style_text_font(ta, LV_TEXTAREA_PART_MAIN); + lv_style_int_t line_space = lv_obj_get_style_text_line_space(ta, LV_TEXTAREA_PART_MAIN); uint32_t cur_pos = lv_textarea_get_cursor_pos(ta); const char * txt = lv_label_get_text(ext->label); @@ -1796,7 +1599,6 @@ static void refr_cursor_area(lv_obj_t * ta) static void update_cursor_position_on_click(lv_obj_t * ta, lv_signal_t sign, lv_indev_t * click_source) { - if(click_source == NULL) return; lv_textarea_ext_t * ext = lv_obj_get_ext_attr(ta); @@ -1926,4 +1728,72 @@ static lv_res_t insert_handler(lv_obj_t * ta, const char * txt) return LV_RES_OK; } +static void draw_placeholder(lv_obj_t * ta, const lv_area_t * clip_area) +{ + lv_textarea_ext_t * ext = lv_obj_get_ext_attr(ta); + const char * txt = lv_label_get_text(ext->label); + + /*Draw the place holder*/ + if(txt[0] == '\0' && ext->placeholder_txt && ext->placeholder_txt[0] != 0) { + lv_draw_label_dsc_t ph_dsc; + lv_draw_label_dsc_init(&ph_dsc); + lv_obj_init_draw_label_dsc(ta, LV_TEXTAREA_PART_PLACEHOLDER, &ph_dsc); + switch(lv_label_get_align(ext->label)) { + case LV_LABEL_ALIGN_CENTER: + ph_dsc.flag |= LV_TXT_FLAG_CENTER; + break; + case LV_LABEL_ALIGN_RIGHT: + ph_dsc.flag |= LV_TXT_FLAG_RIGHT; + break; + default: + break; + } + + if(ext->one_line) ph_dsc.flag |= LV_TXT_FLAG_EXPAND; + + lv_draw_label(&ta->coords, clip_area, &ph_dsc, ext->placeholder_txt, NULL); + } +} + +static void draw_cursor(lv_obj_t * ta, const lv_area_t * clip_area) +{ + lv_textarea_ext_t * ext = lv_obj_get_ext_attr(ta); + const char * txt = lv_label_get_text(ext->label); + + /*Draw the cursor*/ + if(ext->cursor.hidden || ext->cursor.state == 0) { + return; /*The cursor is not visible now*/ + } + + lv_draw_rect_dsc_t cur_dsc; + lv_draw_rect_dsc_init(&cur_dsc); + lv_obj_init_draw_rect_dsc(ta, LV_TEXTAREA_PART_CURSOR, &cur_dsc); + + /*Draw he cursor according to the type*/ + lv_area_t cur_area; + lv_area_copy(&cur_area, &ext->cursor.area); + + cur_area.x1 += ext->label->coords.x1; + cur_area.y1 += ext->label->coords.y1; + cur_area.x2 += ext->label->coords.x1; + cur_area.y2 += ext->label->coords.y1; + + lv_draw_rect(&cur_area, clip_area, &cur_dsc); + + char letter_buf[8] = {0}; + _lv_memcpy(letter_buf, &txt[ext->cursor.txt_byte_pos], _lv_txt_encoded_size(&txt[ext->cursor.txt_byte_pos])); + + if(cur_dsc.bg_opa == LV_OPA_COVER) { + lv_style_int_t left = lv_obj_get_style_pad_left(ta, LV_TEXTAREA_PART_CURSOR); + lv_style_int_t top = lv_obj_get_style_pad_top(ta, LV_TEXTAREA_PART_CURSOR); + cur_area.x1 += left; + cur_area.y1 += top; + + lv_draw_label_dsc_t cur_label_dsc; + lv_draw_label_dsc_init(&cur_label_dsc); + lv_obj_init_draw_label_dsc(ta, LV_TEXTAREA_PART_CURSOR, &cur_label_dsc); + lv_draw_label(&cur_area, clip_area, &cur_label_dsc, letter_buf, NULL); + } +} + #endif diff --git a/src/lv_widgets/lv_textarea.h b/src/lv_widgets/lv_textarea.h index dbca0db45..0141d85e8 100644 --- a/src/lv_widgets/lv_textarea.h +++ b/src/lv_widgets/lv_textarea.h @@ -18,16 +18,11 @@ extern "C" { #if LV_USE_TEXTAREA != 0 /*Testing of dependencies*/ -#if LV_USE_PAGE == 0 -#error "lv_ta: lv_page is required. Enable it in lv_conf.h (LV_USE_PAGE 1) " -#endif - #if LV_USE_LABEL == 0 #error "lv_ta: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " #endif #include "../lv_core/lv_obj.h" -#include "lv_page.h" #include "lv_label.h" /********************* @@ -43,7 +38,6 @@ LV_EXPORT_CONST_INT(LV_TEXTAREA_CURSOR_LAST); /*Data of text area*/ typedef struct { - lv_page_ext_t page; /*Ext. of ancestor*/ /*New data for this type */ lv_obj_t * label; /*Label of the text area*/ char * placeholder_txt; /*Place holder label. only visible if text is an empty string*/ @@ -77,15 +71,12 @@ typedef struct { /** Possible text areas styles. */ enum { - LV_TEXTAREA_PART_BG = LV_PAGE_PART_BG, /**< Text area background style */ - LV_TEXTAREA_PART_SCROLLBAR = LV_PAGE_PART_SCROLLBAR, /**< Scrollbar style */ - LV_TEXTAREA_PART_EDGE_FLASH = LV_PAGE_PART_EDGE_FLASH, /**< Edge flash style */ - LV_TEXTAREA_PART_CURSOR = _LV_PAGE_PART_VIRTUAL_LAST, /**< Cursor style */ + LV_TEXTAREA_PART_MAIN, /**< Text area background style */ + LV_TEXTAREA_PART_CURSOR, /**< Cursor style */ LV_TEXTAREA_PART_PLACEHOLDER, /**< Placeholder style */ _LV_TEXTAREA_PART_VIRTUAL_LAST, - - _LV_TEXTAREA_PART_REAL_LAST = _LV_PAGE_PART_REAL_LAST, }; + typedef uint8_t lv_textarea_style_t; /********************** @@ -219,37 +210,6 @@ void lv_textarea_set_max_length(lv_obj_t * ta, uint32_t num); */ void lv_textarea_set_insert_replace(lv_obj_t * ta, const char * txt); -/** - * Set the scroll bar mode of a text area - * @param ta pointer to a text area object - * @param sb_mode the new mode from 'lv_scrollbar_mode_t' enum - */ -static inline void lv_textarea_set_scrollbar_mode(lv_obj_t * ta, lv_scrollbar_mode_t mode) -{ - lv_page_set_scrollbar_mode(ta, mode); -} - -/** - * Enable the scroll propagation feature. If enabled then the Text area will move its parent if - * there is no more space to scroll. - * @param ta pointer to a Text area - * @param en true or false to enable/disable scroll propagation - */ -static inline void lv_textarea_set_scroll_propagation(lv_obj_t * ta, bool en) -{ - lv_page_set_scroll_propagation(ta, en); -} - -/** - * Enable the edge flash effect. (Show an arc when the an edge is reached) - * @param page pointer to a Text Area - * @param en true or false to enable/disable end flash - */ -static inline void lv_textarea_set_edge_flash(lv_obj_t * ta, bool en) -{ - lv_page_set_edge_flash(ta, en); -} - /** * Enable/disable selection mode. * @param ta pointer to a text area object @@ -345,36 +305,6 @@ const char * lv_textarea_get_accepted_chars(lv_obj_t * ta); */ uint32_t lv_textarea_get_max_length(lv_obj_t * ta); -/** - * Get the scroll bar mode of a text area - * @param ta pointer to a text area object - * @return scrollbar mode from 'lv_scrollbar_mode_t' enum - */ -static inline lv_scrollbar_mode_t lv_textarea_get_scrollbar_mode(const lv_obj_t * ta) -{ - return lv_page_get_scrollbar_mode(ta); -} - -/** - * Get the scroll propagation property - * @param ta pointer to a Text area - * @return true or false - */ -static inline bool lv_textarea_get_scroll_propagation(lv_obj_t * ta) -{ - return lv_page_get_scroll_propagation(ta); -} - -/** - * Get the scroll propagation property - * @param ta pointer to a Text area - * @return true or false - */ -static inline bool lv_textarea_get_edge_flash(lv_obj_t * ta) -{ - return lv_page_get_edge_flash(ta); -} - /** * Find whether text is selected or not. * @param ta Text area object