From 017ba8975ec3b32e5ff142a37c96d7fe2f567d4a Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Fri, 9 Oct 2026 08:27:07 +0200 Subject: [PATCH 1/4] Fix for flickering v2 was tested, but we don't have a v3 to test --- Devices/m5stack-tab5/Source/devices/devices_v2.cpp | 4 ++-- Devices/m5stack-tab5/Source/devices/devices_v3.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Devices/m5stack-tab5/Source/devices/devices_v2.cpp b/Devices/m5stack-tab5/Source/devices/devices_v2.cpp index 0db9ce0ab..4a5aa4eea 100644 --- a/Devices/m5stack-tab5/Source/devices/devices_v2.cpp +++ b/Devices/m5stack-tab5/Source/devices/devices_v2.cpp @@ -48,8 +48,8 @@ void tab5_create_devices_v2(Device* i2c0) { .ldo_voltage_mv = 2500, .dsi_bus_id = 0, .num_data_lanes = 2, - .lane_bit_rate_mbps = 965, // ST7123 lane bitrate per M5Stack BSP - .dpi_clock_freq_mhz = 70, + .lane_bit_rate_mbps = 1040, // Deviates from M5Stack BSP to fix flickering + .dpi_clock_freq_mhz = 80, .hsync_pulse_width = 2, .hsync_back_porch = 40, .hsync_front_porch = 40, diff --git a/Devices/m5stack-tab5/Source/devices/devices_v3.cpp b/Devices/m5stack-tab5/Source/devices/devices_v3.cpp index cc4267b0b..4d391624a 100644 --- a/Devices/m5stack-tab5/Source/devices/devices_v3.cpp +++ b/Devices/m5stack-tab5/Source/devices/devices_v3.cpp @@ -49,8 +49,8 @@ void tab5_create_devices_v3(Device* i2c0) { .ldo_voltage_mv = 2500, .dsi_bus_id = 0, .num_data_lanes = 2, - .lane_bit_rate_mbps = 965, // ST7121 lane bitrate per M5Stack BSP (same as ST7123) - .dpi_clock_freq_mhz = 70, + .lane_bit_rate_mbps = 1040, // Deviates from M5Stack BSP to fix flickering + .dpi_clock_freq_mhz = 80, .hsync_pulse_width = 2, .hsync_back_porch = 40, .hsync_front_porch = 40, From d9ba219229a70e9990c969b7cf64748598eb62a2 Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Fri, 9 Oct 2026 08:29:38 +0200 Subject: [PATCH 2/4] Improve UX of Notes app Replace dropdown with overflow menu and custom popup --- Modules/lvgl-module/generate-icons.py | 4 + .../lvgl-module/include/lvgl/icons/names.h | 2 +- .../lvgl-module/include/lvgl/icons/shared.h | 3 + Modules/lvgl-module/source/icon_names.c | 3 + Tactility/Source/app/notes/Notes.cpp | 166 ++++++++++++------ 5 files changed, 127 insertions(+), 51 deletions(-) diff --git a/Modules/lvgl-module/generate-icons.py b/Modules/lvgl-module/generate-icons.py index c983bd9cb..d0727d0ba 100755 --- a/Modules/lvgl-module/generate-icons.py +++ b/Modules/lvgl-module/generate-icons.py @@ -194,6 +194,10 @@ def generate_icon_names(codepoint_map: dict, codepoint_names: list, variable_nam "play_arrow", "eject", "create_new_folder", + # Notes app + "save", + "save_as", + "folder_open", ] # Get more from https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded diff --git a/Modules/lvgl-module/include/lvgl/icons/names.h b/Modules/lvgl-module/include/lvgl/icons/names.h index 9d08db392..05dbaacbf 100644 --- a/Modules/lvgl-module/include/lvgl/icons/names.h +++ b/Modules/lvgl-module/include/lvgl/icons/names.h @@ -9,7 +9,7 @@ extern "C" { #endif /** Changes whenever the icon TTF subset, its codepoints file or the icon name lists change */ -#define LVGL_ICON_FONT_VERSION 0xB2450B17u +#define LVGL_ICON_FONT_VERSION 0xD5578751u // Icon names per icon font, resolved through the .codepoints file next to the TTF extern const char* const lvgl_icon_shared_names[]; diff --git a/Modules/lvgl-module/include/lvgl/icons/shared.h b/Modules/lvgl-module/include/lvgl/icons/shared.h index fa63b1527..516ab56e2 100644 --- a/Modules/lvgl-module/include/lvgl/icons/shared.h +++ b/Modules/lvgl-module/include/lvgl/icons/shared.h @@ -66,3 +66,6 @@ #define LVGL_ICON_SHARED_PLAY_ARROW "\xEE\x80\xB7" #define LVGL_ICON_SHARED_EJECT "\xEE\xA3\xBB" #define LVGL_ICON_SHARED_CREATE_NEW_FOLDER "\xEE\x8B\x8C" +#define LVGL_ICON_SHARED_SAVE "\xEE\x85\xA1" +#define LVGL_ICON_SHARED_SAVE_AS "\xEE\xAD\xA0" +#define LVGL_ICON_SHARED_FOLDER_OPEN "\xEE\x8B\x88" diff --git a/Modules/lvgl-module/source/icon_names.c b/Modules/lvgl-module/source/icon_names.c index e0cf41aa8..d5df0af30 100644 --- a/Modules/lvgl-module/source/icon_names.c +++ b/Modules/lvgl-module/source/icon_names.c @@ -68,6 +68,9 @@ const char* const lvgl_icon_shared_names[] = { "play_arrow", "eject", "create_new_folder", + "save", + "save_as", + "folder_open", }; const size_t lvgl_icon_shared_name_count = sizeof(lvgl_icon_shared_names) / sizeof(lvgl_icon_shared_names[0]); diff --git a/Tactility/Source/app/notes/Notes.cpp b/Tactility/Source/app/notes/Notes.cpp index 802487923..a6efb1647 100644 --- a/Tactility/Source/app/notes/Notes.cpp +++ b/Tactility/Source/app/notes/Notes.cpp @@ -15,7 +15,13 @@ #include #include +#include +#include +#include +#include #include +#include +#include #include #include #include @@ -33,7 +39,9 @@ struct Context { TaskEventGroup* eventGroup = nullptr; lv_obj_t* uiCurrentFileName = nullptr; - lv_obj_t* uiDropDownMenu = nullptr; + lv_obj_t* uiToolbar = nullptr; + lv_obj_t* uiOverflowButton = nullptr; + lv_obj_t* uiOverlay = nullptr; lv_obj_t* uiNoteText = nullptr; std::string filePath; @@ -77,50 +85,100 @@ bool saveFile(Context* ctx, const std::string& path) { return result; } -void appNotesEventCb(lv_event_t* e) { +void hideOverlay(Context* ctx) { + if (lv_obj_is_hidden(ctx->uiOverlay)) { + return; + } + lv_obj_set_hidden(ctx->uiOverlay, true); + + // Keys continue on the button that opened the overlay + lv_group_t* group = lv_group_get_default(); + if (group != nullptr && lv_group_get_focused(group) == ctx->uiOverlay) { + lv_group_focus_obj(ctx->uiToolbar); + lv_gridnav_set_focused(ctx->uiToolbar, ctx->uiOverflowButton, LV_ANIM_OFF); + } +} + +void onNewPressed(lv_event_t* e) { auto* ctx = static_cast(lv_event_get_user_data(e)); - lv_event_code_t code = lv_event_get_code(e); - lv_obj_t* obj = lv_event_get_target_obj(e); - - if (code == LV_EVENT_VALUE_CHANGED) { - if (obj == ctx->uiDropDownMenu) { - switch (lv_dropdown_get_selected(obj)) { - case 0: // New - resetFileContent(ctx); - break; - case 1: // Save - if (!ctx->filePath.empty()) { - lvgl_lock(); - ctx->saveBuffer = lv_textarea_get_text(ctx->uiNoteText); - lvgl_unlock(); - saveFile(ctx, ctx->filePath); - } - break; - case 2: // Save as... - lvgl_lock(); - ctx->saveBuffer = lv_textarea_get_text(ctx->uiNoteText); - lvgl_unlock(); - ctx->saveFileLaunchId = fileselection::startForExistingOrNewFile(ctx->appInstanceId, ctx->saveResultStream, ctx->saveResultBuffer, sizeof(ctx->saveResultBuffer), ctx->eventGroup); - LOG_I(TAG, "launched with id %u", ctx->saveFileLaunchId); - break; - case 3: // Load - ctx->loadFileLaunchId = fileselection::startForExistingFile(ctx->appInstanceId, ctx->loadResultStream, ctx->loadResultBuffer, sizeof(ctx->loadResultBuffer), ctx->eventGroup); - LOG_I(TAG, "launched with id %u", ctx->loadFileLaunchId); - break; - } - } else { - auto* cont = lv_event_get_current_target_obj(e); - if (obj == cont) return; - if (lv_obj_get_child(cont, 1)) { - ctx->saveFileLaunchId = fileselection::startForExistingOrNewFile(ctx->appInstanceId, ctx->saveResultStream, ctx->saveResultBuffer, sizeof(ctx->saveResultBuffer), ctx->eventGroup); - LOG_I(TAG, "launched with id %u", ctx->saveFileLaunchId); - } else { //Reset - resetFileContent(ctx); - } + hideOverlay(ctx); + resetFileContent(ctx); +} + +void onSavePressed(lv_event_t* e) { + auto* ctx = static_cast(lv_event_get_user_data(e)); + hideOverlay(ctx); + ctx->saveBuffer = lv_textarea_get_text(ctx->uiNoteText); + saveFile(ctx, ctx->filePath); +} + +void onSaveAsPressed(lv_event_t* e) { + auto* ctx = static_cast(lv_event_get_user_data(e)); + hideOverlay(ctx); + ctx->saveBuffer = lv_textarea_get_text(ctx->uiNoteText); + ctx->saveFileLaunchId = fileselection::startForExistingOrNewFile(ctx->appInstanceId, ctx->saveResultStream, ctx->saveResultBuffer, sizeof(ctx->saveResultBuffer), ctx->eventGroup); + LOG_I(TAG, "launched with id %u", ctx->saveFileLaunchId); +} + +void onOpenPressed(lv_event_t* e) { + auto* ctx = static_cast(lv_event_get_user_data(e)); + hideOverlay(ctx); + ctx->loadFileLaunchId = fileselection::startForExistingFile(ctx->appInstanceId, ctx->loadResultStream, ctx->loadResultBuffer, sizeof(ctx->loadResultBuffer), ctx->eventGroup); + LOG_I(TAG, "launched with id %u", ctx->loadFileLaunchId); +} + +void addOverlayButton(Context* ctx, const char* icon, lv_event_cb_t callback) { + auto* button = lvgl_icon_button_create(ctx->uiOverlay); + auto* label = lv_label_create(button); + lv_obj_set_style_text_font(label, lvgl_get_shared_icon_default_font(), LV_STATE_DEFAULT); + lv_label_set_text(label, icon); + lv_obj_add_event_cb(button, callback, LV_EVENT_SHORT_CLICKED, ctx); +} + +void showOverlay(Context* ctx) { + lv_obj_clean(ctx->uiOverlay); + addOverlayButton(ctx, LVGL_ICON_SHARED_NOTE_ADD, onNewPressed); + // Saving needs a file, which "save as" picks + if (!ctx->filePath.empty()) { + addOverlayButton(ctx, LVGL_ICON_SHARED_SAVE, onSavePressed); + } + addOverlayButton(ctx, LVGL_ICON_SHARED_SAVE_AS, onSaveAsPressed); + addOverlayButton(ctx, LVGL_ICON_SHARED_FOLDER_OPEN, onOpenPressed); + + lv_obj_set_hidden(ctx->uiOverlay, false); + lv_obj_align_to(ctx->uiOverlay, ctx->uiToolbar, LV_ALIGN_OUT_BOTTOM_MID, 0, 0); + + lv_group_t* group = lv_group_get_default(); + if (group != nullptr) { + lv_group_focus_obj(ctx->uiOverlay); + lv_gridnav_set_focused(ctx->uiOverlay, lv_obj_get_child(ctx->uiOverlay, 0), LV_ANIM_OFF); + // Touch shows no selection, until a key moves the focus + lv_indev_t* indev = lv_indev_active(); + if (indev != nullptr && lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER) { + lvgl_focus_hide_key_selection(group); } } } +void onOverflowPressed(lv_event_t* e) { + auto* ctx = static_cast(lv_event_get_user_data(e)); + if (lv_obj_is_hidden(ctx->uiOverlay)) { + showOverlay(ctx); + } else { + hideOverlay(ctx); + } +} + +void onOverlayKey(lv_event_t* e) { + if (lv_event_get_key(e) == LV_KEY_ESC) { + hideOverlay(static_cast(lv_event_get_user_data(e))); + } +} + +void onNoteTextPressed(lv_event_t* e) { + hideOverlay(static_cast(lv_event_get_user_data(e))); +} + void createWidgets(lv_obj_t* parent, void* userData) { auto* ctx = static_cast(userData); @@ -128,16 +186,10 @@ void createWidgets(lv_obj_t* parent, void* userData) { lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_COLUMN); lv_obj_set_style_pad_row(parent, 0, LV_STATE_DEFAULT); - lv_obj_t* toolbar = lvgl_toolbar_create(parent, "Notes"); - lv_obj_align(toolbar, LV_ALIGN_TOP_MID, 0, 0); - - ctx->uiDropDownMenu = lv_dropdown_create(toolbar); - lv_dropdown_set_options(ctx->uiDropDownMenu, LV_SYMBOL_FILE " New File\n" LV_SYMBOL_SAVE " Save\n" LV_SYMBOL_SAVE " Save As...\n" LV_SYMBOL_DIRECTORY " Open File"); - lv_dropdown_set_text(ctx->uiDropDownMenu, "Menu"); - lv_dropdown_set_symbol(ctx->uiDropDownMenu, LV_SYMBOL_DOWN); - lv_dropdown_set_selected_highlight(ctx->uiDropDownMenu, false); - lv_obj_align(ctx->uiDropDownMenu, LV_ALIGN_RIGHT_MID, 0, 0); - lv_obj_add_event_cb(ctx->uiDropDownMenu, appNotesEventCb, LV_EVENT_VALUE_CHANGED, ctx); + ctx->uiToolbar = lvgl_toolbar_create(parent, "Notes"); + lv_obj_align(ctx->uiToolbar, LV_ALIGN_TOP_MID, 0, 0); + ctx->uiOverflowButton = lvgl_toolbar_add_text_button_action(ctx->uiToolbar, LVGL_ICON_SHARED_MORE_VERT, onOverflowPressed, ctx); + lv_obj_set_style_text_font(ctx->uiOverflowButton, lvgl_get_shared_icon_default_font(), LV_STATE_DEFAULT); lv_obj_t* wrapper = lv_obj_create(parent); lv_obj_set_flex_flow(wrapper, LV_FLEX_FLOW_COLUMN); @@ -158,6 +210,7 @@ void createWidgets(lv_obj_t* parent, void* userData) { lv_obj_set_style_bg_color(ctx->uiNoteText, lv_color_hex(0x262626), LV_PART_MAIN); } lv_textarea_set_placeholder_text(ctx->uiNoteText, "Notes..."); + lv_obj_add_event_cb(ctx->uiNoteText, onNoteTextPressed, LV_EVENT_PRESSED, ctx); lv_obj_t* footer = lv_obj_create(wrapper); lv_obj_set_flex_flow(footer, LV_FLEX_FLOW_ROW); @@ -183,6 +236,19 @@ void createWidgets(lv_obj_t* parent, void* userData) { lv_label_set_text(ctx->uiCurrentFileName, "Untitled"); lv_obj_align(ctx->uiCurrentFileName, LV_ALIGN_CENTER, 0, 0); + // Floating over the text area, below the toolbar + ctx->uiOverlay = lvgl_card_create(parent); + lv_obj_set_floating(ctx->uiOverlay, true); + lv_obj_set_size(ctx->uiOverlay, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_flex_flow(ctx->uiOverlay, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(ctx->uiOverlay, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_scrollable(ctx->uiOverlay, false); + lvgl_obj_add_edge_padding(ctx->uiOverlay); + // The arrow keys move between the overlay's buttons as one row + lvgl_grid_navigation_add(ctx->uiOverlay); + lv_obj_add_event_cb(ctx->uiOverlay, onOverlayKey, LV_EVENT_KEY, ctx); + lv_obj_set_hidden(ctx->uiOverlay, true); + if (!ctx->filePath.empty()) { openFile(ctx, ctx->filePath); } From 45c110da60f1291fc32744f27ec08f40b00d871e Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Fri, 9 Oct 2026 08:33:26 +0200 Subject: [PATCH 3/4] Add missing codepoints --- .../fonts/MaterialSymbolsRounded.codepoints | 18 ++++++++++++++++++ Data/system/fonts/MaterialSymbolsRounded.ttf | Bin 16248 -> 19880 bytes 2 files changed, 18 insertions(+) diff --git a/Data/system/fonts/MaterialSymbolsRounded.codepoints b/Data/system/fonts/MaterialSymbolsRounded.codepoints index 39ee896a7..dca40c2a0 100644 --- a/Data/system/fonts/MaterialSymbolsRounded.codepoints +++ b/Data/system/fonts/MaterialSymbolsRounded.codepoints @@ -21,25 +21,38 @@ check e668 circle ef4a close e5cd cloud f15c +content_copy e14d +content_cut e14e +content_paste e14f +create_new_folder e2cc delete e92e deployed_code f720 +description e873 devices e326 display_settings eb97 download f090 +draft e66d +edit f097 edit_note e745 +eject e8fb electric_bolt ec1c folder e2c7 +folder_open e2c8 forum e8af gamepad e30f +hard_disk f3da help e8fd hub e9f4 image e3f4 +info e88e keyboard_alt f028 keyboard_arrow_up e316 language ea07 lightbulb e90f lightstrip fff75 +link e250 lists e9b9 +location_off e0c7 location_on f1db logo_dev ead6 mail e159 @@ -54,11 +67,16 @@ network_wifi_2_bar ebd6 network_wifi_3_bar ebe1 note_add e89c palette e40a +phone_android f2db +play_arrow e037 power_settings_new f8c7 refresh e5d5 +save e161 +save_as eb60 sd_card e623 sd_card_alert f057 search ef7a +select_window_2 f4c8 settings e8b8 signal_wifi_0_bar f0b0 signal_wifi_4_bar f065 diff --git a/Data/system/fonts/MaterialSymbolsRounded.ttf b/Data/system/fonts/MaterialSymbolsRounded.ttf index 039d1b3d024ca9c22aae424dd3d4045ad6ee2f3c..2f507af2c7a59ab4fc53bbe9aa69c4d775311816 100644 GIT binary patch delta 4802 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 delta 1781 zcmaKsZERCj7{~v&@7>nkvfi~_Y4-{PL^@zNht5%6rerLx!g!e=(6Ehtpimixm#7sJ zaS$QEb@2ljF}^So69^Y0i(h6?hY=G3G8HtT8|&5$q$`+>7{urF;e(&NH^2M8=Q-y- z_q_bi={hD&ycvT8AO~+jk6^=!^0|xNYuyh>ODVc>MdQN8HyR@*V1b3o(M^$X^k{Qv z2B50~jC(eR+oKeBP(2AOo44$4-TL>retKO3%qwea2{%`%o+qg85>eSk0dv2(nDQH_ zJf$tNBeu)A)qaKoT@*OHW!t9kkDb5P0p@d}90~7=VkN$(`sq|I+8U0u1RWdq0@Yin z6WgQP+ILXLX$UnpMSW&4x(DvAW7B@vAXooo(dm0Aj>I1c`iIba!$S2vnYanMBmb03 zFQ@_OWnH{hJs{1T8bSysh!A#V?h{nvvWQLR8uh+ZUit~uiwH-y0IJSPA{$Wx!fuj%L;l*rA3E#nKw}h@m=$0mm%|(*NEkFh7ID>3pgt{q!m9&o$ zduQ|zBaWQW4;auqk6vPg1xBg80MC-f8B~+rV(<)b+eZc$50nFUgA8ac?$$9d9<{h* z^MDkMSpbD}H3K_oGb2vER0~6PMCvd@`yZ(@4CVu4>ln->y}`f$q#KA3%&IsG5 zR{$~bAb%s>$dJ>Krky7s&m+BxA@?IqofFVLz<3dZMZiQagQp=sdMyJmi`s!avJc%D zkpfbybVKLYY5ID7zhS!JTVuf3VH`8XmYDXLu9|0>FIje4v#e{ZzhsqWwP#((c4jwc zf0<*-*_hL5lWgzUKDFJmzhv*QPsm<*vAk2h<2dVhFsWivPi`>xU1!w!n=)TnuXHKD z=P7xOd1~GjSG{Ye+vr~F33&E;F6U3l|HA8}v+yFFjuZMGGPsFWK1WMfm+907+a7JV z{j5ptcK4}wTo$d<`?{ok=bJ65k;3=2&x*2)T5Z`PSqoPllC<`!%SO$-pw+0&s@-nX VKCD|RNfl~h*~e0a)=^(1{R>3g<_-V= From 4064f4cdcf2002c355fbb24dd2ce8ba0421cf094 Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Fri, 9 Oct 2026 08:48:37 +0200 Subject: [PATCH 4/4] Fix for background color --- Tactility/Source/app/notes/Notes.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tactility/Source/app/notes/Notes.cpp b/Tactility/Source/app/notes/Notes.cpp index a6efb1647..7d40de977 100644 --- a/Tactility/Source/app/notes/Notes.cpp +++ b/Tactility/Source/app/notes/Notes.cpp @@ -215,13 +215,13 @@ void createWidgets(lv_obj_t* parent, void* userData) { lv_obj_t* footer = lv_obj_create(wrapper); lv_obj_set_flex_flow(footer, LV_FLEX_FLOW_ROW); lv_obj_set_flex_align(footer, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + // Shows the screen background + lv_obj_set_style_bg_opa(footer, LV_OPA_TRANSP, LV_PART_MAIN); if (lv_display_get_color_format(lv_obj_get_display(parent)) == LV_COLOR_FORMAT_L8) { - lv_obj_set_style_bg_color(footer, lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(footer, 1, LV_PART_MAIN); lv_obj_set_style_border_color(footer, lv_theme_get_color_secondary(footer), LV_PART_MAIN); lv_obj_set_style_border_side(footer, LV_BORDER_SIDE_TOP, LV_PART_MAIN); } else { - lv_obj_set_style_bg_color(footer, lv_color_hex(0x262626), LV_PART_MAIN); lv_obj_set_style_border_width(footer, 0, LV_PART_MAIN); } lv_obj_set_width(footer, LV_PCT(100));