kopia lustrzana https://github.com/OpenRTX/OpenRTX
UI: Add menu edit mode. Small refactoring
rodzic
66af402e83
commit
ebe87b22e2
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue