UI: Add menu edit mode. Small refactoring

replace/a48bbc404ed382b01c98714c85a758b0c97a6ec9
Federico Amedeo Izzo 2021-02-13 21:29:25 +01:00
rodzic 66af402e83
commit ebe87b22e2
3 zmienionych plików z 60 dodań i 76 usunięć

Wyświetl plik

@ -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;

Wyświetl plik

@ -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;
}
}

Wyświetl plik

@ -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);
}