summaryrefslogtreecommitdiff
path: root/lib/lvgl/examples/scroll
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-06-01 15:41:47 +1000
committerjacqueline <me@jacqueline.id.au>2023-06-01 15:41:47 +1000
commitdd27c3530432ea0b09f01e604bf577f31d8ef841 (patch)
treebbf86cf81a78f0ff0b07f31f1c390db473f26fd3 /lib/lvgl/examples/scroll
parent6fd588e970470b15936187980829916d0dbe77bb (diff)
downloadtangara-fw-dd27c3530432ea0b09f01e604bf577f31d8ef841.tar.gz
convert lvgl from submodule to a plain old directory
Diffstat (limited to 'lib/lvgl/examples/scroll')
m---------lib/lvgl0
-rw-r--r--lib/lvgl/examples/scroll/index.rst33
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll.h44
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_1.c43
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_1.py38
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_2.c57
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_2.py47
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_3.c49
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_3.py38
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_4.c68
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_4.py62
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_5.c23
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_5.py13
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_6.c80
-rw-r--r--lib/lvgl/examples/scroll/lv_example_scroll_6.py68
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)