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/examples/widgets/table/index.rst | 14 +++ .../examples/widgets/table/lv_example_table_1.c | 65 +++++++++++++ .../examples/widgets/table/lv_example_table_1.py | 53 +++++++++++ .../examples/widgets/table/lv_example_table_2.c | 103 +++++++++++++++++++++ .../examples/widgets/table/lv_example_table_2.py | 95 +++++++++++++++++++ 6 files changed, 330 insertions(+), 1 deletion(-) delete mode 160000 lib/lvgl create mode 100644 lib/lvgl/examples/widgets/table/index.rst create mode 100644 lib/lvgl/examples/widgets/table/lv_example_table_1.c create mode 100644 lib/lvgl/examples/widgets/table/lv_example_table_1.py create mode 100644 lib/lvgl/examples/widgets/table/lv_example_table_2.c create mode 100644 lib/lvgl/examples/widgets/table/lv_example_table_2.py (limited to 'lib/lvgl/examples/widgets/table') 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/examples/widgets/table/index.rst b/lib/lvgl/examples/widgets/table/index.rst new file mode 100644 index 00000000..0072bbb0 --- /dev/null +++ b/lib/lvgl/examples/widgets/table/index.rst @@ -0,0 +1,14 @@ + + +Simple table +""""""""""""""""""""""" + +.. lv_example:: widgets/table/lv_example_table_1 + :language: c + +Lightweighted list from table +"""""""""""""""""""""""""""""" + +.. lv_example:: widgets/table/lv_example_table_2 + :language: c + diff --git a/lib/lvgl/examples/widgets/table/lv_example_table_1.c b/lib/lvgl/examples/widgets/table/lv_example_table_1.c new file mode 100644 index 00000000..dc776370 --- /dev/null +++ b/lib/lvgl/examples/widgets/table/lv_example_table_1.c @@ -0,0 +1,65 @@ +#include "../../lv_examples.h" +#if LV_USE_TABLE && LV_BUILD_EXAMPLES + +static void draw_part_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e); + /*If the cells are drawn...*/ + if(dsc->part == LV_PART_ITEMS) { + uint32_t row = dsc->id / lv_table_get_col_cnt(obj); + uint32_t col = dsc->id - row * lv_table_get_col_cnt(obj); + + /*Make the texts in the first cell center aligned*/ + if(row == 0) { + dsc->label_dsc->align = LV_TEXT_ALIGN_CENTER; + dsc->rect_dsc->bg_color = lv_color_mix(lv_palette_main(LV_PALETTE_BLUE), dsc->rect_dsc->bg_color, LV_OPA_20); + dsc->rect_dsc->bg_opa = LV_OPA_COVER; + } + /*In the first column align the texts to the right*/ + else if(col == 0) { + dsc->label_dsc->align = LV_TEXT_ALIGN_RIGHT; + } + + /*MAke every 2nd row grayish*/ + if((row != 0 && row % 2) == 0) { + dsc->rect_dsc->bg_color = lv_color_mix(lv_palette_main(LV_PALETTE_GREY), dsc->rect_dsc->bg_color, LV_OPA_10); + dsc->rect_dsc->bg_opa = LV_OPA_COVER; + } + } +} + + +void lv_example_table_1(void) +{ + lv_obj_t * table = lv_table_create(lv_scr_act()); + + /*Fill the first column*/ + lv_table_set_cell_value(table, 0, 0, "Name"); + lv_table_set_cell_value(table, 1, 0, "Apple"); + lv_table_set_cell_value(table, 2, 0, "Banana"); + lv_table_set_cell_value(table, 3, 0, "Lemon"); + lv_table_set_cell_value(table, 4, 0, "Grape"); + lv_table_set_cell_value(table, 5, 0, "Melon"); + lv_table_set_cell_value(table, 6, 0, "Peach"); + lv_table_set_cell_value(table, 7, 0, "Nuts"); + + /*Fill the second column*/ + lv_table_set_cell_value(table, 0, 1, "Price"); + lv_table_set_cell_value(table, 1, 1, "$7"); + lv_table_set_cell_value(table, 2, 1, "$4"); + lv_table_set_cell_value(table, 3, 1, "$6"); + lv_table_set_cell_value(table, 4, 1, "$2"); + lv_table_set_cell_value(table, 5, 1, "$5"); + lv_table_set_cell_value(table, 6, 1, "$1"); + lv_table_set_cell_value(table, 7, 1, "$9"); + + /*Set a smaller height to the table. It'll make it scrollable*/ + lv_obj_set_height(table, 200); + lv_obj_center(table); + + /*Add an event callback to to apply some custom drawing*/ + lv_obj_add_event_cb(table, draw_part_event_cb, LV_EVENT_DRAW_PART_BEGIN, NULL); +} + +#endif diff --git a/lib/lvgl/examples/widgets/table/lv_example_table_1.py b/lib/lvgl/examples/widgets/table/lv_example_table_1.py new file mode 100644 index 00000000..7faf0049 --- /dev/null +++ b/lib/lvgl/examples/widgets/table/lv_example_table_1.py @@ -0,0 +1,53 @@ +def draw_part_event_cb(e): + obj = e.get_target() + dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) + # If the cells are drawn../ + if dsc.part == lv.PART.ITEMS: + row = dsc.id // obj.get_col_cnt() + col = dsc.id - row * obj.get_col_cnt() + + # Make the texts in the first cell center aligned + if row == 0: + dsc.label_dsc.align = lv.TEXT_ALIGN.CENTER + dsc.rect_dsc.bg_color = lv.palette_main(lv.PALETTE.BLUE).color_mix(dsc.rect_dsc.bg_color, lv.OPA._20) + dsc.rect_dsc.bg_opa = lv.OPA.COVER + + # In the first column align the texts to the right + elif col == 0: + dsc.label_dsc.flag = lv.TEXT_ALIGN.RIGHT + + # Make every 2nd row grayish + if row != 0 and (row % 2) == 0: + dsc.rect_dsc.bg_color = lv.palette_main(lv.PALETTE.GREY).color_mix(dsc.rect_dsc.bg_color, lv.OPA._10) + dsc.rect_dsc.bg_opa = lv.OPA.COVER + + +table = lv.table(lv.scr_act()) + +# Fill the first column +table.set_cell_value(0, 0, "Name") +table.set_cell_value(1, 0, "Apple") +table.set_cell_value(2, 0, "Banana") +table.set_cell_value(3, 0, "Lemon") +table.set_cell_value(4, 0, "Grape") +table.set_cell_value(5, 0, "Melon") +table.set_cell_value(6, 0, "Peach") +table.set_cell_value(7, 0, "Nuts") + +# Fill the second column +table.set_cell_value(0, 1, "Price") +table.set_cell_value(1, 1, "$7") +table.set_cell_value(2, 1, "$4") +table.set_cell_value(3, 1, "$6") +table.set_cell_value(4, 1, "$2") +table.set_cell_value(5, 1, "$5") +table.set_cell_value(6, 1, "$1") +table.set_cell_value(7, 1, "$9") + +# Set a smaller height to the table. It'll make it scrollable +table.set_height(200) +table.center() + +# Add an event callback to apply some custom drawing +table.add_event_cb(draw_part_event_cb, lv.EVENT.DRAW_PART_BEGIN, None) + diff --git a/lib/lvgl/examples/widgets/table/lv_example_table_2.c b/lib/lvgl/examples/widgets/table/lv_example_table_2.c new file mode 100644 index 00000000..bd1e933c --- /dev/null +++ b/lib/lvgl/examples/widgets/table/lv_example_table_2.c @@ -0,0 +1,103 @@ +#include "../../lv_examples.h" +#if LV_USE_TABLE && LV_BUILD_EXAMPLES + +#define ITEM_CNT 200 + +static void draw_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e); + /*If the cells are drawn...*/ + if(dsc->part == LV_PART_ITEMS) { + bool chk = lv_table_has_cell_ctrl(obj, dsc->id, 0, LV_TABLE_CELL_CTRL_CUSTOM_1); + + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = chk ? lv_theme_get_color_primary(obj) : lv_palette_lighten(LV_PALETTE_GREY, 2); + rect_dsc.radius = LV_RADIUS_CIRCLE; + + lv_area_t sw_area; + sw_area.x1 = dsc->draw_area->x2 - 50; + sw_area.x2 = sw_area.x1 + 40; + sw_area.y1 = dsc->draw_area->y1 + lv_area_get_height(dsc->draw_area) / 2 - 10; + sw_area.y2 = sw_area.y1 + 20; + lv_draw_rect(dsc->draw_ctx, &rect_dsc, &sw_area); + + rect_dsc.bg_color = lv_color_white(); + if(chk) { + sw_area.x2 -= 2; + sw_area.x1 = sw_area.x2 - 16; + } + else { + sw_area.x1 += 2; + sw_area.x2 = sw_area.x1 + 16; + } + sw_area.y1 += 2; + sw_area.y2 -= 2; + lv_draw_rect(dsc->draw_ctx, &rect_dsc, &sw_area); + } +} + +static void change_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + uint16_t col; + uint16_t row; + lv_table_get_selected_cell(obj, &row, &col); + bool chk = lv_table_has_cell_ctrl(obj, row, 0, LV_TABLE_CELL_CTRL_CUSTOM_1); + if(chk) lv_table_clear_cell_ctrl(obj, row, 0, LV_TABLE_CELL_CTRL_CUSTOM_1); + else lv_table_add_cell_ctrl(obj, row, 0, LV_TABLE_CELL_CTRL_CUSTOM_1); +} + + +/** + * A very light-weighted list created from table + */ +void lv_example_table_2(void) +{ + /*Measure memory usage*/ + lv_mem_monitor_t mon1; + lv_mem_monitor(&mon1); + + uint32_t t = lv_tick_get(); + + lv_obj_t * table = lv_table_create(lv_scr_act()); + + /*Set a smaller height to the table. It'll make it scrollable*/ + lv_obj_set_size(table, LV_SIZE_CONTENT, 200); + + lv_table_set_col_width(table, 0, 150); + lv_table_set_row_cnt(table, ITEM_CNT); /*Not required but avoids a lot of memory reallocation lv_table_set_set_value*/ + lv_table_set_col_cnt(table, 1); + + /*Don't make the cell pressed, we will draw something different in the event*/ + lv_obj_remove_style(table, NULL, LV_PART_ITEMS | LV_STATE_PRESSED); + + uint32_t i; + for(i = 0; i < ITEM_CNT; i++) { + lv_table_set_cell_value_fmt(table, i, 0, "Item %"LV_PRIu32, i + 1); + } + + lv_obj_align(table, LV_ALIGN_CENTER, 0, -20); + + /*Add an event callback to to apply some custom drawing*/ + lv_obj_add_event_cb(table, draw_event_cb, LV_EVENT_DRAW_PART_END, NULL); + lv_obj_add_event_cb(table, change_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + + lv_mem_monitor_t mon2; + lv_mem_monitor(&mon2); + + uint32_t mem_used = mon1.free_size - mon2.free_size; + + uint32_t elaps = lv_tick_elaps(t); + + lv_obj_t * label = lv_label_create(lv_scr_act()); + lv_label_set_text_fmt(label, "%"LV_PRIu32" items were created in %"LV_PRIu32" ms\n" + "using %"LV_PRIu32" bytes of memory", + ITEM_CNT, elaps, mem_used); + + lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -10); + +} + +#endif diff --git a/lib/lvgl/examples/widgets/table/lv_example_table_2.py b/lib/lvgl/examples/widgets/table/lv_example_table_2.py new file mode 100644 index 00000000..2da21613 --- /dev/null +++ b/lib/lvgl/examples/widgets/table/lv_example_table_2.py @@ -0,0 +1,95 @@ +from utime import ticks_ms +import gc + +ITEM_CNT = 200 + +def draw_event_cb(e): + obj = e.get_target() + dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) + # If the cells are drawn... + if dsc.part == lv.PART.ITEMS: + chk = obj.has_cell_ctrl(dsc.id, 0, lv.table.CELL_CTRL.CUSTOM_1) + + rect_dsc = lv.draw_rect_dsc_t() + rect_dsc.init() + + if chk: + rect_dsc.bg_color = lv.theme_get_color_primary(obj) + else: + rect_dsc.bg_color = lv.palette_lighten(lv.PALETTE.GREY, 2) + + rect_dsc.radius = lv.RADIUS.CIRCLE + + sw_area = lv.area_t() + sw_area.x1 = dsc.draw_area.x2 - 50 + sw_area.x2 = sw_area.x1 + 40 + sw_area.y1 = dsc.draw_area.y1 + dsc.draw_area.get_height() // 2 - 10 + sw_area.y2 = sw_area.y1 + 20 + dsc.draw_ctx.rect(rect_dsc, sw_area) + + rect_dsc.bg_color = lv.color_white() + + if chk: + sw_area.x2 -= 2 + sw_area.x1 = sw_area.x2 - 16 + else: + sw_area.x1 += 2 + sw_area.x2 = sw_area.x1 + 16 + sw_area.y1 += 2 + sw_area.y2 -= 2 + dsc.draw_ctx.rect(rect_dsc, sw_area) + +def change_event_cb(e): + obj = e.get_target() + row = lv.C_Pointer() + col = lv.C_Pointer() + table.get_selected_cell(row, col) + # print("row: ",row.uint_val) + + chk = table.has_cell_ctrl(row.uint_val, 0, lv.table.CELL_CTRL.CUSTOM_1) + if chk: + table.clear_cell_ctrl(row.uint_val, 0, lv.table.CELL_CTRL.CUSTOM_1) + else: + table.add_cell_ctrl(row.uint_val, 0, lv.table.CELL_CTRL.CUSTOM_1) + +# +# A very light-weighted list created from table +# + +# Measure memory usage +gc.enable() +gc.collect() +mem_free = gc.mem_free() +print("mem_free: ", mem_free) +t = ticks_ms() +print("ticks: ", t) +table = lv.table(lv.scr_act()) + +# Set a smaller height to the table. It'll make it scrollable +table.set_size(150, 200) + +table.set_col_width(0, 150) +table.set_row_cnt(ITEM_CNT) # Not required but avoids a lot of memory reallocation lv_table_set_set_value +table.set_col_cnt(1) + +# Don't make the cell pressed, we will draw something different in the event +table.remove_style(None, lv.PART.ITEMS | lv.STATE.PRESSED) + +for i in range(ITEM_CNT): + table.set_cell_value(i, 0, "Item " + str(i+1)) + +table.align(lv.ALIGN.CENTER, 0, -20) + +# Add an event callback to apply some custom drawing +table.add_event_cb(draw_event_cb, lv.EVENT.DRAW_PART_END, None) +table.add_event_cb(change_event_cb, lv.EVENT.VALUE_CHANGED, None) + +gc.collect() +mem_used = mem_free - gc.mem_free() +elaps = ticks_ms()-t + +label = lv.label(lv.scr_act()) +label.set_text(str(ITEM_CNT) + " items were created in " + str(elaps) + " ms\n using " + str(mem_used) + " bytes of memory") +#label.set_text(str(ITEM_CNT) + " items were created in " + str(elaps) + " ms") + +label.align(lv.ALIGN.BOTTOM_MID, 0, -10) -- cgit v1.2.3