From 0a7f6a6331eb6d49950e39eff9c991d8237aae9a Mon Sep 17 00:00:00 2001 From: Rhaoma <65562497+Rhaoma@users.noreply.github.com> Date: Fri, 11 Dec 2020 16:37:20 +0100 Subject: [PATCH] Add option to align title text in window (#1953) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add option to align title text in window I found that i really needed a basic way to align the title text in a window, and therefore i did a bit of tinkering and came up with this solution. Mind you that I'm very new to this so it might not be the most optimal way. I have tested a bit and it pretty looked promising, I have of course written the alignments as I felt was most suitable, but I shouldn't be the judge of that. Current alignment: LV_TXT_FLAG_CENTER makes the text align in the center of the header but ensures it can’t overextend into to header button area; LV_TXT_FLAG_RIGHT makes the text align at the right side, but takes the right side header buttons into account LV_TXT_FLAG_FIT & LV_TXT_FLAG_EXPAND I wasn’t too sure about what to do so as of now it just aligns them as normal LV_TXT_FLAG_NONE Is equal to no flag set by the user and therefore I have just set it to the default coords, like normal. The text then align at the left side. * Update lv_win.h * Added functions Added function to set and get alignment of the header title as requested * Added functions Added setter and getter functions for the header title alignment as requested --- src/lv_widgets/lv_win.c | 55 +++++++++++++++++++++++++++++++++++------ src/lv_widgets/lv_win.h | 14 +++++++++++ 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/lv_widgets/lv_win.c b/src/lv_widgets/lv_win.c index b0f123ee8..3e4a5f3f8 100644 --- a/src/lv_widgets/lv_win.c +++ b/src/lv_widgets/lv_win.c @@ -92,6 +92,7 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) ext->page = NULL; ext->header = NULL; ext->title_txt = lv_mem_alloc(strlen(DEF_TITLE) + 1); + ext->title_txt_align = LV_TXT_FLAG_NONE; strcpy(ext->title_txt, DEF_TITLE); /*Init the new window object*/ @@ -363,6 +364,14 @@ void lv_win_set_drag(lv_obj_t * win, bool en) lv_obj_set_drag(win, en); } +void lv_win_title_set_alignment(lv_obj_t * win, uint8_t alignment) +{ + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); + + ext->title_txt_align = alignment; + +} + /*===================== * Getter functions *====================*/ @@ -491,6 +500,14 @@ lv_coord_t lv_win_get_width(lv_obj_t * win) return lv_obj_get_width_fit(scrl) - left - right; } +uint8_t lv_win_title_get_alignment(lv_obj_t * win) +{ + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); + + return ext->title_txt_align; +} + + /*===================== * Other functions *====================*/ @@ -538,11 +555,13 @@ static lv_design_res_t lv_win_header_design(lv_obj_t * header, const lv_area_t * lv_win_ext_t * ext = lv_obj_get_ext_attr(win); lv_style_int_t header_left = lv_obj_get_style_pad_left(win, LV_WIN_PART_HEADER); + lv_style_int_t header_right = lv_obj_get_style_pad_right(win, LV_WIN_PART_HEADER); lv_style_int_t header_inner = lv_obj_get_style_pad_inner(win, LV_WIN_PART_HEADER); lv_draw_label_dsc_t label_dsc; lv_draw_label_dsc_init(&label_dsc); lv_obj_init_draw_label_dsc(header, LV_OBJ_PART_MAIN, &label_dsc); + label_dsc.flag = ext->title_txt_align; lv_area_t txt_area; lv_point_t txt_size; @@ -557,21 +576,41 @@ static lv_design_res_t lv_win_header_design(lv_obj_t * header, const lv_area_t * /*Get x position of the title (should be on the right of the buttons on the left)*/ - lv_coord_t left_btn_offset = 0; + lv_coord_t btn_offset = 0; btn = lv_obj_get_child_back(ext->header, NULL); while(btn != NULL) { if(LV_WIN_BTN_ALIGN_LEFT == lv_win_btn_get_alignment(btn)) { - left_btn_offset += btn_w + header_inner; + btn_offset += btn_w + header_inner; } btn = lv_obj_get_child_back(header, btn); } - - txt_area.x1 = header->coords.x1 + header_left + left_btn_offset; - txt_area.y1 = header->coords.y1 + (lv_obj_get_height(header) - txt_size.y) / 2; - txt_area.x2 = txt_area.x1 + txt_size.x + left_btn_offset; - txt_area.y2 = txt_area.y1 + txt_size.y; - + switch(label_dsc.flag) { + case LV_TXT_FLAG_CENTER: + txt_area.x1 = header->coords.x1 + header_left + btn_offset; + txt_area.x2 = header->coords.x2 - header_right - btn_offset; + txt_area.y1 = header->coords.y1 + (lv_obj_get_height(header) - txt_size.y) / 2; + txt_area.y2 = txt_area.y1 + txt_size.y; + break; + case LV_TXT_FLAG_RIGHT: + txt_area.x1 = header->coords.x1; + txt_area.x2 = header->coords.x2 - header_right - btn_offset; + txt_area.y1 = header->coords.y1 + (lv_obj_get_height(header) - txt_size.y) / 2; + txt_area.y2 = txt_area.y1 + txt_size.y; + break; + case LV_TXT_FLAG_FIT || LV_TXT_FLAG_EXPAND: + txt_area.x1 = header->coords.x1; + txt_area.x2 = header->coords.x2; + txt_area.y1 = header->coords.y1 + (lv_obj_get_height(header) - txt_size.y) / 2; + txt_area.y2 = txt_area.y1 + txt_size.y; + break; + default: + txt_area.x1 = header->coords.x1 + header_left + btn_offset; + txt_area.x2 = txt_area.x1 + txt_size.x + btn_offset; + txt_area.y1 = header->coords.y1 + (lv_obj_get_height(header) - txt_size.y) / 2; + txt_area.y2 = txt_area.y1 + txt_size.y; + break; + } lv_draw_label(&txt_area, clip_area, &label_dsc, ext->title_txt, NULL); } else if(mode == LV_DESIGN_DRAW_POST) { diff --git a/src/lv_widgets/lv_win.h b/src/lv_widgets/lv_win.h index 06e67132d..3bf4bf71b 100644 --- a/src/lv_widgets/lv_win.h +++ b/src/lv_widgets/lv_win.h @@ -57,6 +57,7 @@ typedef struct { lv_obj_t * header; /*Pointer to the header container of the window*/ char * title_txt; /*Pointer to the title label of the window*/ lv_coord_t btn_w; /*Width of the control buttons*/ + uint8_t title_txt_align; /*Control the alignment of the header text*/ } lv_win_ext_t; /** Window parts. */ @@ -175,6 +176,13 @@ void lv_win_set_anim_time(lv_obj_t * win, uint16_t anim_time); */ void lv_win_set_drag(lv_obj_t * win, bool en); +/** + * Set alignment of title text in window header. + * @param win pointer to a window object + * @param alignment set the type of alignment with LV_TXT_FLAGS + */ +void lv_win_title_set_alignment(lv_obj_t * win, uint8_t alignment); + /*===================== * Getter functions *====================*/ @@ -254,6 +262,12 @@ static inline bool lv_win_get_drag(const lv_obj_t * win) return lv_obj_get_drag(win); } +/** + * Get the current alignment of title text in window header. + * @param win pointer to a window object + */ +uint8_t lv_win_title_get_alignment(lv_obj_t * win); + /*===================== * Other functions *====================*/