UI: Add menu edit mode. Small refactoring

This commit is contained in:
Federico Amedeo Izzo 2021-02-13 21:29:25 +01:00
parent 66af402e83
commit ebe87b22e2
3 changed files with 60 additions and 76 deletions

View File

@ -99,7 +99,11 @@ typedef struct layout_t
*/ */
typedef struct ui_state_t typedef struct ui_state_t
{ {
// Index of the currently selected menu entry
uint8_t menu_selected; 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_number;
uint8_t input_position; uint8_t input_position;
uint8_t input_set; uint8_t input_set;
@ -108,10 +112,12 @@ typedef struct ui_state_t
char new_rx_freq_buf[14]; char new_rx_freq_buf[14];
char new_tx_freq_buf[14]; char new_tx_freq_buf[14];
#ifdef HAS_RTC #ifdef HAS_RTC
// Variables used for Time & Date input
curTime_t new_timedate; curTime_t new_timedate;
char new_date_buf[9]; char new_date_buf[9];
char new_time_buf[9]; char new_time_buf[9];
#endif #endif
// Which state to return to when we exit menu
uint8_t last_main_state; uint8_t last_main_state;
} ui_state_t; } ui_state_t;

View File

@ -650,6 +650,21 @@ void _ui_menuDown(uint8_t menu_entries)
ui_state.menu_selected = 0; 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() void ui_saveState()
{ {
last_state = state; last_state = state;
@ -834,12 +849,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
ui_state.menu_selected = 0; ui_state.menu_selected = 0;
} }
else if(msg.keys & KEY_ESC) else if(msg.keys & KEY_ESC)
{ _ui_menuBack(ui_state.last_main_state);
// Close Menu, switch to last main state
state.ui_screen = ui_state.last_main_state;
// Reset menu selection
ui_state.menu_selected = 0;
}
break; break;
// Zone menu screen // Zone menu screen
case MENU_ZONE: case MENU_ZONE:
@ -912,22 +922,12 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
} }
} }
else if(msg.keys & KEY_ESC) else if(msg.keys & KEY_ESC)
{ _ui_menuBack(MENU_TOP);
// Return to top menu
state.ui_screen = MENU_TOP;
// Reset menu selection
ui_state.menu_selected = 0;
}
break; break;
// GPS menu screen // GPS menu screen
case MENU_GPS: case MENU_GPS:
if(msg.keys & KEY_ESC) if(msg.keys & KEY_ESC)
{ _ui_menuBack(MENU_TOP);
// Return to top menu
state.ui_screen = MENU_TOP;
// Reset menu selection
ui_state.menu_selected = 0;
}
break; break;
// Settings menu screen // Settings menu screen
case MENU_SETTINGS: case MENU_SETTINGS:
@ -949,12 +949,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
ui_state.menu_selected = 0; ui_state.menu_selected = 0;
} }
else if(msg.keys & KEY_ESC) else if(msg.keys & KEY_ESC)
{ _ui_menuBack(MENU_TOP);
// Return to top menu
state.ui_screen = MENU_TOP;
// Reset menu selection
ui_state.menu_selected = 0;
}
break; break;
// Info menu screen // Info menu screen
case MENU_INFO: case MENU_INFO:
@ -963,22 +958,12 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
else if(msg.keys & KEY_DOWN) else if(msg.keys & KEY_DOWN)
_ui_menuDown(info_num); _ui_menuDown(info_num);
else if(msg.keys & KEY_ESC) else if(msg.keys & KEY_ESC)
{ _ui_menuBack(MENU_TOP);
// Return to top menu
state.ui_screen = MENU_TOP;
// Reset menu selection
ui_state.menu_selected = 0;
}
break; break;
// About screen // About screen
case MENU_ABOUT: case MENU_ABOUT:
if(msg.keys & KEY_ESC) if(msg.keys & KEY_ESC)
{ _ui_menuBack(MENU_TOP);
// Return to top menu
state.ui_screen = MENU_TOP;
// Reset menu selection
ui_state.menu_selected = 0;
}
break; break;
#ifdef HAS_RTC #ifdef HAS_RTC
// Time&Date settings screen // 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)); memset(&ui_state.new_timedate, 0, sizeof(curTime_t));
} }
else if(msg.keys & KEY_ESC) else if(msg.keys & KEY_ESC)
{ _ui_menuBack(MENU_SETTINGS);
// Return to settings menu
state.ui_screen = MENU_SETTINGS;
// Reset menu selection
ui_state.menu_selected = 0;
}
break; break;
// Time&Date settings screen, edit mode // Time&Date settings screen, edit mode
case SETTINGS_TIMEDATE_SET: case SETTINGS_TIMEDATE_SET:
@ -1011,10 +991,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
state.ui_screen = SETTINGS_TIMEDATE; state.ui_screen = SETTINGS_TIMEDATE;
} }
else if(msg.keys & KEY_ESC) else if(msg.keys & KEY_ESC)
{ _ui_menuBack(SETTINGS_TIMEDATE);
// Return to Time&Date menu discarding values
state.ui_screen = SETTINGS_TIMEDATE;
}
else if(input_isNumberPressed(msg)) else if(input_isNumberPressed(msg))
{ {
// Discard excess digits // Discard excess digits
@ -1027,11 +1004,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
break; break;
#endif #endif
case SETTINGS_DISPLAY: case SETTINGS_DISPLAY:
if(msg.keys & KEY_UP) if(msg.keys & KEY_LEFT || (msg.keys & KEY_UP && ui_state.edit_mode))
_ui_menuUp(display_num);
else if(msg.keys & KEY_DOWN)
_ui_menuDown(display_num);
if(msg.keys & KEY_LEFT)
{ {
if(strcmp(display_items[ui_state.menu_selected], "Brightness") == 0) 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); _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) 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); _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) else if(msg.keys & KEY_ESC)
{ _ui_menuBack(MENU_SETTINGS);
// Return to settings menu
state.ui_screen = MENU_SETTINGS;
// Reset menu selection
ui_state.menu_selected = 0;
}
break; break;
case SETTINGS_GPS: case SETTINGS_GPS:
if(msg.keys & KEY_UP) if(msg.keys & KEY_LEFT || (msg.keys & KEY_UP && ui_state.edit_mode))
_ui_menuUp(settings_gps_num);
else if(msg.keys & KEY_DOWN)
_ui_menuDown(settings_gps_num);
if(msg.keys & KEY_LEFT)
{ {
if(strcmp(settings_gps_items[ui_state.menu_selected], "GPS Enabled") == 0) if(strcmp(settings_gps_items[ui_state.menu_selected], "GPS Enabled") == 0)
state.settings.gps_enabled = !state.settings.gps_enabled; 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) else if(strcmp(settings_gps_items[ui_state.menu_selected], "UTC Timezone") == 0)
state.settings.utc_timezone -= 1; 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) if(strcmp(settings_gps_items[ui_state.menu_selected], "GPS Enabled") == 0)
state.settings.gps_enabled = !state.settings.gps_enabled; 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) else if(strcmp(settings_gps_items[ui_state.menu_selected], "UTC Timezone") == 0)
state.settings.utc_timezone += 1; 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) else if(msg.keys & KEY_ESC)
{ _ui_menuBack(MENU_SETTINGS);
// Return to settings menu
state.ui_screen = MENU_SETTINGS;
// Reset menu selection
ui_state.menu_selected = 0;
}
break; break;
} }
} }

