diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-06-01 15:41:47 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-06-01 15:41:47 +1000 |
| commit | dd27c3530432ea0b09f01e604bf577f31d8ef841 (patch) | |
| tree | bbf86cf81a78f0ff0b07f31f1c390db473f26fd3 /lib/lvgl/examples/scroll | |
| parent | 6fd588e970470b15936187980829916d0dbe77bb (diff) | |
| download | tangara-fw-dd27c3530432ea0b09f01e604bf577f31d8ef841.tar.gz | |
convert lvgl from submodule to a plain old directory
Diffstat (limited to 'lib/lvgl/examples/scroll')
| m--------- | lib/lvgl | 0 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/index.rst | 33 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll.h | 44 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_1.c | 43 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_1.py | 38 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_2.c | 57 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_2.py | 47 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_3.c | 49 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_3.py | 38 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_4.c | 68 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_4.py | 62 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_5.c | 23 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_5.py | 13 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_6.c | 80 | ||||
| -rw-r--r-- | lib/lvgl/examples/scroll/lv_example_scroll_6.py | 68 |
15 files changed, 663 insertions, 0 deletions
diff --git a/lib/lvgl b/lib/lvgl deleted file mode 160000 -Subproject 0732400e7b564dd0e7dc4a924619d8e19c5b23a diff --git a/lib/lvgl/examples/scroll/index.rst b/lib/lvgl/examples/scroll/index.rst new file mode 100644 index 00000000..0b392051 --- /dev/null +++ b/lib/lvgl/examples/scroll/index.rst @@ -0,0 +1,33 @@ + +Nested scrolling +"""""""""""""""" + +.. lv_example:: scroll/lv_example_scroll_1 + :language: c + +Snapping +"""""""""""""""" +.. lv_example:: scroll/lv_example_scroll_2 + :language: c + +Floating button +"""""""""""""""" +.. lv_example:: scroll/lv_example_scroll_3 + :language: c + +Styling the scrollbars +"""""""""""""""""""""""" +.. lv_example:: scroll/lv_example_scroll_4 + :language: c + +Right to left scrolling +"""""""""""""""""""""""" +.. lv_example:: scroll/lv_example_scroll_5 + :language: c + +Translate on scroll +"""""""""""""""""""""""" +.. lv_example:: scroll/lv_example_scroll_6 + :language: c + + diff --git a/lib/lvgl/examples/scroll/lv_example_scroll.h b/lib/lvgl/examples/scroll/lv_example_scroll.h new file mode 100644 index 00000000..dc38bef0 --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll.h @@ -0,0 +1,44 @@ +/** + * @file lv_example_scroll.h + * + */ + +#ifndef LV_EXAMPLE_SCROLL_H +#define LV_EXAMPLE_SCROLL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_example_scroll_1(void); +void lv_example_scroll_2(void); +void lv_example_scroll_3(void); +void lv_example_scroll_4(void); +void lv_example_scroll_5(void); +void lv_example_scroll_6(void); + + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_EXAMPLE_SCROLL_H*/ diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_1.c b/lib/lvgl/examples/scroll/lv_example_scroll_1.c new file mode 100644 index 00000000..4f7e1214 --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_1.c @@ -0,0 +1,43 @@ +#include "../lv_examples.h" +#if LV_BUILD_EXAMPLES + +/** + * Demonstrate how scrolling appears automatically + */ +void lv_example_scroll_1(void) +{ + /*Create an object with the new style*/ + lv_obj_t * panel = lv_obj_create(lv_scr_act()); + lv_obj_set_size(panel, 200, 200); + lv_obj_center(panel); + + lv_obj_t * child; + lv_obj_t * label; + + child = lv_obj_create(panel); + lv_obj_set_pos(child, 0, 0); + lv_obj_set_size(child, 70, 70); + label = lv_label_create(child); + lv_label_set_text(label, "Zero"); + lv_obj_center(label); + + child = lv_obj_create(panel); + lv_obj_set_pos(child, 160, 80); + lv_obj_set_size(child, 80, 80); + + lv_obj_t * child2 = lv_btn_create(child); + lv_obj_set_size(child2, 100, 50); + + label = lv_label_create(child2); + lv_label_set_text(label, "Right"); + lv_obj_center(label); + + child = lv_obj_create(panel); + lv_obj_set_pos(child, 40, 160); + lv_obj_set_size(child, 100, 70); + label = lv_label_create(child); + lv_label_set_text(label, "Bottom"); + lv_obj_center(label); +} + +#endif diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_1.py b/lib/lvgl/examples/scroll/lv_example_scroll_1.py new file mode 100644 index 00000000..f0458971 --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_1.py @@ -0,0 +1,38 @@ +# +# Demonstrate how scrolling appears automatically +# +# Create an object with the new style +panel = lv.obj(lv.scr_act()) +panel.set_size(200, 200) +panel.center() + +child = lv.obj(panel) +child.set_pos(0, 0) +label = lv.label(child) +label.set_text("Zero") +label.center() + +child = lv.obj(panel) +child.set_pos(-40, 100) +label = lv.label(child) +label.set_text("Left") +label.center() + +child = lv.obj(panel) +child.set_pos(90, -30) +label = lv.label(child) +label.set_text("Top") +label.center() + +child = lv.obj(panel) +child.set_pos(150, 80) +label = lv.label(child) +label.set_text("Right") +label.center() + +child = lv.obj(panel) +child.set_pos(60, 170) +label = lv.label(child) +label.set_text("Bottom") +label.center() + diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_2.c b/lib/lvgl/examples/scroll/lv_example_scroll_2.c new file mode 100644 index 00000000..37d19f0b --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_2.c @@ -0,0 +1,57 @@ +#include "../lv_examples.h" +#if LV_BUILD_EXAMPLES && LV_USE_FLEX + +static void sw_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * sw = lv_event_get_target(e); + + if(code == LV_EVENT_VALUE_CHANGED) { + lv_obj_t * list = lv_event_get_user_data(e); + + if(lv_obj_has_state(sw, LV_STATE_CHECKED)) lv_obj_add_flag(list, LV_OBJ_FLAG_SCROLL_ONE); + else lv_obj_clear_flag(list, LV_OBJ_FLAG_SCROLL_ONE); + } +} + +/** + * Show an example to scroll snap + */ +void lv_example_scroll_2(void) +{ + lv_obj_t * panel = lv_obj_create(lv_scr_act()); + lv_obj_set_size(panel, 280, 120); + lv_obj_set_scroll_snap_x(panel, LV_SCROLL_SNAP_CENTER); + lv_obj_set_flex_flow(panel, LV_FLEX_FLOW_ROW); + lv_obj_align(panel, LV_ALIGN_CENTER, 0, 20); + + uint32_t i; + for(i = 0; i < 10; i++) { + lv_obj_t * btn = lv_btn_create(panel); + lv_obj_set_size(btn, 150, lv_pct(100)); + + lv_obj_t * label = lv_label_create(btn); + if(i == 3) { + lv_label_set_text_fmt(label, "Panel %"LV_PRIu32"\nno snap", i); + lv_obj_clear_flag(btn, LV_OBJ_FLAG_SNAPPABLE); + } + else { + lv_label_set_text_fmt(label, "Panel %"LV_PRIu32, i); + } + + lv_obj_center(label); + } + lv_obj_update_snap(panel, LV_ANIM_ON); + +#if LV_USE_SWITCH + /*Switch between "One scroll" and "Normal scroll" mode*/ + lv_obj_t * sw = lv_switch_create(lv_scr_act()); + lv_obj_align(sw, LV_ALIGN_TOP_RIGHT, -20, 10); + lv_obj_add_event_cb(sw, sw_event_cb, LV_EVENT_ALL, panel); + lv_obj_t * label = lv_label_create(lv_scr_act()); + lv_label_set_text(label, "One scroll"); + lv_obj_align_to(label, sw, LV_ALIGN_OUT_BOTTOM_MID, 0, 5); +#endif +} + +#endif diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_2.py b/lib/lvgl/examples/scroll/lv_example_scroll_2.py new file mode 100644 index 00000000..52e40e30 --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_2.py @@ -0,0 +1,47 @@ +def sw_event_cb(e,panel): + + code = e.get_code() + sw = e.get_target() + + if code == lv.EVENT.VALUE_CHANGED: + + if sw.has_state(lv.STATE.CHECKED): + panel.add_flag(lv.obj.FLAG.SCROLL_ONE) + else: + panel.clear_flag(lv.obj.FLAG.SCROLL_ONE) + + +# +# Show an example to scroll snap +# + +panel = lv.obj(lv.scr_act()) +panel.set_size(280, 150) +panel.set_scroll_snap_x(lv.SCROLL_SNAP.CENTER) +panel.set_flex_flow(lv.FLEX_FLOW.ROW) +panel.center() + +for i in range(10): + btn = lv.btn(panel) + btn.set_size(150, 100) + + label = lv.label(btn) + if i == 3: + label.set_text("Panel {:d}\nno snap".format(i)) + btn.clear_flag(lv.obj.FLAG.SNAPPABLE) + else: + label.set_text("Panel {:d}".format(i)) + label.center() + +panel.update_snap(lv.ANIM.ON) + + +# Switch between "One scroll" and "Normal scroll" mode +sw = lv.switch(lv.scr_act()) +sw.align(lv.ALIGN.TOP_RIGHT, -20, 10) +sw.add_event_cb(lambda evt: sw_event_cb(evt,panel), lv.EVENT.ALL, None) +label = lv.label(lv.scr_act()) +label.set_text("One scroll") +label.align_to(sw, lv.ALIGN.OUT_BOTTOM_MID, 0, 5) + + diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_3.c b/lib/lvgl/examples/scroll/lv_example_scroll_3.c new file mode 100644 index 00000000..1d05e690 --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_3.c @@ -0,0 +1,49 @@ +#include "../lv_examples.h" +#if LV_BUILD_EXAMPLES && LV_USE_LIST + +static uint32_t btn_cnt = 1; + +static void float_btn_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * float_btn = lv_event_get_target(e); + + if(code == LV_EVENT_CLICKED) { + lv_obj_t * list = lv_event_get_user_data(e); + char buf[32]; + lv_snprintf(buf, sizeof(buf), "Track %d", (int)btn_cnt); + lv_obj_t * list_btn = lv_list_add_btn(list, LV_SYMBOL_AUDIO, buf); + btn_cnt++; + + lv_obj_move_foreground(float_btn); + + lv_obj_scroll_to_view(list_btn, LV_ANIM_ON); + } +} + +/** + * Create a list with a floating button + */ +void lv_example_scroll_3(void) +{ + lv_obj_t * list = lv_list_create(lv_scr_act()); + lv_obj_set_size(list, 280, 220); + lv_obj_center(list); + + for(btn_cnt = 1; btn_cnt <= 2; btn_cnt++) { + char buf[32]; + lv_snprintf(buf, sizeof(buf), "Track %d", (int)btn_cnt); + lv_list_add_btn(list, LV_SYMBOL_AUDIO, buf); + } + + lv_obj_t * float_btn = lv_btn_create(list); + lv_obj_set_size(float_btn, 50, 50); + lv_obj_add_flag(float_btn, LV_OBJ_FLAG_FLOATING); + lv_obj_align(float_btn, LV_ALIGN_BOTTOM_RIGHT, 0, -lv_obj_get_style_pad_right(list, LV_PART_MAIN)); + lv_obj_add_event_cb(float_btn, float_btn_event_cb, LV_EVENT_ALL, list); + lv_obj_set_style_radius(float_btn, LV_RADIUS_CIRCLE, 0); + lv_obj_set_style_bg_img_src(float_btn, LV_SYMBOL_PLUS, 0); + lv_obj_set_style_text_font(float_btn, lv_theme_get_font_large(float_btn), 0); +} + +#endif diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_3.py b/lib/lvgl/examples/scroll/lv_example_scroll_3.py new file mode 100644 index 00000000..aae306e0 --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_3.py @@ -0,0 +1,38 @@ +class ScrollExample_3(): + def __init__(self): + self.btn_cnt = 1 + # + # Create a list with a floating button + # + + list = lv.list(lv.scr_act()) + list.set_size(280, 220) + list.center() + + for btn_cnt in range(2): + list.add_btn(lv.SYMBOL.AUDIO,"Track {:d}".format(btn_cnt)) + + float_btn = lv.btn(list) + float_btn.set_size(50, 50) + float_btn.add_flag(lv.obj.FLAG.FLOATING) + float_btn.align(lv.ALIGN.BOTTOM_RIGHT, 0, -list.get_style_pad_right(lv.PART.MAIN)) + float_btn.add_event_cb(lambda evt: self.float_btn_event_cb(evt,list), lv.EVENT.ALL, None) + float_btn.set_style_radius(lv.RADIUS.CIRCLE, 0) + float_btn.set_style_bg_img_src(lv.SYMBOL.PLUS, 0) + float_btn.set_style_text_font(lv.theme_get_font_large(float_btn), 0) + + def float_btn_event_cb(self,e,list): + code = e.get_code() + float_btn = e.get_target() + + if code == lv.EVENT.CLICKED: + list_btn = list.add_btn(lv.SYMBOL.AUDIO, "Track {:d}".format(self.btn_cnt)) + self.btn_cnt += 1 + + float_btn.move_foreground() + + list_btn.scroll_to_view(lv.ANIM.ON) + +scroll_example_3 = ScrollExample_3() + + diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_4.c b/lib/lvgl/examples/scroll/lv_example_scroll_4.c new file mode 100644 index 00000000..5bbff5c2 --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_4.c @@ -0,0 +1,68 @@ +#include "../lv_examples.h" +#if LV_BUILD_EXAMPLES && LV_USE_LIST + + +/** + * Styling the scrollbars + */ +void lv_example_scroll_4(void) +{ + lv_obj_t * obj = lv_obj_create(lv_scr_act()); + lv_obj_set_size(obj, 200, 100); + lv_obj_center(obj); + + lv_obj_t * label = lv_label_create(obj); + lv_label_set_text(label, + "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + "Etiam dictum, tortor vestibulum lacinia laoreet, mi neque consectetur neque, vel mattis odio dolor egestas ligula. \n" + "Sed vestibulum sapien nulla, id convallis ex porttitor nec. \n" + "Duis et massa eu libero accumsan faucibus a in arcu. \n" + "Ut pulvinar odio lorem, vel tempus turpis condimentum quis. Nam consectetur condimentum sem in auctor. \n" + "Sed nisl augue, venenatis in blandit et, gravida ac tortor. \n" + "Etiam dapibus elementum suscipit. \n" + "Proin mollis sollicitudin convallis. \n" + "Integer dapibus tempus arcu nec viverra. \n" + "Donec molestie nulla enim, eu interdum velit placerat quis. \n" + "Donec id efficitur risus, at molestie turpis. \n" + "Suspendisse vestibulum consectetur nunc ut commodo. \n" + "Fusce molestie rhoncus nisi sit amet tincidunt. \n" + "Suspendisse a nunc ut magna ornare volutpat."); + + + /*Remove the style of scrollbar to have clean start*/ + lv_obj_remove_style(obj, NULL, LV_PART_SCROLLBAR | LV_STATE_ANY); + + /*Create a transition the animate the some properties on state change*/ + static const lv_style_prop_t props[] = {LV_STYLE_BG_OPA, LV_STYLE_WIDTH, 0}; + static lv_style_transition_dsc_t trans; + lv_style_transition_dsc_init(&trans, props, lv_anim_path_linear, 200, 0, NULL); + + /*Create a style for the scrollbars*/ + static lv_style_t style; + lv_style_init(&style); + lv_style_set_width(&style, 4); /*Width of the scrollbar*/ + lv_style_set_pad_right(&style, 5); /*Space from the parallel side*/ + lv_style_set_pad_top(&style, 5); /*Space from the perpendicular side*/ + + lv_style_set_radius(&style, 2); + lv_style_set_bg_opa(&style, LV_OPA_70); + lv_style_set_bg_color(&style, lv_palette_main(LV_PALETTE_BLUE)); + lv_style_set_border_color(&style, lv_palette_darken(LV_PALETTE_BLUE, 3)); + lv_style_set_border_width(&style, 2); + lv_style_set_shadow_width(&style, 8); + lv_style_set_shadow_spread(&style, 2); + lv_style_set_shadow_color(&style, lv_palette_darken(LV_PALETTE_BLUE, 1)); + + lv_style_set_transition(&style, &trans); + + /*Make the scrollbars wider and use 100% opacity when scrolled*/ + static lv_style_t style_scrolled; + lv_style_init(&style_scrolled); + lv_style_set_width(&style_scrolled, 8); + lv_style_set_bg_opa(&style_scrolled, LV_OPA_COVER); + + lv_obj_add_style(obj, &style, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &style_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); +} + +#endif diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_4.py b/lib/lvgl/examples/scroll/lv_example_scroll_4.py new file mode 100644 index 00000000..9556f60f --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_4.py @@ -0,0 +1,62 @@ +# +# Styling the scrollbars +# +obj = lv.obj(lv.scr_act()) +obj.set_size(200, 100) +obj.center() + +label = lv.label(obj) +label.set_text( +""" +Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Etiam dictum, tortor vestibulum lacinia laoreet, mi neque consectetur neque, vel mattis odio dolor egestas ligula. +Sed vestibulum sapien nulla, id convallis ex porttitor nec. +Duis et massa eu libero accumsan faucibus a in arcu. +Ut pulvinar odio lorem, vel tempus turpis condimentum quis. Nam consectetur condimentum sem in auctor. +Sed nisl augue, venenatis in blandit et, gravida ac tortor. +Etiam dapibus elementum suscipit. +Proin mollis sollicitudin convallis. +Integer dapibus tempus arcu nec viverra. +Donec molestie nulla enim, eu interdum velit placerat quis. +Donec id efficitur risus, at molestie turpis. +Suspendisse vestibulum consectetur nunc ut commodo. +Fusce molestie rhoncus nisi sit amet tincidunt. +Suspendisse a nunc ut magna ornare volutpat. +""") + + +# Remove the style of scrollbar to have clean start +obj.remove_style(None, lv.PART.SCROLLBAR | lv.STATE.ANY) + +# Create a transition the animate the some properties on state change +props = [lv.STYLE.BG_OPA, lv.STYLE.WIDTH, 0] +trans = lv.style_transition_dsc_t() +trans.init(props, lv.anim_t.path_linear, 200, 0, None) + +# Create a style for the scrollbars +style = lv.style_t() +style.init() +style.set_width(4) # Width of the scrollbar +style.set_pad_right(5) # Space from the parallel side +style.set_pad_top(5) # Space from the perpendicular side + +style.set_radius(2) +style.set_bg_opa(lv.OPA._70) +style.set_bg_color(lv.palette_main(lv.PALETTE.BLUE)) +style.set_border_color(lv.palette_darken(lv.PALETTE.BLUE, 3)) +style.set_border_width(2) +style.set_shadow_width(8) +style.set_shadow_spread(2) +style.set_shadow_color(lv.palette_darken(lv.PALETTE.BLUE, 1)) + +style.set_transition(trans) + +# Make the scrollbars wider and use 100% opacity when scrolled +style_scrolled = lv.style_t() +style_scrolled.init() +style_scrolled.set_width(8) +style_scrolled.set_bg_opa(lv.OPA.COVER) + +obj.add_style(style, lv.PART.SCROLLBAR) +obj.add_style(style_scrolled, lv.PART.SCROLLBAR | lv.STATE.SCROLLED) + diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_5.c b/lib/lvgl/examples/scroll/lv_example_scroll_5.c new file mode 100644 index 00000000..60e65ffa --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_5.c @@ -0,0 +1,23 @@ +#include "../lv_examples.h" +#if LV_BUILD_EXAMPLES && LV_FONT_DEJAVU_16_PERSIAN_HEBREW + + +/** + * Scrolling with Right To Left base direction + */ +void lv_example_scroll_5(void) +{ + lv_obj_t * obj = lv_obj_create(lv_scr_act()); + lv_obj_set_style_base_dir(obj, LV_BASE_DIR_RTL, 0); + lv_obj_set_size(obj, 200, 100); + lv_obj_center(obj); + + lv_obj_t * label = lv_label_create(obj); + lv_label_set_text(label, + "میکروکُنترولر (به انگلیسی: Microcontroller) گونهای ریزپردازنده است که دارای حافظهٔ دسترسی تصادفی (RAM) و حافظهٔ فقطخواندنی (ROM)، تایمر، پورتهای ورودی و خروجی (I/O) و درگاه ترتیبی (Serial Port پورت سریال)، درون خود تراشه است، و میتواند به تنهایی ابزارهای دیگر را کنترل کند. به عبارت دیگر یک میکروکنترلر، مدار مجتمع کوچکی است که از یک CPU کوچک و اجزای دیگری مانند تایمر، درگاههای ورودی و خروجی آنالوگ و دیجیتال و حافظه تشکیل شدهاست."); + lv_obj_set_width(label, 400); + lv_obj_set_style_text_font(label, &lv_font_dejavu_16_persian_hebrew, 0); + +} + +#endif diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_5.py b/lib/lvgl/examples/scroll/lv_example_scroll_5.py new file mode 100644 index 00000000..064d4816 --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_5.py @@ -0,0 +1,13 @@ +# +# Scrolling with Right To Left base direction +# +obj = lv.obj(lv.scr_act()) +obj.set_style_base_dir(lv.BASE_DIR.RTL, 0) +obj.set_size(200, 100) +obj.center() + +label = lv.label(obj) +label.set_text("میکروکُنترولر (به انگلیسی: Microcontroller) گونهای ریزپردازنده است که دارای حافظهٔ دسترسی تصادفی (RAM) و حافظهٔ فقطخواندنی (ROM)، تایمر، پورتهای ورودی و خروجی (I/O) و درگاه ترتیبی (Serial Port پورت سریال)، درون خود تراشه است، و میتواند به تنهایی ابزارهای دیگر را کنترل کند. به عبارت دیگر یک میکروکنترلر، مدار مجتمع کوچکی است که از یک CPU کوچک و اجزای دیگری مانند تایمر، درگاههای ورودی و خروجی آنالوگ و دیجیتال و حافظه تشکیل شدهاست.") +label.set_width(400) +label.set_style_text_font(lv.font_dejavu_16_persian_hebrew, 0) + diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_6.c b/lib/lvgl/examples/scroll/lv_example_scroll_6.c new file mode 100644 index 00000000..5ce864ac --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_6.c @@ -0,0 +1,80 @@ +#include "../lv_examples.h" +#if LV_BUILD_EXAMPLES && LV_USE_FLEX + +static void scroll_event_cb(lv_event_t * e) +{ + lv_obj_t * cont = lv_event_get_target(e); + + lv_area_t cont_a; + lv_obj_get_coords(cont, &cont_a); + lv_coord_t cont_y_center = cont_a.y1 + lv_area_get_height(&cont_a) / 2; + + lv_coord_t r = lv_obj_get_height(cont) * 7 / 10; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(cont); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(cont, i); + lv_area_t child_a; + lv_obj_get_coords(child, &child_a); + + lv_coord_t child_y_center = child_a.y1 + lv_area_get_height(&child_a) / 2; + + lv_coord_t diff_y = child_y_center - cont_y_center; + diff_y = LV_ABS(diff_y); + + /*Get the x of diff_y on a circle.*/ + lv_coord_t x; + /*If diff_y is out of the circle use the last point of the circle (the radius)*/ + if(diff_y >= r) { + x = r; + } + else { + /*Use Pythagoras theorem to get x from radius and y*/ + uint32_t x_sqr = r * r - diff_y * diff_y; + lv_sqrt_res_t res; + lv_sqrt(x_sqr, &res, 0x8000); /*Use lvgl's built in sqrt root function*/ + x = r - res.i; + } + + /*Translate the item by the calculated X coordinate*/ + lv_obj_set_style_translate_x(child, x, 0); + + /*Use some opacity with larger translations*/ + lv_opa_t opa = lv_map(x, 0, r, LV_OPA_TRANSP, LV_OPA_COVER); + lv_obj_set_style_opa(child, LV_OPA_COVER - opa, 0); + } +} + +/** + * Translate the object as they scroll + */ +void lv_example_scroll_6(void) +{ + lv_obj_t * cont = lv_obj_create(lv_scr_act()); + lv_obj_set_size(cont, 200, 200); + lv_obj_center(cont); + lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN); + lv_obj_add_event_cb(cont, scroll_event_cb, LV_EVENT_SCROLL, NULL); + lv_obj_set_style_radius(cont, LV_RADIUS_CIRCLE, 0); + lv_obj_set_style_clip_corner(cont, true, 0); + lv_obj_set_scroll_dir(cont, LV_DIR_VER); + lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_CENTER); + lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF); + + uint32_t i; + for(i = 0; i < 20; i++) { + lv_obj_t * btn = lv_btn_create(cont); + lv_obj_set_width(btn, lv_pct(100)); + + lv_obj_t * label = lv_label_create(btn); + lv_label_set_text_fmt(label, "Button %"LV_PRIu32, i); + } + + /*Update the buttons position manually for first*/ + lv_event_send(cont, LV_EVENT_SCROLL, NULL); + + /*Be sure the fist button is in the middle*/ + lv_obj_scroll_to_view(lv_obj_get_child(cont, 0), LV_ANIM_OFF); +} + +#endif diff --git a/lib/lvgl/examples/scroll/lv_example_scroll_6.py b/lib/lvgl/examples/scroll/lv_example_scroll_6.py new file mode 100644 index 00000000..9b1e9b86 --- /dev/null +++ b/lib/lvgl/examples/scroll/lv_example_scroll_6.py @@ -0,0 +1,68 @@ +def scroll_event_cb(e): + + cont = e.get_target() + + cont_a = lv.area_t() + cont.get_coords(cont_a) + cont_y_center = cont_a.y1 + cont_a.get_height() // 2 + + r = cont.get_height() * 7 // 10 + + child_cnt = cont.get_child_cnt() + for i in range(child_cnt): + child = cont.get_child(i) + child_a = lv.area_t() + child.get_coords(child_a) + + child_y_center = child_a.y1 + child_a.get_height() // 2 + + diff_y = child_y_center - cont_y_center + diff_y = abs(diff_y) + + # Get the x of diff_y on a circle. + + # If diff_y is out of the circle use the last point of the circle (the radius) + if diff_y >= r: + x = r + else: + # Use Pythagoras theorem to get x from radius and y + x_sqr = r * r - diff_y * diff_y + res = lv.sqrt_res_t() + lv.sqrt(x_sqr, res, 0x8000) # Use lvgl's built in sqrt root function + x = r - res.i + + # Translate the item by the calculated X coordinate + child.set_style_translate_x(x, 0) + + # Use some opacity with larger translations + opa = lv.map(x, 0, r, lv.OPA.TRANSP, lv.OPA.COVER) + child.set_style_opa(lv.OPA.COVER - opa, 0) + +# +# Translate the object as they scroll +# + +cont = lv.obj(lv.scr_act()) +cont.set_size(200, 200) +cont.center() +cont.set_flex_flow(lv.FLEX_FLOW.COLUMN) +cont.add_event_cb(scroll_event_cb, lv.EVENT.SCROLL, None) +cont.set_style_radius(lv.RADIUS.CIRCLE, 0) +cont.set_style_clip_corner(True, 0) +cont.set_scroll_dir(lv.DIR.VER) +cont.set_scroll_snap_y(lv.SCROLL_SNAP.CENTER) +cont.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) + +for i in range(20): + btn = lv.btn(cont) + btn.set_width(lv.pct(100)) + + label = lv.label(btn) + label.set_text("Button " + str(i)) + + # Update the buttons position manually for first* + lv.event_send(cont, lv.EVENT.SCROLL, None) + + # Be sure the fist button is in the middle + #lv.obj.scroll_to_view(cont.get_child(0), lv.ANIM.OFF) + cont.get_child(0).scroll_to_view(lv.ANIM.OFF) |
