From 0257a82990badc22d493ab66c30072c30758a579 Mon Sep 17 00:00:00 2001 From: Kiss-Vamosi Gabor Date: Tue, 12 Jul 2016 01:16:27 +0200 Subject: [PATCH] list ready + objs.transp added --- lv_obj/lv_obj.c | 12 +++- lv_obj/lv_obj.h | 2 + lv_obj/lv_refr.c | 3 +- lv_objx/lv_btn.c | 1 + lv_objx/lv_list.c | 169 +++++++++++++++++++++++++++++++++++++++------- lv_objx/lv_list.h | 25 +++++-- lv_objx/lv_page.c | 13 ++-- lv_objx/lv_rect.c | 9 ++- 8 files changed, 192 insertions(+), 42 deletions(-) diff --git a/lv_obj/lv_obj.c b/lv_obj/lv_obj.c index 3e0fa4003..c4eb1c2ab 100644 --- a/lv_obj/lv_obj.c +++ b/lv_obj/lv_obj.c @@ -35,8 +35,9 @@ lv_obj_t* def_scr_dp = NULL; lv_obj_t* act_scr_dp = NULL; ll_dsc_t scr_ll; -lv_objs_t lv_objs_def = {.color = COLOR_MAKE(0x20, 0x30, 0x40)}; -lv_objs_t lv_objs_scr = {.color = LV_OBJ_DEF_SCR_COLOR}; +lv_objs_t lv_objs_def = {.color = COLOR_MAKE(0xa0, 0xc0, 0xe0), .transp = 0}; +lv_objs_t lv_objs_scr = {.color = LV_OBJ_DEF_SCR_COLOR, .transp = 0}; +lv_objs_t lv_objs_transp = {.transp = 1}; /********************** * MACROS @@ -306,7 +307,7 @@ bool lv_obj_signal(lv_obj_t* obj_dp, lv_signal_t sign, void * param) switch(sign) { case LV_SIGNAL_CHILD_CHG: /*Return 'invalid' if the child change signal is not enabled*/ - // if(obj_dp->child_chg_off != 0) valid = false; + if(obj_dp->child_chg_off != 0) valid = false; break; default: break; @@ -332,6 +333,8 @@ lv_objs_t * lv_objs_get(lv_objs_builtin_t style, lv_objs_t * copy_p) case LV_OBJS_SCR: style_p = &lv_objs_scr; break; + case LV_OBJS_TRANSP: + style_p = &lv_objs_transp; break; default: style_p = NULL; @@ -829,6 +832,9 @@ void lv_obj_set_hidden(lv_obj_t* obj_dp, bool hidden_en) { obj_dp->hidden = hidden_en == false ? 0 : 1; + lv_obj_t * par_dp = lv_obj_get_parent(obj_dp); + par_dp->signal_f(par_dp, LV_SIGNAL_CHILD_CHG, obj_dp); + lv_obj_inv(obj_dp); } diff --git a/lv_obj/lv_obj.h b/lv_obj/lv_obj.h index 29bb51876..9a00ba866 100644 --- a/lv_obj/lv_obj.h +++ b/lv_obj/lv_obj.h @@ -134,12 +134,14 @@ typedef enum typedef struct { color_t color; + uint8_t transp :1; }lv_objs_t; typedef enum { LV_OBJS_DEF, LV_OBJS_SCR, + LV_OBJS_TRANSP, }lv_objs_builtin_t; /********************** diff --git a/lv_obj/lv_refr.c b/lv_obj/lv_refr.c index 55ca73dac..17639a72b 100644 --- a/lv_obj/lv_refr.c +++ b/lv_obj/lv_refr.c @@ -316,6 +316,7 @@ static lv_obj_t* lv_refr_get_top_obj(const area_t * area_p, lv_obj_t* obj_dp) /*If this object is fully cover the draw area check the children too */ if(obj_dp->opa == OPA_COVER && obj_dp->hidden == 0 && + LV_SA(obj_dp, lv_objs_t)->transp == 0 && obj_dp->design_f(obj_dp, area_p, LV_DESIGN_COVER_CHK) != false) { LL_READ(obj_dp->child_ll, i) { @@ -397,7 +398,7 @@ static void lv_refr_obj(lv_obj_t* obj_dp, const area_t * mask_ori_p) if(union_ok != false) { /* Redraw the object */ - if(obj_dp->opa != OPA_TRANSP) { + if(obj_dp->opa != OPA_TRANSP && LV_SA(obj_dp, lv_objs_t)->transp == 0) { obj_dp->design_f(obj_dp, &mask_parent, LV_DESIGN_DRAW); } diff --git a/lv_objx/lv_btn.c b/lv_objx/lv_btn.c index ff41ca284..49c31fca2 100644 --- a/lv_objx/lv_btn.c +++ b/lv_objx/lv_btn.c @@ -66,6 +66,7 @@ static lv_btns_t lv_btns_def = }; static lv_btns_t lv_btns_transp = { + .rects.objs.transp = 1, .rects.bwidth = 0, .rects.empty = 1, .rects.hpad = 10 * LV_STYLE_MULT, diff --git a/lv_objx/lv_list.c b/lv_objx/lv_list.c index bbda15341..d47bf5974 100644 --- a/lv_objx/lv_list.c +++ b/lv_objx/lv_list.c @@ -11,8 +11,7 @@ #include "lv_list.h" #include "lv_rect.h" -#include "lv_label.h" -#include "lv_img.h" +#include "misc/math/math_base.h" /********************* * DEFINES @@ -36,7 +35,7 @@ static lv_lists_t lv_lists_def = /*Page style*/ .pages.bg_rects.objs.color = COLOR_MAKE(0x20, 0x50, 0x80), .pages.bg_rects.gcolor = COLOR_SILVER, .pages.bg_rects.bcolor = COLOR_GRAY, .pages.bg_rects.bopa = 50, .pages.bg_rects.bwidth = 0 * LV_STYLE_MULT, .pages.bg_rects.round = 2 * LV_STYLE_MULT, - .pages.bg_rects.empty = 0, + .pages.bg_rects.empty = 1, .pages.bg_rects.vpad = 10 * LV_STYLE_MULT, .pages.bg_rects.hpad = 10 * LV_STYLE_MULT, .pages.bg_rects.opad = 5 * LV_STYLE_MULT, @@ -47,15 +46,21 @@ static lv_lists_t lv_lists_def = /*List element style*/ .liste_btns.mcolor[LV_BTN_STATE_REL] = COLOR_MAKE(0xa0, 0xa0, 0xa0), .liste_btns.gcolor[LV_BTN_STATE_REL] = COLOR_WHITE, .liste_btns.bcolor[LV_BTN_STATE_REL] = COLOR_WHITE, - .liste_btns.mcolor[LV_BTN_STATE_PR] = COLOR_MAKE(0x60, 0x80, 0xa0), .liste_btns.gcolor[LV_BTN_STATE_PR] = COLOR_MAKE(0xd0, 0xd0, 0xd0), .liste_btns.bcolor[LV_BTN_STATE_PR] = COLOR_WHITE, - .liste_btns.mcolor[LV_BTN_STATE_TGL_REL] = COLOR_MAKE(0x80,0x00,0x00), .liste_btns.gcolor[LV_BTN_STATE_TGL_REL] = COLOR_MAKE(0x20, 0x20, 0x20), .liste_btns.bcolor[LV_BTN_STATE_TGL_REL] = COLOR_WHITE, - .liste_btns.mcolor[LV_BTN_STATE_TGL_PR] = COLOR_MAKE(0xf0, 0x26, 0x26), .liste_btns.gcolor[LV_BTN_STATE_TGL_PR] = COLOR_MAKE(0x40, 0x40, 0x40), .liste_btns.bcolor[LV_BTN_STATE_TGL_PR] = COLOR_WHITE, + .liste_btns.mcolor[LV_BTN_STATE_PR] = COLOR_MAKE(0xa0, 0xa0, 0xa0), .liste_btns.gcolor[LV_BTN_STATE_PR] = COLOR_MAKE(0xa0, 0xc0, 0xe0), .liste_btns.bcolor[LV_BTN_STATE_PR] = COLOR_WHITE, + .liste_btns.mcolor[LV_BTN_STATE_TGL_REL] = COLOR_MAKE(0x60,0x80,0xa0), .liste_btns.gcolor[LV_BTN_STATE_TGL_REL] = COLOR_MAKE(0xc0, 0xd0, 0xf0), .liste_btns.bcolor[LV_BTN_STATE_TGL_REL] = COLOR_WHITE, + .liste_btns.mcolor[LV_BTN_STATE_TGL_PR] = COLOR_MAKE(0x60, 0x80, 0xa0), .liste_btns.gcolor[LV_BTN_STATE_TGL_PR] = COLOR_MAKE(0x80, 0xa0, 0xc0), .liste_btns.bcolor[LV_BTN_STATE_TGL_PR] = COLOR_WHITE, .liste_btns.mcolor[LV_BTN_STATE_INA] = COLOR_SILVER, .liste_btns.gcolor[LV_BTN_STATE_INA] = COLOR_GRAY, .liste_btns.bcolor[LV_BTN_STATE_INA] = COLOR_WHITE, .liste_btns.rects.bwidth = 2 * LV_STYLE_MULT, .liste_btns.rects.bopa = 50, .liste_btns.rects.empty = 0, .liste_btns.rects.round = 4 * LV_STYLE_MULT, .liste_btns.rects.hpad = 10 * LV_STYLE_MULT, .liste_btns.rects.vpad = 10 * LV_STYLE_MULT, - .liste_btns.rects.opad = 5 * LV_STYLE_MULT, + .liste_btns.rects.opad = 20 * LV_STYLE_MULT, + + .liste_labels.objs.color = COLOR_MAKE(0x20,0x20,0x20), .liste_labels.font = LV_FONT_DEFAULT, + .liste_labels.letter_space = 2 * LV_STYLE_MULT, .liste_labels.line_space = 2 * LV_STYLE_MULT, + .liste_labels.mid = 0, + + .liste_imgs.recolor_opa = OPA_COVER, .liste_layout = LV_RECT_LAYOUT_ROW_M }; @@ -81,12 +86,17 @@ static lv_lists_t lv_lists_def = lv_obj_t* lv_list_create(lv_obj_t* par_dp, lv_obj_t * copy_dp) { /*Create the ancestor basic object*/ - lv_obj_t * new_obj_dp = lv_page_create(par_dp, NULL); + lv_obj_t * new_obj_dp = lv_page_create(par_dp, copy_dp); dm_assert(new_obj_dp); + lv_list_ext_t * ext_p= lv_obj_alloc_ext(new_obj_dp, sizeof(lv_list_ext_t)); /*Init the new list object*/ - lv_obj_set_style(new_obj_dp, &lv_lists_def); - lv_rect_set_layout(new_obj_dp, LV_LIST_LAYOUT_DEF); + if(copy_dp == NULL) { + ext_p->fit = LV_LIST_FIT_LONGEST; + lv_obj_set_signal_f(new_obj_dp, lv_list_signal); + lv_obj_set_style(new_obj_dp, &lv_lists_def); + lv_rect_set_layout(new_obj_dp, LV_LIST_LAYOUT_DEF); + } return new_obj_dp; } @@ -102,7 +112,7 @@ bool lv_list_signal(lv_obj_t* obj_dp, lv_signal_t sign, void * param) bool valid; /* Include the ancient signal function */ - valid = lv_list_signal(obj_dp, sign, param); + valid = lv_page_signal(obj_dp, sign, param); /* The object can be deleted so check its validity and then * make the object specific signal handling */ @@ -116,30 +126,73 @@ bool lv_list_signal(lv_obj_t* obj_dp, lv_signal_t sign, void * param) return valid; } - -void lv_list_add(lv_obj_t * obj_dp, const char * img_fn, const char * txt, void (*release) (lv_obj_t *)) +/** + * Add a list element to the list + * @param obj_dp pointer to list object + * @param img_fn file name of an image before the text (NULL if unused) + * @param txt text of the list element (NULL if unused) + * @param rel_action pointer to release action function (like with lv_btn) + * @return pointer to the new list element which can be customized (a button) + */ +lv_obj_t * lv_list_add(lv_obj_t * obj_dp, const char * img_fn, const char * txt, bool (*rel_action)(lv_obj_t*, lv_dispi_t *)) { - lv_lists_t * lists = lv_obj_get_style(obj_dp); + lv_lists_t * lists_p = lv_obj_get_style(obj_dp); + lv_list_ext_t * ext_p = lv_obj_get_ext(obj_dp); + + /*Create a list element with the image an the text*/ lv_obj_t * liste; liste = lv_btn_create(obj_dp, NULL); - lv_obj_set_style(liste, &lists->liste_btns); - //lv_btn_set_rel_action(liste, release); + lv_obj_set_style(liste, &lists_p->liste_btns); + lv_btn_set_rel_action(liste, rel_action); lv_page_glue_obj(liste, true); lv_rect_set_layout(liste, lv_lists_def.liste_layout); - lv_rect_set_fit(liste, false, true); - - - cord_t w = lv_obj_get_width(lv_obj_get_parent(obj_dp)); - w -= lists->pages.bg_rects.hpad * 2; - lv_obj_set_width(liste, w); + lv_rect_set_fit(liste, true, true); /*hor. fit might be disabled later*/ if(img_fn != NULL) { lv_obj_t * img = lv_img_create(liste, NULL); lv_img_set_file(img, img_fn); + lv_obj_set_style(img, &lists_p->liste_imgs); + lv_obj_set_click(img, false); } - lv_obj_t * label = lv_label_create(liste, NULL); - lv_label_set_text(label, txt); + if(txt != NULL) { + lv_obj_t * label = lv_label_create(liste, NULL); + lv_label_set_text(label, txt); + lv_obj_set_style(label,&lists_p->liste_labels); + lv_obj_set_click(label, false); + } + + /*Make the adjustment*/ + if(ext_p->fit == LV_LIST_FIT_HOLDER) { + /*Now the width will be adjusted*/ + lv_rect_set_fit(liste, false, true); + cord_t w = lv_obj_get_width(lv_obj_get_parent(obj_dp)); + w -= lists_p->pages.bg_rects.hpad * 2; + lv_obj_set_width(liste, w); + } else if(ext_p->fit == LV_LIST_FIT_LONGEST) { + /*Now the width will be adjusted*/ + lv_rect_set_fit(liste, false, true); + + lv_obj_t * e; + cord_t w = 0; + /*Get the longest list element*/ + e = lv_obj_get_child(obj_dp, NULL); + while(e != NULL) { + w = max(w, lv_obj_get_width(e)); + e = lv_obj_get_child(obj_dp, e); + } + + /*Set all list element to the longest width*/ + e = lv_obj_get_child(obj_dp, NULL); + while(e != NULL) { + if(lv_obj_get_width(e) != w) { + lv_obj_set_width(e, w); + } + e = lv_obj_get_child(obj_dp, e); + } + } + + return liste; } /** @@ -167,20 +220,86 @@ lv_lists_t * lv_lists_get(lv_lists_builtin_t style, lv_lists_t * copy_p) return style_p; } + +/** + * Move the list elements up by one + * @param obj_dp pointer a to list object + */ +void lv_list_up(lv_obj_t * obj_dp) +{ + /*Search the first list element which 'y' coordinate is below the parent + * and position the list to show this element on the bottom*/ + lv_obj_t * h = lv_obj_get_parent(obj_dp); + lv_obj_t * e; + lv_obj_t * e_prev = NULL; + e = lv_obj_get_child(obj_dp, NULL); + while(e != NULL) { + if(e->cords.y2 <= h->cords.y2) { + if(e_prev != NULL) + lv_obj_set_y(obj_dp, lv_obj_get_height(h) - + (lv_obj_get_y(e_prev) + lv_obj_get_height(e_prev))); + break; + } + e_prev = e; + e = lv_obj_get_child(obj_dp, e); + } +} + +/** + * Move the list elements down by one + * @param obj_dp pointer to a list object + */ +void lv_list_down(lv_obj_t * obj_dp) +{ + /*Search the first list element which 'y' coordinate is above the parent + * and position the list to show this element on the top*/ + lv_obj_t * h = lv_obj_get_parent(obj_dp); + lv_obj_t * e; + e = lv_obj_get_child(obj_dp, NULL); + while(e != NULL) { + if(e->cords.y1 < h->cords.y1) { + lv_obj_set_y(obj_dp, -lv_obj_get_y(e)); + break; + } + e = lv_obj_get_child(obj_dp, e); + } +} + /*===================== * Setter functions *====================*/ +/** + * Set the list element fitting of a list + * @param obj_dp pointer to a list object + * @param fit type of fitting (from lv_list_fit_t) + */ +void lv_list_set_fit(lv_obj_t * obj_dp, lv_list_fit_t fit) +{ + lv_list_ext_t * ext_p = lv_obj_get_ext(obj_dp); + + ext_p->fit = fit; +} + /*===================== * Getter functions *====================*/ +/** + * Get the fit type of a list + * @param obj_dp pointer to list object + * @return the fit (from lv_list_fit_t) + */ +lv_list_fit_t lv_list_get_fit(lv_obj_t * obj_dp) +{ + return LV_EA(obj_dp, lv_list_ext_t)->fit; +} + /********************** * STATIC FUNCTIONS **********************/ - /** * Handle the drawing related tasks of the lists * @param obj_dp pointer to an object diff --git a/lv_objx/lv_list.h b/lv_objx/lv_list.h index 8c40bec2f..69f9b63c2 100644 --- a/lv_objx/lv_list.h +++ b/lv_objx/lv_list.h @@ -15,6 +15,8 @@ #include "../lv_obj/lv_obj.h" #include "lv_page.h" #include "lv_btn.h" +#include "lv_label.h" +#include "lv_img.h" /********************* * DEFINES @@ -29,23 +31,31 @@ typedef struct { lv_pages_t pages; /*Ancestor page style*/ lv_btns_t liste_btns; + lv_labels_t liste_labels; + lv_imgs_t liste_imgs; lv_rect_layout_t liste_layout; }lv_lists_t; - /*Built-in styles of LISTATE*/ typedef enum { LV_LISTS_DEF, }lv_lists_builtin_t; +typedef enum +{ + LV_LIST_FIT_OFF = 0, + LV_LIST_FIT_HOLDER, + LV_LIST_FIT_CONTENT, + LV_LIST_FIT_LONGEST, +}lv_list_fit_t; + + /*Data of LIST*/ typedef struct { lv_page_ext_t page_ext; - uint8_t fit_size :1; /*Automatically set the adjust size of list elements to longest element */ - uint8_t sel_en :1; /*Enable selecting list elements by toggling them */ - uint8_t sel_one :1; /*Enable to select only one list element*/ + uint8_t fit; /*Width adjustment of list elements (from lv_list_adjsut_t)*/ }lv_list_ext_t; @@ -54,9 +64,14 @@ typedef struct **********************/ lv_obj_t* lv_list_create(lv_obj_t* par_dp, lv_obj_t * copy_dp); bool lv_list_signal(lv_obj_t* obj_dp, lv_signal_t sign, void * param); -void lv_list_add(lv_obj_t * obj_dp, const char * img_fn, const char * txt, void (*release) (lv_obj_t *)); +lv_obj_t * lv_list_add(lv_obj_t * obj_dp, const char * img_fn, const char * txt, bool (*rel_action)(lv_obj_t*, lv_dispi_t *)); lv_lists_t * lv_lists_get(lv_lists_builtin_t style, lv_lists_t * copy_p); +void lv_list_down(lv_obj_t * obj_dp); +void lv_list_up(lv_obj_t * obj_dp); +void lv_list_set_fit(lv_obj_t * obj_dp, lv_list_fit_t fit); +lv_list_fit_t lv_list_get_fit(lv_obj_t * obj_dp); + /********************** * MACROS **********************/ diff --git a/lv_objx/lv_page.c b/lv_objx/lv_page.c index 6085afcec..2fd7fed6e 100644 --- a/lv_objx/lv_page.c +++ b/lv_objx/lv_page.c @@ -91,7 +91,9 @@ static lv_pages_t lv_pages_paper = static lv_pages_t lv_pages_transp = { + .bg_rects.objs.transp = 1, .bg_rects.empty = 1, + .bg_rects.bwidth = 0, .bg_rects.hpad = 10 * LV_STYLE_MULT, .bg_rects.vpad = 10 * LV_STYLE_MULT, .bg_rects.vpad = 10 * LV_STYLE_MULT, @@ -274,14 +276,11 @@ bool lv_page_signal(lv_obj_t* obj_dp, lv_signal_t sign, void* param) break; case LV_SIGNAL_STYLE_CHG: + lv_obj_set_style(page_ext_p->sbh_dp, &pages_p->sb_rects); + lv_obj_set_style(page_ext_p->sbv_dp, &pages_p->sb_rects); + lv_obj_set_width(page_ext_p->sbv_dp, pages_p->sb_width); + lv_obj_set_height(page_ext_p->sbh_dp, pages_p->sb_width); - /* Set the styles only if they are different else infinite loop - * will be created from lv_obj_set_style*/ - if(lv_obj_get_style(page_ext_p->sbh_dp) != &pages_p->sb_rects) { - lv_obj_set_style(page_ext_p->sbh_dp, &pages_p->sb_rects); - lv_obj_set_style(page_ext_p->sbv_dp, &pages_p->sb_rects); - lv_obj_set_style(obj_dp, &pages_p->bg_rects); - } if(pages_p->sb_mode == LV_PAGE_SB_MODE_ON) { lv_obj_set_opa(page_ext_p->sbv_dp, (pages_p->sb_opa * OPA_COVER) / 100); lv_obj_set_opa(page_ext_p->sbh_dp, (pages_p->sb_opa * OPA_COVER) / 100); diff --git a/lv_objx/lv_rect.c b/lv_objx/lv_rect.c index 58a6f0fe7..36d99a136 100644 --- a/lv_objx/lv_rect.c +++ b/lv_objx/lv_rect.c @@ -50,7 +50,7 @@ static lv_rects_t lv_rects_def = .hpad = 10 * LV_STYLE_MULT, .vpad = 10 * LV_STYLE_MULT, .opad = 10 * LV_STYLE_MULT }; static lv_rects_t lv_rects_transp = -{ .bwidth = 0, .empty = 1, +{ .objs.transp = 1, .bwidth = 0, .empty = 1, .hpad = 10 * LV_STYLE_MULT, .vpad = 10 * LV_STYLE_MULT, .opad = 10 * LV_STYLE_MULT}; static lv_rects_t lv_rects_border = @@ -345,6 +345,8 @@ static void lv_rect_layout_col(lv_obj_t * obj_dp) /* Align the children */ cord_t last_cord = rects_p->vpad; LL_READ_BACK(obj_dp->child_ll, child) { + if(lv_obj_get_hidden(child) != false) continue; + lv_obj_align(child, obj_dp, align, hpad_corr , last_cord); last_cord += lv_obj_get_height(child) + rects_p->opad; } @@ -392,6 +394,8 @@ static void lv_rect_layout_row(lv_obj_t * obj_dp) /* Align the children */ cord_t last_cord = rects_p->hpad; LL_READ_BACK(obj_dp->child_ll, child) { + if(lv_obj_get_hidden(child) != false) continue; + lv_obj_align(child, obj_dp, align, last_cord, vpad_corr); last_cord += lv_obj_get_width(child) + rects_p->opad; } @@ -423,6 +427,8 @@ static void lv_rect_layout_center(lv_obj_t * obj_dp) /* Align the children */ cord_t last_cord = - (h_tot / 2); LL_READ_BACK(obj_dp->child_ll, child) { + if(lv_obj_get_hidden(child) != false) continue; + lv_obj_align(child, obj_dp, LV_ALIGN_CENTER, 0, last_cord + lv_obj_get_height(child) / 2); last_cord += lv_obj_get_height(child) + rects_p->opad; } @@ -457,6 +463,7 @@ void lv_rect_refr_autofit(lv_obj_t * obj_dp) rect_cords.y2 = LV_CORD_MIN; LL_READ(obj_dp->child_ll, i) { + if(lv_obj_get_hidden(i) != false) continue; rect_cords.x1 = min(rect_cords.x1, i->cords.x1); rect_cords.y1 = min(rect_cords.y1, i->cords.y1); rect_cords.x2 = max(rect_cords.x2, i->cords.x2);