From dd27c3530432ea0b09f01e604bf577f31d8ef841 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 1 Jun 2023 15:41:47 +1000 Subject: convert lvgl from submodule to a plain old directory --- lib/lvgl | 1 - lib/lvgl/src/widgets/lv_checkbox.c | 262 +++++++++++++++++++++++++++++++++++++ 2 files changed, 262 insertions(+), 1 deletion(-) delete mode 160000 lib/lvgl create mode 100644 lib/lvgl/src/widgets/lv_checkbox.c (limited to 'lib/lvgl/src/widgets/lv_checkbox.c') diff --git a/lib/lvgl b/lib/lvgl deleted file mode 160000 index 0732400e..00000000 --- a/lib/lvgl +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0732400e7b564dd0e7dc4a924619d8e19c5b23a0 diff --git a/lib/lvgl/src/widgets/lv_checkbox.c b/lib/lvgl/src/widgets/lv_checkbox.c new file mode 100644 index 00000000..dd3b3d15 --- /dev/null +++ b/lib/lvgl/src/widgets/lv_checkbox.c @@ -0,0 +1,262 @@ +/** + * @file lv_cb.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_checkbox.h" +#if LV_USE_CHECKBOX != 0 + +#include "../misc/lv_assert.h" +#include "../misc/lv_txt_ap.h" +#include "../core/lv_group.h" +#include "../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_checkbox_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_checkbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_checkbox_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void lv_checkbox_draw(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_checkbox_class = { + .constructor_cb = lv_checkbox_constructor, + .destructor_cb = lv_checkbox_destructor, + .event_cb = lv_checkbox_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_checkbox_t), + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_checkbox_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_checkbox_set_text(lv_obj_t * obj, const char * txt) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; +#if LV_USE_ARABIC_PERSIAN_CHARS + size_t len = _lv_txt_ap_calc_bytes_cnt(txt); +#else + size_t len = strlen(txt); +#endif + + if(!cb->static_txt) cb->txt = lv_mem_realloc(cb->txt, len + 1); + else cb->txt = lv_mem_alloc(len + 1); +#if LV_USE_ARABIC_PERSIAN_CHARS + _lv_txt_ap_proc(txt, cb->txt); +#else + strcpy(cb->txt, txt); +#endif + + cb->static_txt = 0; + + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); +} + +void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + if(!cb->static_txt) lv_mem_free(cb->txt); + + cb->txt = (char *)txt; + cb->static_txt = 1; + + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +const char * lv_checkbox_get_text(const lv_obj_t * obj) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + return cb->txt; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_checkbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + cb->txt = "Check box"; + cb->static_txt = 1; + lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + if(!cb->static_txt) { + lv_mem_free(cb->txt); + cb->txt = NULL; + } + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_checkbox_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + + if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + lv_point_t txt_size; + lv_txt_get_size(&txt_size, cb->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + + lv_coord_t bg_colp = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + lv_coord_t marker_leftp = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + lv_coord_t marker_rightp = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + lv_coord_t marker_topp = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + lv_coord_t marker_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + lv_point_t marker_size; + marker_size.x = font_h + marker_leftp + marker_rightp; + marker_size.y = font_h + marker_topp + marker_bottomp; + + p->x = marker_size.x + txt_size.x + bg_colp; + p->y = LV_MAX(marker_size.y, txt_size.y); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_coord_t * s = lv_event_get_param(e); + lv_coord_t m = lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR); + *s = LV_MAX(*s, m); + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_checkbox_draw(e); + } +} + +static void lv_checkbox_draw(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + + lv_coord_t bg_border = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t bg_topp = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + bg_border; + lv_coord_t bg_leftp = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + bg_border; + lv_coord_t bg_colp = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + lv_coord_t marker_leftp = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + lv_coord_t marker_rightp = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + lv_coord_t marker_topp = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + lv_coord_t marker_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + + lv_coord_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_INDICATOR); + lv_coord_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_INDICATOR); + + lv_draw_rect_dsc_t indic_dsc; + lv_draw_rect_dsc_init(&indic_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &indic_dsc); + lv_area_t marker_area; + marker_area.x1 = obj->coords.x1 + bg_leftp; + marker_area.x2 = marker_area.x1 + font_h + marker_leftp + marker_rightp - 1; + marker_area.y1 = obj->coords.y1 + bg_topp; + marker_area.y2 = marker_area.y1 + font_h + marker_topp + marker_bottomp - 1; + + lv_area_t marker_area_transf; + lv_area_copy(&marker_area_transf, &marker_area); + marker_area_transf.x1 -= transf_w; + marker_area_transf.x2 += transf_w; + marker_area_transf.y1 -= transf_h; + marker_area_transf.y2 += transf_h; + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.rect_dsc = &indic_dsc; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_CHECKBOX_DRAW_PART_BOX; + part_draw_dsc.draw_area = &marker_area_transf; + part_draw_dsc.part = LV_PART_INDICATOR; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_rect(draw_ctx, &indic_dsc, &marker_area_transf); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + lv_point_t txt_size; + lv_txt_get_size(&txt_size, cb->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + + lv_draw_label_dsc_t txt_dsc; + lv_draw_label_dsc_init(&txt_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &txt_dsc); + + lv_coord_t y_ofs = (lv_area_get_height(&marker_area) - font_h) / 2; + lv_area_t txt_area; + txt_area.x1 = marker_area.x2 + bg_colp; + txt_area.x2 = txt_area.x1 + txt_size.x; + txt_area.y1 = obj->coords.y1 + bg_topp + y_ofs; + txt_area.y2 = txt_area.y1 + txt_size.y; + + lv_draw_label(draw_ctx, &txt_dsc, &txt_area, cb->txt, NULL); +} +#endif -- cgit v1.2.3