From fd9e901625aca4a12b1b91d273d194fc6bf149e6 Mon Sep 17 00:00:00 2001 From: TridentTD Date: Mon, 24 Jun 2024 22:43:17 +0700 Subject: [PATCH] feat(bar): add bar orientation (#6212) Co-authored-by: Gabor Kiss-Vamosi --- src/widgets/bar/lv_bar.c | 34 ++++++++++++++++- src/widgets/bar/lv_bar.h | 27 ++++++++++++- tests/ref_imgs/widgets/bar_2.png | Bin 0 -> 11821 bytes tests/src/test_cases/widgets/test_bar.c | 48 ++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 tests/ref_imgs/widgets/bar_2.png diff --git a/src/widgets/bar/lv_bar.c b/src/widgets/bar/lv_bar.c index 7f4ebccfd..c0327a4c5 100644 --- a/src/widgets/bar/lv_bar.c +++ b/src/widgets/bar/lv_bar.c @@ -164,6 +164,15 @@ void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode) lv_obj_invalidate(obj); } +void lv_bar_set_orientation(lv_obj_t * obj, lv_bar_orientation_t orientation) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + bar->orientation = orientation; + lv_obj_invalidate(obj); +} + /*===================== * Getter functions *====================*/ @@ -209,6 +218,14 @@ lv_bar_mode_t lv_bar_get_mode(lv_obj_t * obj) return bar->mode; } +lv_bar_orientation_t lv_bar_get_orientation(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return bar->orientation; +} + bool lv_bar_is_symmetrical(lv_obj_t * obj) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -237,6 +254,7 @@ static void lv_bar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) bar->indic_area.y1 = 0; bar->indic_area.y2 = 0; bar->mode = LV_BAR_MODE_NORMAL; + bar->orientation = LV_BAR_ORIENTATION_AUTO; bar->val_reversed = false; lv_bar_init_anim(obj, &bar->cur_value_anim); @@ -280,7 +298,20 @@ static void draw_indic(lv_event_t * e) range = 1; } - bool hor = barw >= barh; + bool hor = false; + switch(bar->orientation) { + case LV_BAR_ORIENTATION_HORIZONTAL: + hor = true; + break; + case LV_BAR_ORIENTATION_VERTICAL: + hor = false; + break; + case LV_BAR_ORIENTATION_AUTO: + default: + hor = (barw >= barh); + break; + } + bool sym = lv_bar_is_symmetrical(obj); /*Calculate the indicator area*/ @@ -304,7 +335,6 @@ static void draw_indic(lv_event_t * e) bar->indic_area.x1 = obj->coords.x1 + (barw / 2) - (LV_BAR_SIZE_MIN / 2); bar->indic_area.x2 = bar->indic_area.x1 + LV_BAR_SIZE_MIN; } - int32_t indic_max_w = lv_area_get_width(&bar->indic_area); int32_t indic_max_h = lv_area_get_height(&bar->indic_area); diff --git a/src/widgets/bar/lv_bar.h b/src/widgets/bar/lv_bar.h index d2a882a05..e61be7e51 100644 --- a/src/widgets/bar/lv_bar.h +++ b/src/widgets/bar/lv_bar.h @@ -33,13 +33,23 @@ enum _lv_bar_mode_t { LV_BAR_MODE_SYMMETRICAL, LV_BAR_MODE_RANGE }; - #ifdef DOXYGEN typedef _lv_bar_mode_t lv_bar_mode_t; #else typedef uint8_t lv_bar_mode_t; #endif /*DOXYGEN*/ +enum _lv_bar_orientation_t { + LV_BAR_ORIENTATION_AUTO, + LV_BAR_ORIENTATION_HORIZONTAL, + LV_BAR_ORIENTATION_VERTICAL +}; +#ifdef DOXYGEN +typedef _lv_bar_orientation_t lv_bar_orientation_t; +#else +typedef uint8_t lv_bar_orientation_t; +#endif /*DOXYGEN*/ + typedef struct { lv_obj_t * bar; int32_t anim_start; @@ -58,6 +68,7 @@ typedef struct { _lv_bar_anim_t cur_value_anim; _lv_bar_anim_t start_value_anim; lv_bar_mode_t mode : 2; /**< Type of bar*/ + lv_bar_orientation_t orientation : 2; /**< Orientation of bar*/ } lv_bar_t; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_bar_class; @@ -109,6 +120,13 @@ void lv_bar_set_range(lv_obj_t * obj, int32_t min, int32_t max); */ void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode); +/** + * Set the orientation of bar. + * @param obj pointer to bar object + * @param orientation bar orientation from `lv_bar_orientation_t` + */ +void lv_bar_set_orientation(lv_obj_t * obj, lv_bar_orientation_t orientation); + /*===================== * Getter functions *====================*/ @@ -148,6 +166,13 @@ int32_t lv_bar_get_max_value(const lv_obj_t * obj); */ lv_bar_mode_t lv_bar_get_mode(lv_obj_t * obj); +/** + * Get the orientation of bar. + * @param obj pointer to bar object + * @return bar orientation from ::lv_bar_orientation_t + */ +lv_bar_orientation_t lv_bar_get_orientation(lv_obj_t * obj); + /** * Give the bar is in symmetrical mode or not * @param obj pointer to bar object diff --git a/tests/ref_imgs/widgets/bar_2.png b/tests/ref_imgs/widgets/bar_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb080499133b6ed55c19e9f6f06c2871547b9ea GIT binary patch literal 11821 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 Utjj_HFhI(;A1dYDG<^L(08dkVmjD0& literal 0 HcmV?d00001 diff --git a/tests/src/test_cases/widgets/test_bar.c b/tests/src/test_cases/widgets/test_bar.c index 4101522b1..8b2da2219 100644 --- a/tests/src/test_cases/widgets/test_bar.c +++ b/tests/src/test_cases/widgets/test_bar.c @@ -16,6 +16,7 @@ void setUp(void) void tearDown(void) { + lv_obj_clean(g_active_screen); } void test_bar_should_have_valid_default_attributes(void) @@ -399,4 +400,51 @@ void test_bar_render_corner(void) render_test_screen_create(true, LV_GRAD_DIR_VER, "widgets/bar_corner_6.png"); } + +static lv_obj_t * bar_create_orientation(lv_bar_orientation_t orientation, int32_t w, int32_t h) +{ + lv_obj_t * bar = lv_bar_create(g_active_screen); + lv_bar_set_orientation(bar, orientation); + lv_obj_set_size(bar, w, h); + lv_bar_set_value(bar, 30, LV_ANIM_OFF); + + return bar; + +} + +void test_bar_orientation(void) +{ + lv_obj_clean(g_active_screen); + + lv_obj_set_flex_flow(g_active_screen, LV_FLEX_FLOW_ROW_WRAP); + + lv_obj_t * label; + + label = lv_label_create(g_active_screen); + lv_label_set_text(label, "Auto"); + lv_obj_set_width(label, lv_pct(100)); + + bar_create_orientation(LV_BAR_ORIENTATION_AUTO, 100, 20); + bar_create_orientation(LV_BAR_ORIENTATION_AUTO, 20, 100); + bar_create_orientation(LV_BAR_ORIENTATION_AUTO, 100, 100); + + label = lv_label_create(g_active_screen); + lv_label_set_text(label, "Vertical"); + lv_obj_set_width(label, lv_pct(100)); + + bar_create_orientation(LV_BAR_ORIENTATION_VERTICAL, 100, 20); + bar_create_orientation(LV_BAR_ORIENTATION_VERTICAL, 20, 100); + bar_create_orientation(LV_BAR_ORIENTATION_VERTICAL, 100, 100); + + label = lv_label_create(g_active_screen); + lv_label_set_text(label, "Horizontal"); + lv_obj_set_width(label, lv_pct(100)); + + bar_create_orientation(LV_BAR_ORIENTATION_HORIZONTAL, 100, 20); + bar_create_orientation(LV_BAR_ORIENTATION_HORIZONTAL, 20, 100); + bar_create_orientation(LV_BAR_ORIENTATION_HORIZONTAL, 100, 100); + + TEST_ASSERT_EQUAL_SCREENSHOT("widgets/bar_2.png"); +} + #endif