View File

@ -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 (*getCurrentEntry)(char *buf, uint8_t max_len, uint8_t index),
int (*getCurrentValue)(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; text_color = color_white;
if(item + scroll == selected) if(item + scroll == selected)
{ {
text_color = color_black;
// Draw rectangle under selected item, compensating for text height // 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}; 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, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, text_color);
gfx_print(pos, value_buf, layout.top_font, TEXT_ALIGN_RIGHT, 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, gfx_print(layout.top_pos, "Info", layout.top_font,
TEXT_ALIGN_CENTER, color_white); TEXT_ALIGN_CENTER, color_white);
// Print menu entries // 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); _ui_getInfoValueName);
} }
@ -386,7 +393,7 @@ void _ui_drawSettingsDisplay(ui_state_t* ui_state)
gfx_print(layout.top_pos, "Display", layout.top_font, gfx_print(layout.top_pos, "Display", layout.top_font,
TEXT_ALIGN_CENTER, color_white); TEXT_ALIGN_CENTER, color_white);
// Print display settings entries // 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); _ui_getDisplayValueName);
} }
@ -397,7 +404,7 @@ void _ui_drawSettingsGPS(ui_state_t* ui_state)
gfx_print(layout.top_pos, "GPS Settings", layout.top_font, gfx_print(layout.top_pos, "GPS Settings", layout.top_font,
TEXT_ALIGN_CENTER, color_white); TEXT_ALIGN_CENTER, color_white);
// Print display settings entries // 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_getSettingsGPSEntryName,
_ui_getSettingsGPSValueName); _ui_getSettingsGPSValueName);
} }