From fbc8dbe6a71e931f97bdbde939a3e8b9d22a968e Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Sat, 16 Aug 2025 12:31:01 +0200 Subject: [PATCH] feat(tabview): support getting tab buttons by index --- src/others/xml/lv_xml.c | 1 + .../xml/parsers/lv_xml_tabview_parser.c | 27 +++++++++++++++++++ .../xml/parsers/lv_xml_tabview_parser.h | 2 ++ src/widgets/tabview/lv_tabview.c | 7 +++++ src/widgets/tabview/lv_tabview.h | 9 +++++++ xmls/lv_tabview.xml | 4 +++ 6 files changed, 50 insertions(+) diff --git a/src/others/xml/lv_xml.c b/src/others/xml/lv_xml.c index f24da584ab..40773a9ecb 100644 --- a/src/others/xml/lv_xml.c +++ b/src/others/xml/lv_xml.c @@ -96,6 +96,7 @@ void lv_xml_init(void) lv_xml_widget_register("lv_tabview", lv_xml_tabview_create, lv_xml_tabview_apply); lv_xml_widget_register("lv_tabview-tab_bar", lv_xml_tabview_tab_bar_create, lv_xml_tabview_tab_bar_apply); lv_xml_widget_register("lv_tabview-tab", lv_xml_tabview_tab_create, lv_xml_tabview_tab_apply); + lv_xml_widget_register("lv_tabview-tab_button", lv_xml_tabview_tab_button_create, lv_xml_tabview_tab_button_apply); lv_xml_widget_register("lv_chart", lv_xml_chart_create, lv_xml_chart_apply); lv_xml_widget_register("lv_chart-cursor", lv_xml_chart_cursor_create, lv_xml_chart_cursor_apply); lv_xml_widget_register("lv_chart-series", lv_xml_chart_series_create, lv_xml_chart_series_apply); diff --git a/src/others/xml/parsers/lv_xml_tabview_parser.c b/src/others/xml/parsers/lv_xml_tabview_parser.c index e1e8947b06..dc93b80570 100644 --- a/src/others/xml/parsers/lv_xml_tabview_parser.c +++ b/src/others/xml/parsers/lv_xml_tabview_parser.c @@ -87,6 +87,33 @@ void lv_xml_tabview_tab_apply(lv_xml_parser_state_t * state, const char ** attrs lv_xml_obj_apply(state, attrs); } +void * lv_xml_tabview_tab_button_create(lv_xml_parser_state_t * state, const char ** attrs) +{ + lv_obj_t * tv = lv_xml_state_get_parent(state); + int32_t btn_cnt = lv_tabview_get_tab_count(tv); + if(btn_cnt == 0) { + LV_LOG_WARN("There are no buttons on the tab view. Get tab buttons when the tabs are already created"); + return NULL; + } + + const char * index_str = lv_xml_get_value_of(attrs, "index"); + int32_t index_int = index_str ? lv_xml_atoi(index_str) : 0; + if(LV_ABS(index_int) >= btn_cnt) { + LV_LOG_WARN("tabindex is out of range, using the first tab instead"); + index_int = 0; + } + + void * item = lv_tabview_get_tab_button(tv, index_int); + + return item; +} + +void lv_xml_tabview_tab_button_apply(lv_xml_parser_state_t * state, const char ** attrs) +{ + /*Apply the common properties, e.g. width, height, styles flags etc*/ + lv_xml_obj_apply(state, attrs); +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/others/xml/parsers/lv_xml_tabview_parser.h b/src/others/xml/parsers/lv_xml_tabview_parser.h index b96d6ccd92..a0860db478 100644 --- a/src/others/xml/parsers/lv_xml_tabview_parser.h +++ b/src/others/xml/parsers/lv_xml_tabview_parser.h @@ -30,6 +30,8 @@ void * lv_xml_tabview_tab_bar_create(lv_xml_parser_state_t * state, const char * void lv_xml_tabview_tab_bar_apply(lv_xml_parser_state_t * state, const char ** attrs); void * lv_xml_tabview_tab_create(lv_xml_parser_state_t * state, const char ** attrs); void lv_xml_tabview_tab_apply(lv_xml_parser_state_t * state, const char ** attrs); +void * lv_xml_tabview_tab_button_create(lv_xml_parser_state_t * state, const char ** attrs); +void lv_xml_tabview_tab_button_apply(lv_xml_parser_state_t * state, const char ** attrs); /********************** * MACROS diff --git a/src/widgets/tabview/lv_tabview.c b/src/widgets/tabview/lv_tabview.c index 165d43f073..94676ebf27 100644 --- a/src/widgets/tabview/lv_tabview.c +++ b/src/widgets/tabview/lv_tabview.c @@ -242,6 +242,13 @@ uint32_t lv_tabview_get_tab_active(lv_obj_t * obj) return tabview->tab_cur; } +lv_obj_t * lv_tabview_get_tab_button(lv_obj_t * obj, int32_t idx) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_obj_get_child_by_type(lv_tabview_get_tab_bar(obj), idx, &lv_button_class); +} + uint32_t lv_tabview_get_tab_count(lv_obj_t * obj) { LV_ASSERT_OBJ(obj, MY_CLASS); diff --git a/src/widgets/tabview/lv_tabview.h b/src/widgets/tabview/lv_tabview.h index f9bfdcc184..911c886a96 100644 --- a/src/widgets/tabview/lv_tabview.h +++ b/src/widgets/tabview/lv_tabview.h @@ -88,6 +88,15 @@ uint32_t lv_tabview_get_tab_count(lv_obj_t * obj); */ uint32_t lv_tabview_get_tab_active(lv_obj_t * obj); +/** + * Get a given tab button by index + * @param obj pointer to a tabview widget + * @param idx zero based index of the tab button to get. + * < 0 means start counting tab button from the back (-1 is the last tab button) + * @return pointer to the tab button, or NULL if the index was out of range + */ +lv_obj_t * lv_tabview_get_tab_button(lv_obj_t * obj, int32_t idx); + /** * Get the widget where the container of each tab is created * @param obj pointer to a tabview widget diff --git a/xmls/lv_tabview.xml b/xmls/lv_tabview.xml index e53cf8288a..04407eda37 100644 --- a/xmls/lv_tabview.xml +++ b/xmls/lv_tabview.xml @@ -16,5 +16,9 @@ Example + + + + \ No newline at end of file