From b7d856515b1a59fed39f5058cdaec66c74878b04 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Wed, 20 Nov 2019 16:18:56 +0100 Subject: [PATCH] add lv_ddlist_set/get_symbol instead of lv_ddlist_set/get_draw_arrow --- src/lv_api_map.h | 13 +++++++++++ src/lv_objx/lv_ddlist.c | 51 ++++++++++++++++++++--------------------- src/lv_objx/lv_ddlist.h | 19 +++++++-------- src/lv_objx/lv_roller.c | 3 ++- 4 files changed, 50 insertions(+), 36 deletions(-) diff --git a/src/lv_api_map.h b/src/lv_api_map.h index 40e746684..bd8db2fc0 100644 --- a/src/lv_api_map.h +++ b/src/lv_api_map.h @@ -13,6 +13,7 @@ extern "C" { /********************* * INCLUDES *********************/ +#include "lvgl/lvgl.h" /********************* * DEFINES @@ -31,6 +32,18 @@ extern "C" { *--------------------*/ #define lv_chart_get_point_cnt lv_chart_get_point_count +static inline void lv_ddlist_set_draw_arrow(lv_obj_t * ddlist, bool en) +{ + if(en) lv_ddlist_set_symbol(ddlist, LV_SYMBOL_DOWN); + else lv_ddlist_set_symbol(ddlist, NULL); +} + + +static inline bool lv_ddlist_get_draw_arrow(lv_obj_t * ddlist) +{ + if(lv_ddlist_get_symbol(ddlist)) return true; + else return false; +} /********************** * MACROS diff --git a/src/lv_objx/lv_ddlist.c b/src/lv_objx/lv_ddlist.c index 697431627..d358455da 100644 --- a/src/lv_objx/lv_ddlist.c +++ b/src/lv_objx/lv_ddlist.c @@ -91,13 +91,13 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) /*Initialize the allocated 'ext' */ ext->label = NULL; + ext->symbol = NULL; ext->opened = 0; ext->fix_height = 0; ext->sel_opt_id = 0; ext->sel_opt_id_ori = 0; ext->option_cnt = 0; ext->sel_style = &lv_style_plain_color; - ext->draw_arrow = 0; /*Do not draw arrow by default*/ ext->stay_open = 0; /*The signal and design functions are not copied so set them here*/ @@ -153,7 +153,7 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) ext->fix_height = copy_ext->fix_height; ext->option_cnt = copy_ext->option_cnt; ext->sel_style = copy_ext->sel_style; - ext->draw_arrow = copy_ext->draw_arrow; + ext->symbol = copy_ext->symbol; ext->stay_open = copy_ext->stay_open; lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_BG, lv_ddlist_get_style(copy, LV_DDLIST_STYLE_BG)); @@ -274,18 +274,17 @@ void lv_ddlist_set_fix_width(lv_obj_t * ddlist, lv_coord_t w) } /** - * Set arrow draw in a drop down list + * Set an arrow or other symbol to display when the drop-down list is closed. * @param ddlist pointer to drop down list object - * @param en enable/disable a arrow draw. E.g. "true" for draw. + * @param symbol a text like `LV_SYMBOL_DOWN` or NULL to not draw icon */ -void lv_ddlist_set_draw_arrow(lv_obj_t * ddlist, bool en) +void lv_ddlist_set_symbol(lv_obj_t * ddlist, const char * symbol) { LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - - /*Set the flag*/ - ext->draw_arrow = en ? 1 : 0; + ext->symbol = symbol; + lv_obj_invalidate(ddlist); } /** @@ -420,16 +419,17 @@ lv_coord_t lv_ddlist_get_fix_height(const lv_obj_t * ddlist) } /** - * Get arrow draw in a drop down list + * Get the symbol to draw when the drop-down list is closed * @param ddlist pointer to drop down list object + * @return the symbol or NULL if not enabled */ -bool lv_ddlist_get_draw_arrow(lv_obj_t * ddlist) +const char * lv_ddlist_get_symbol(lv_obj_t * ddlist) { LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - return ext->draw_arrow ? true : false; + return ext->symbol; } /** @@ -613,10 +613,10 @@ static lv_design_res_t lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * cli } } - /*Add a down symbol in ddlist when closed*/ + /*Closed...*/ else { - /*Draw a arrow in ddlist if enabled*/ - if(ext->draw_arrow) { + /*Draw the symbol if enabled*/ + if(ext->symbol) { const lv_style_t * style = lv_ddlist_get_style(ddlist, LV_DDLIST_STYLE_BG); const lv_font_t * font = style->text.font; const lv_style_t * sel_style = lv_ddlist_get_style(ddlist, LV_DDLIST_STYLE_BG); @@ -625,25 +625,24 @@ static lv_design_res_t lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * cli lv_style_copy(&new_style, style); new_style.text.color = sel_style->text.color; new_style.text.opa = sel_style->text.opa; - lv_area_t area_arrow; - lv_coord_t arrow_width = lv_txt_get_width(LV_SYMBOL_DOWN, strlen(LV_SYMBOL_DOWN), sel_style->text.font, 0, 0); + lv_area_t area_icon; + lv_coord_t icon_width = lv_txt_get_width(ext->symbol, strlen(ext->symbol), sel_style->text.font, 0, 0); if(lv_label_get_align(ext->label) != LV_LABEL_ALIGN_RIGHT) { - area_arrow.x2 = ddlist->coords.x2 - style->body.padding.right; - area_arrow.x1 = area_arrow.x2 - arrow_width; + area_icon.x2 = ddlist->coords.x2 - style->body.padding.right; + area_icon.x1 = area_icon.x2 - icon_width; } else { - area_arrow.x1 = ddlist->coords.x1 + style->body.padding.left; - area_arrow.x2 = area_arrow.x1 + arrow_width; + area_icon.x1 = ddlist->coords.x1 + style->body.padding.left; + area_icon.x2 = area_icon.x1 + icon_width; } - area_arrow.y1 = ddlist->coords.y1 + style->text.line_space; - area_arrow.y2 = area_arrow.y1 + font_h; + area_icon.y1 = ddlist->coords.y1 + style->text.line_space; + area_icon.y2 = area_icon.y1 + font_h; - lv_area_t mask_arrow; + lv_area_t mask_icon; bool area_ok; - area_ok = lv_area_intersect(&mask_arrow, clip_area, &area_arrow); + area_ok = lv_area_intersect(&mask_icon, clip_area, &area_icon); if(area_ok) { - /*Use a down arrow in ddlist, you can replace it with yourcustom symbol*/ - lv_draw_label(&area_arrow, &mask_arrow, &new_style, opa_scale, LV_SYMBOL_DOWN, LV_TXT_FLAG_NONE, + lv_draw_label(&area_icon, &mask_icon, &new_style, opa_scale, ext->symbol, LV_TXT_FLAG_NONE, NULL, NULL, NULL, lv_obj_get_base_dir(ddlist)); } } diff --git a/src/lv_objx/lv_ddlist.h b/src/lv_objx/lv_ddlist.h index ee6c1f70d..774b52cef 100644 --- a/src/lv_objx/lv_ddlist.h +++ b/src/lv_objx/lv_ddlist.h @@ -48,12 +48,12 @@ typedef struct /*New data for this type */ lv_obj_t * label; /*Label for the options*/ const lv_style_t * sel_style; /*Style of the selected option*/ + const char * symbol; /*Arrow or other icon when the drop-down list is closed*/ uint16_t option_cnt; /*Number of options*/ uint16_t sel_opt_id; /*Index of the current option*/ uint16_t sel_opt_id_ori; /*Store the original index on focus*/ uint8_t opened : 1; /*1: The list is opened (handled by the library)*/ uint8_t force_sel : 1; /*1: Keep the selection highlight even if the list is closed*/ - uint8_t draw_arrow : 1; /*1: Draw arrow*/ uint8_t stay_open : 1; /*1: Don't close the list when a new item is selected*/ lv_coord_t fix_height; /*Height of the ddlist when opened. (0: auto-size)*/ } lv_ddlist_ext_t; @@ -110,13 +110,13 @@ void lv_ddlist_set_fix_height(lv_obj_t * ddlist, lv_coord_t h); */ void lv_ddlist_set_fix_width(lv_obj_t * ddlist, lv_coord_t w); -/** - * Set arrow draw in a drop down list - * @param ddlist pointer to drop down list object - * @param en enable/disable a arrow draw. E.g. "true" for draw. - */ -void lv_ddlist_set_draw_arrow(lv_obj_t * ddlist, bool en); +/** + * Set an arrow or other symbol to display when the drop-down list is closed. + * @param ddlist pointer to drop down list object + * @param symbol a text like `LV_SYMBOL_DOWN` or NULL to not draw icon + */ +void lv_ddlist_set_symbol(lv_obj_t * ddlist, const char * symbol); /** * Leave the list opened when a new value is selected * @param ddlist pointer to drop down list object @@ -192,10 +192,11 @@ void lv_ddlist_get_selected_str(const lv_obj_t * ddlist, char * buf, uint16_t bu lv_coord_t lv_ddlist_get_fix_height(const lv_obj_t * ddlist); /** - * Get arrow draw in a drop down list + * Get the symbol to draw when the drop-down list is closed * @param ddlist pointer to drop down list object + * @return the symbol or NULL if not enabled */ -bool lv_ddlist_get_draw_arrow(lv_obj_t * ddlist); +const char * lv_ddlist_get_symbol(lv_obj_t * ddlist); /** * Get whether the drop down list stay open after selecting a value or not diff --git a/src/lv_objx/lv_roller.c b/src/lv_objx/lv_roller.c index c71deff1c..4b49e8e0b 100644 --- a/src/lv_objx/lv_roller.c +++ b/src/lv_objx/lv_roller.c @@ -78,7 +78,7 @@ lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy) lv_roller_ext_t * ext = lv_obj_allocate_ext_attr(new_roller, sizeof(lv_roller_ext_t)); LV_ASSERT_MEM(ext); if(ext == NULL) return NULL; - ext->ddlist.draw_arrow = 0; /*Do not draw arrow by default*/ + ext->mode = LV_ROLLER_MODE_NORMAL; /*The signal and design functions are not copied so set them here*/ @@ -93,6 +93,7 @@ lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy) lv_ddlist_open(new_roller, false); lv_ddlist_set_anim_time(new_roller, LV_ROLLER_DEF_ANIM_TIME); lv_ddlist_set_stay_open(new_roller, true); + lv_ddlist_set_symbol(new_roller, NULL); lv_roller_set_visible_row_count(new_roller, 3); lv_label_set_align(ext->ddlist.label, LV_LABEL_ALIGN_CENTER);