UI: Add menu edit mode. Small refactoring
This commit is contained in:
parent
66af402e83
commit
ebe87b22e2
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue