summaryrefslogtreecommitdiff
path: root/lib/lvgl/demos/keypad_encoder
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/demos/keypad_encoder
parent6fd588e970470b15936187980829916d0dbe77bb (diff)
downloadtangara-fw-dd27c3530432ea0b09f01e604bf577f31d8ef841.tar.gz
convert lvgl from submodule to a plain old directory
Diffstat (limited to 'lib/lvgl/demos/keypad_encoder')
m---------lib/lvgl0
-rw-r--r--lib/lvgl/demos/keypad_encoder/README.md13
-rw-r--r--lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c220
-rw-r--r--lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h39
-rw-r--r--lib/lvgl/demos/keypad_encoder/screenshot1.gifbin0 -> 130172 bytes
-rw-r--r--lib/lvgl/demos/keypad_encoder/screenshot1.pngbin0 -> 14215 bytes
6 files changed, 272 insertions, 0 deletions
diff --git a/lib/lvgl b/lib/lvgl
deleted file mode 160000
-Subproject 0732400e7b564dd0e7dc4a924619d8e19c5b23a
diff --git a/lib/lvgl/demos/keypad_encoder/README.md b/lib/lvgl/demos/keypad_encoder/README.md
new file mode 100644
index 00000000..9fa792a7
--- /dev/null
+++ b/lib/lvgl/demos/keypad_encoder/README.md
@@ -0,0 +1,13 @@
+# Keypad and Encoder demo
+
+## Overview
+
+LVGL allows you to control the widgets with keypad and/or encoder without touchpad.
+This demo shows how to handle buttons, drop-down lists, rollers, sliders, switches and text inputs without touchpad.
+Learn more about the touchpad-less usage of LVGL [here](https://docs.lvgl.io/master/overview/indev.html#keypad-and-encoder).
+
+![Keypad and encoder navigation in LVGL embedded GUI library](screenshot1.gif)
+
+## Run the demo
+- In `lv_conf.h` or equivalent places set `LV_USE_DEMO_KEYPAD_AND_ENCODER 1`
+- After `lv_init()` and initializing the drivers call `lv_demo_keypad_encoder()`
diff --git a/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c
new file mode 100644
index 00000000..fdb9b94f
--- /dev/null
+++ b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c
@@ -0,0 +1,220 @@
+/**
+ * @file lv_demo_keypad_encoder.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "lv_demo_keypad_encoder.h"
+
+#if LV_USE_DEMO_KEYPAD_AND_ENCODER
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+static void selectors_create(lv_obj_t * parent);
+static void text_input_create(lv_obj_t * parent);
+static void msgbox_create(void);
+
+static void msgbox_event_cb(lv_event_t * e);
+static void ta_event_cb(lv_event_t * e);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+static lv_group_t * g;
+static lv_obj_t * tv;
+static lv_obj_t * t1;
+static lv_obj_t * t2;
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+void lv_demo_keypad_encoder(void)
+{
+ g = lv_group_create();
+ lv_group_set_default(g);
+
+ lv_indev_t * cur_drv = NULL;
+ for(;;) {
+ cur_drv = lv_indev_get_next(cur_drv);
+ if(!cur_drv) {
+ break;
+ }
+
+ if(cur_drv->driver->type == LV_INDEV_TYPE_KEYPAD) {
+ lv_indev_set_group(cur_drv, g);
+ }
+
+ if(cur_drv->driver->type == LV_INDEV_TYPE_ENCODER) {
+ lv_indev_set_group(cur_drv, g);
+ }
+ }
+
+ tv = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, LV_DPI_DEF / 3);
+
+ t1 = lv_tabview_add_tab(tv, "Selectors");
+ t2 = lv_tabview_add_tab(tv, "Text input");
+
+ selectors_create(t1);
+ text_input_create(t2);
+
+ msgbox_create();
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static void selectors_create(lv_obj_t * parent)
+{
+ lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_COLUMN);
+ lv_obj_set_flex_align(parent, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+
+ lv_obj_t * obj;
+
+ obj = lv_table_create(parent);
+ lv_table_set_cell_value(obj, 0, 0, "00");
+ lv_table_set_cell_value(obj, 0, 1, "01");
+ lv_table_set_cell_value(obj, 1, 0, "10");
+ lv_table_set_cell_value(obj, 1, 1, "11");
+ lv_table_set_cell_value(obj, 2, 0, "20");
+ lv_table_set_cell_value(obj, 2, 1, "21");
+ lv_table_set_cell_value(obj, 3, 0, "30");
+ lv_table_set_cell_value(obj, 3, 1, "31");
+ lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
+
+ obj = lv_calendar_create(parent);
+ lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
+
+ obj = lv_btnmatrix_create(parent);
+ lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
+
+ obj = lv_checkbox_create(parent);
+ lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
+
+ obj = lv_slider_create(parent);
+ lv_slider_set_range(obj, 0, 10);
+ lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
+
+ obj = lv_switch_create(parent);
+ lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
+
+ obj = lv_spinbox_create(parent);
+ lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
+
+ obj = lv_dropdown_create(parent);
+ lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
+
+ obj = lv_roller_create(parent);
+ lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
+
+ lv_obj_t * list = lv_list_create(parent);
+ lv_obj_update_layout(list);
+ if(lv_obj_get_height(list) > lv_obj_get_content_height(parent)) {
+ lv_obj_set_height(list, lv_obj_get_content_height(parent));
+ }
+
+ lv_list_add_btn(list, LV_SYMBOL_OK, "Apply");
+ lv_list_add_btn(list, LV_SYMBOL_CLOSE, "Close");
+ lv_list_add_btn(list, LV_SYMBOL_EYE_OPEN, "Show");
+ lv_list_add_btn(list, LV_SYMBOL_EYE_CLOSE, "Hide");
+ lv_list_add_btn(list, LV_SYMBOL_TRASH, "Delete");
+ lv_list_add_btn(list, LV_SYMBOL_COPY, "Copy");
+ lv_list_add_btn(list, LV_SYMBOL_PASTE, "Paste");
+}
+
+static void text_input_create(lv_obj_t * parent)
+{
+ lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_COLUMN);
+
+ lv_obj_t * ta1 = lv_textarea_create(parent);
+ lv_obj_set_width(ta1, LV_PCT(100));
+ lv_textarea_set_one_line(ta1, true);
+ lv_textarea_set_placeholder_text(ta1, "Click with an encoder to show a keyboard");
+
+ lv_obj_t * ta2 = lv_textarea_create(parent);
+ lv_obj_set_width(ta2, LV_PCT(100));
+ lv_textarea_set_one_line(ta2, true);
+ lv_textarea_set_placeholder_text(ta2, "Type something");
+
+ lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
+ lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
+
+ lv_obj_add_event_cb(ta1, ta_event_cb, LV_EVENT_ALL, kb);
+ lv_obj_add_event_cb(ta2, ta_event_cb, LV_EVENT_ALL, kb);
+}
+
+static void msgbox_create(void)
+{
+ static const char * btns[] = {"Ok", "Cancel", ""};
+ lv_obj_t * mbox = lv_msgbox_create(NULL, "Hi", "Welcome to the keyboard and encoder demo", btns, false);
+ lv_obj_add_event_cb(mbox, msgbox_event_cb, LV_EVENT_ALL, NULL);
+ lv_group_focus_obj(lv_msgbox_get_btns(mbox));
+ lv_obj_add_state(lv_msgbox_get_btns(mbox), LV_STATE_FOCUS_KEY);
+ lv_group_focus_freeze(g, true);
+
+ lv_obj_align(mbox, LV_ALIGN_CENTER, 0, 0);
+
+ lv_obj_t * bg = lv_obj_get_parent(mbox);
+ lv_obj_set_style_bg_opa(bg, LV_OPA_70, 0);
+ lv_obj_set_style_bg_color(bg, lv_palette_main(LV_PALETTE_GREY), 0);
+}
+
+static void msgbox_event_cb(lv_event_t * e)
+{
+ lv_event_code_t code = lv_event_get_code(e);
+ lv_obj_t * msgbox = lv_event_get_current_target(e);
+
+ if(code == LV_EVENT_VALUE_CHANGED) {
+ const char * txt = lv_msgbox_get_active_btn_text(msgbox);
+ if(txt) {
+ lv_msgbox_close(msgbox);
+ lv_group_focus_freeze(g, false);
+ lv_group_focus_obj(lv_obj_get_child(t1, 0));
+ lv_obj_scroll_to(t1, 0, 0, LV_ANIM_OFF);
+
+ }
+ }
+}
+
+static void ta_event_cb(lv_event_t * e)
+{
+ lv_indev_t * indev = lv_indev_get_act();
+ if(indev == NULL) return;
+ lv_indev_type_t indev_type = lv_indev_get_type(indev);
+
+ lv_event_code_t code = lv_event_get_code(e);
+ lv_obj_t * ta = lv_event_get_target(e);
+ lv_obj_t * kb = lv_event_get_user_data(e);
+
+ if(code == LV_EVENT_CLICKED && indev_type == LV_INDEV_TYPE_ENCODER) {
+ lv_keyboard_set_textarea(kb, ta);
+ lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);
+ lv_group_focus_obj(kb);
+ lv_group_set_editing(lv_obj_get_group(kb), kb);
+ lv_obj_set_height(tv, LV_VER_RES / 2);
+ lv_obj_align(kb, LV_ALIGN_BOTTOM_MID, 0, 0);
+ }
+
+ if(code == LV_EVENT_READY || code == LV_EVENT_CANCEL) {
+ lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
+ lv_obj_set_height(tv, LV_VER_RES);
+ }
+}
+
+#endif
diff --git a/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h
new file mode 100644
index 00000000..c509d662
--- /dev/null
+++ b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h
@@ -0,0 +1,39 @@
+/**
+ * @file lv_demo_keypad_encoder.h
+ *
+ */
+
+#ifndef LV_DEMO_KEYPAD_ENCODER_H
+#define LV_DEMO_KEYPAD_ENCODER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "../lv_demos.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void lv_demo_keypad_encoder(void);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*LV_DEMO_KEYPAD_ENCODER_H*/
diff --git a/lib/lvgl/demos/keypad_encoder/screenshot1.gif b/lib/lvgl/demos/keypad_encoder/screenshot1.gif
new file mode 100644
index 00000000..67222ad3
--- /dev/null
+++ b/lib/lvgl/demos/keypad_encoder/screenshot1.gif
Binary files differ
diff --git a/lib/lvgl/demos/keypad_encoder/screenshot1.png b/lib/lvgl/demos/keypad_encoder/screenshot1.png
new file mode 100644
index 00000000..4b54ed58
--- /dev/null
+++ b/lib/lvgl/demos/keypad_encoder/screenshot1.png
Binary files differ