From ebe87b22e241ddf6f7220d1973a093fb196284f5 Mon Sep 17 00:00:00 2001 From: Federico Amedeo Izzo Date: Sat, 13 Feb 2021 21:29:25 +0100 Subject: [PATCH] UI: Add menu edit mode. Small refactoring --- openrtx/include/ui.h | 6 +++ openrtx/src/ui/ui.c | 111 +++++++++++++++------------------------ openrtx/src/ui/ui_menu.c | 19 ++++--- 3 files changed, 60 insertions(+), 76 deletions(-) diff --git a/openrtx/include/ui.h b/openrtx/include/ui.h index bc71567d..94a80da9 100644 --- a/openrtx/include/ui.h +++ b/openrtx/include/ui.h @@ -99,7 +99,11 @@ typedef struct layout_t */ typedef struct ui_state_t { + // Index of the currently selected menu entry uint8_t menu_selected; + // If true we can change a menu entry value with UP/DOWN + bool edit_mode; + // Variables used for VFO input uint8_t input_number; uint8_t input_position; uint8_t input_set; @@ -108,10 +112,12 @@ typedef struct ui_state_t char new_rx_freq_buf[14]; char new_tx_freq_buf[14]; #ifdef HAS_RTC + // Variables used for Time & Date input curTime_t new_timedate; char new_date_buf[9]; char new_time_buf[9]; #endif + // Which state to return to when we exit menu uint8_t last_main_state; } ui_state_t; diff --git a/openrtx/src/ui/ui.c b/openrtx/src/ui/ui.c index 70fb204c..82751540 100644 --- a/openrtx/src/ui/ui.c +++ b/openrtx/src/ui/ui.c @@ -650,6 +650,21 @@ void _ui_menuDown(uint8_t menu_entries) ui_state.menu_selected = 0; } +void _ui_menuBack(uint8_t prev_state) +{ + if(ui_state.edit_mode) + { + ui_state.edit_mode = false; + } + else + { + // Return to previous menu + state.ui_screen = prev_state; + // Reset menu selection + ui_state.menu_selected = 0; + } +} + void ui_saveState() { last_state = state; @@ -834,12 +849,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) ui_state.menu_selected = 0; } else if(msg.keys & KEY_ESC) - { - // Close Menu, switch to last main state - state.ui_screen = ui_state.last_main_state; - // Reset menu selection - ui_state.menu_selected = 0; - } + _ui_menuBack(ui_state.last_main_state); break; // Zone menu screen case MENU_ZONE: @@ -912,22 +922,12 @@ void ui_updateFSM(event_t event, bool *sync_rtx) } } else if(msg.keys & KEY_ESC) - { - // Return to top menu - state.ui_screen = MENU_TOP; - // Reset menu selection - ui_state.menu_selected = 0; - } + _ui_menuBack(MENU_TOP); break; // GPS menu screen case MENU_GPS: if(msg.keys & KEY_ESC) - { - // Return to top menu - state.ui_screen = MENU_TOP; - // Reset menu selection - ui_state.menu_selected = 0; - } + _ui_menuBack(MENU_TOP); break; // Settings menu screen case MENU_SETTINGS: @@ -949,12 +949,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) ui_state.menu_selected = 0; } else if(msg.keys & KEY_ESC) - { - // Return to top menu - state.ui_screen = MENU_TOP; - // Reset menu selection - ui_state.menu_selected = 0; - } + _ui_menuBack(MENU_TOP); break; // Info menu screen case MENU_INFO: @@ -963,22 +958,12 @@ void ui_updateFSM(event_t event, bool *sync_rtx) else if(msg.keys & KEY_DOWN) _ui_menuDown(info_num); else if(msg.keys & KEY_ESC) - { - // Return to top menu - state.ui_screen = MENU_TOP; - // Reset menu selection - ui_state.menu_selected = 0; - } + _ui_menuBack(MENU_TOP); break; // About screen case MENU_ABOUT: if(msg.keys & KEY_ESC) - { - // Return to top menu - state.ui_screen = MENU_TOP; - // Reset menu selection - ui_state.menu_selected = 0; - } + _ui_menuBack(MENU_TOP); break; #ifdef HAS_RTC // Time&Date settings screen @@ -992,12 +977,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) memset(&ui_state.new_timedate, 0, sizeof(curTime_t)); } else if(msg.keys & KEY_ESC) - { - // Return to settings menu - state.ui_screen = MENU_SETTINGS; - // Reset menu selection - ui_state.menu_selected = 0; - } + _ui_menuBack(MENU_SETTINGS); break; // Time&Date settings screen, edit mode case SETTINGS_TIMEDATE_SET: @@ -1011,10 +991,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) state.ui_screen = SETTINGS_TIMEDATE; } else if(msg.keys & KEY_ESC) - { - // Return to Time&Date menu discarding values - state.ui_screen = SETTINGS_TIMEDATE; - } + _ui_menuBack(SETTINGS_TIMEDATE); else if(input_isNumberPressed(msg)) { // Discard excess digits @@ -1027,11 +1004,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) break; #endif case SETTINGS_DISPLAY: - if(msg.keys & KEY_UP) - _ui_menuUp(display_num); - else if(msg.keys & KEY_DOWN) - _ui_menuDown(display_num); - if(msg.keys & KEY_LEFT) + if(msg.keys & KEY_LEFT || (msg.keys & KEY_UP && ui_state.edit_mode)) { if(strcmp(display_items[ui_state.menu_selected], "Brightness") == 0) { @@ -1042,7 +1015,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) _ui_changeContrast(-25); } } - else if(msg.keys & KEY_RIGHT) + else if(msg.keys & KEY_RIGHT || (msg.keys & KEY_DOWN && ui_state.edit_mode)) { if(strcmp(display_items[ui_state.menu_selected], "Brightness") == 0) { @@ -1053,20 +1026,17 @@ void ui_updateFSM(event_t event, bool *sync_rtx) _ui_changeContrast(+25); } } + else if(msg.keys & KEY_UP) + _ui_menuUp(display_num); + else if(msg.keys & KEY_DOWN) + _ui_menuDown(display_num); + else if(msg.keys & KEY_ENTER) + ui_state.edit_mode = !ui_state.edit_mode; else if(msg.keys & KEY_ESC) - { - // Return to settings menu - state.ui_screen = MENU_SETTINGS; - // Reset menu selection - ui_state.menu_selected = 0; - } + _ui_menuBack(MENU_SETTINGS); break; case SETTINGS_GPS: - if(msg.keys & KEY_UP) - _ui_menuUp(settings_gps_num); - else if(msg.keys & KEY_DOWN) - _ui_menuDown(settings_gps_num); - if(msg.keys & KEY_LEFT) + if(msg.keys & KEY_LEFT || (msg.keys & KEY_UP && ui_state.edit_mode)) { if(strcmp(settings_gps_items[ui_state.menu_selected], "GPS Enabled") == 0) state.settings.gps_enabled = !state.settings.gps_enabled; @@ -1075,7 +1045,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) else if(strcmp(settings_gps_items[ui_state.menu_selected], "UTC Timezone") == 0) state.settings.utc_timezone -= 1; } - else if(msg.keys & KEY_RIGHT) + else if(msg.keys & KEY_RIGHT || (msg.keys & KEY_DOWN && ui_state.edit_mode)) { if(strcmp(settings_gps_items[ui_state.menu_selected], "GPS Enabled") == 0) state.settings.gps_enabled = !state.settings.gps_enabled; @@ -1084,13 +1054,14 @@ void ui_updateFSM(event_t event, bool *sync_rtx) else if(strcmp(settings_gps_items[ui_state.menu_selected], "UTC Timezone") == 0) state.settings.utc_timezone += 1; } + else if(msg.keys & KEY_UP) + _ui_menuUp(settings_gps_num); + else if(msg.keys & KEY_DOWN) + _ui_menuDown(settings_gps_num); + else if(msg.keys & KEY_ENTER) + ui_state.edit_mode = !ui_state.edit_mode; else if(msg.keys & KEY_ESC) - { - // Return to settings menu - state.ui_screen = MENU_SETTINGS; - // Reset menu selection - ui_state.menu_selected = 0; - } + _ui_menuBack(MENU_SETTINGS); break; } } diff --git a/openrtx/src/ui/ui_menu.c b/openrtx/src/ui/ui_menu.c index 2bf2d70c..72fd8732 100644 --- a/openrtx/src/ui/ui_menu.c +++ b/openrtx/src/ui/ui_menu.c @@ -55,7 +55,7 @@ void _ui_drawMenuList(point_t pos, uint8_t selected, int (*getCurrentEntry)(char } } -void _ui_drawMenuListValue(point_t pos, uint8_t selected, +void _ui_drawMenuListValue(ui_state_t* ui_state, point_t pos, uint8_t selected, int (*getCurrentEntry)(char *buf, uint8_t max_len, uint8_t index), int (*getCurrentValue)(char *buf, uint8_t max_len, uint8_t index)) { @@ -79,10 +79,17 @@ void _ui_drawMenuListValue(point_t pos, uint8_t selected, text_color = color_white; if(item + scroll == selected) { - text_color = color_black; // Draw rectangle under selected item, compensating for text height + // If we are in edit mode, draw a hollow rectangle + text_color = color_black; + bool full_rect = true; + if(ui_state->edit_mode) + { + text_color = color_white; + full_rect = false; + } point_t rect_pos = {0, pos.y - layout.top_h + 3}; - gfx_drawRect(rect_pos, SCREEN_WIDTH, layout.top_h, color_white, true); + gfx_drawRect(rect_pos, SCREEN_WIDTH, layout.top_h, color_white, full_rect); } gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, text_color); gfx_print(pos, value_buf, layout.top_font, TEXT_ALIGN_RIGHT, text_color); @@ -360,7 +367,7 @@ void _ui_drawMenuInfo(ui_state_t* ui_state) gfx_print(layout.top_pos, "Info", layout.top_font, TEXT_ALIGN_CENTER, color_white); // Print menu entries - _ui_drawMenuListValue(layout.line1_pos, ui_state->menu_selected, _ui_getInfoEntryName, + _ui_drawMenuListValue(ui_state, layout.line1_pos, ui_state->menu_selected, _ui_getInfoEntryName, _ui_getInfoValueName); } @@ -386,7 +393,7 @@ void _ui_drawSettingsDisplay(ui_state_t* ui_state) gfx_print(layout.top_pos, "Display", layout.top_font, TEXT_ALIGN_CENTER, color_white); // Print display settings entries - _ui_drawMenuListValue(layout.line1_pos, ui_state->menu_selected, _ui_getDisplayEntryName, + _ui_drawMenuListValue(ui_state, layout.line1_pos, ui_state->menu_selected, _ui_getDisplayEntryName, _ui_getDisplayValueName); } @@ -397,7 +404,7 @@ void _ui_drawSettingsGPS(ui_state_t* ui_state) gfx_print(layout.top_pos, "GPS Settings", layout.top_font, TEXT_ALIGN_CENTER, color_white); // Print display settings entries - _ui_drawMenuListValue(layout.line1_pos, ui_state->menu_selected, + _ui_drawMenuListValue(ui_state, layout.line1_pos, ui_state->menu_selected, _ui_getSettingsGPSEntryName, _ui_getSettingsGPSValueName); }