kopia lustrzana https://github.com/OpenRTX/OpenRTX
UI: Add Zone and Contacts menu
rodzic
302eb572be
commit
1a1e39fcc0
|
@ -87,7 +87,9 @@ extern void _ui_drawMainMEM(state_t* last_state);
|
||||||
extern void _ui_drawMenuList(point_t pos, const char *entries[], uint8_t num_entries, uint8_t selected);
|
extern void _ui_drawMenuList(point_t pos, const char *entries[], uint8_t num_entries, uint8_t selected);
|
||||||
extern void _ui_drawChannelList(point_t pos, uint8_t selected);
|
extern void _ui_drawChannelList(point_t pos, uint8_t selected);
|
||||||
extern void _ui_drawMenuTop(ui_state_t* ui_state);
|
extern void _ui_drawMenuTop(ui_state_t* ui_state);
|
||||||
|
extern void _ui_drawMenuZone(ui_state_t* ui_state);
|
||||||
extern void _ui_drawMenuChannel(ui_state_t* ui_state);
|
extern void _ui_drawMenuChannel(ui_state_t* ui_state);
|
||||||
|
extern void _ui_drawMenuContacts(ui_state_t* ui_state);
|
||||||
extern void _ui_drawMenuSettings(ui_state_t* ui_state);
|
extern void _ui_drawMenuSettings(ui_state_t* ui_state);
|
||||||
#ifdef HAS_RTC
|
#ifdef HAS_RTC
|
||||||
extern void _ui_drawSettingsTimeDate(state_t* last_state);
|
extern void _ui_drawSettingsTimeDate(state_t* last_state);
|
||||||
|
@ -700,10 +702,16 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
|
||||||
// Open selected menu item
|
// Open selected menu item
|
||||||
switch(ui_state.menu_selected)
|
switch(ui_state.menu_selected)
|
||||||
{
|
{
|
||||||
// TODO: Add missing submenu states
|
case 0:
|
||||||
|
state.ui_screen = MENU_ZONE;
|
||||||
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
state.ui_screen = MENU_CHANNEL;
|
state.ui_screen = MENU_CHANNEL;
|
||||||
break;
|
break;
|
||||||
|
case 2:
|
||||||
|
state.ui_screen = MENU_CONTACTS;
|
||||||
|
break;
|
||||||
|
// TODO: Add missing submenu states
|
||||||
case 5:
|
case 5:
|
||||||
state.ui_screen = MENU_SETTINGS;
|
state.ui_screen = MENU_SETTINGS;
|
||||||
break;
|
break;
|
||||||
|
@ -721,6 +729,32 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
|
||||||
ui_state.menu_selected = 0;
|
ui_state.menu_selected = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
// Zone menu screen
|
||||||
|
case MENU_ZONE:
|
||||||
|
if(msg.keys & KEY_UP)
|
||||||
|
{
|
||||||
|
if(ui_state.menu_selected > 0)
|
||||||
|
ui_state.menu_selected -= 1;
|
||||||
|
}
|
||||||
|
else if(msg.keys & KEY_DOWN)
|
||||||
|
{
|
||||||
|
zone_t zone;
|
||||||
|
if(nvm_readZoneData(&zone, ui_state.menu_selected + 1) != -1)
|
||||||
|
ui_state.menu_selected += 1;
|
||||||
|
}
|
||||||
|
else if(msg.keys & KEY_ESC)
|
||||||
|
{
|
||||||
|
// Return to top menu
|
||||||
|
state.ui_screen = MENU_TOP;
|
||||||
|
// Reset menu selection
|
||||||
|
ui_state.menu_selected = 0;
|
||||||
|
}
|
||||||
|
else if(msg.keys & KEY_MONI)
|
||||||
|
{
|
||||||
|
// Open Macro Menu
|
||||||
|
state.ui_screen = MENU_MACRO;
|
||||||
|
}
|
||||||
|
break;
|
||||||
// Channel menu screen
|
// Channel menu screen
|
||||||
case MENU_CHANNEL:
|
case MENU_CHANNEL:
|
||||||
if(msg.keys & KEY_UP)
|
if(msg.keys & KEY_UP)
|
||||||
|
@ -747,6 +781,32 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
|
||||||
state.ui_screen = MENU_MACRO;
|
state.ui_screen = MENU_MACRO;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
// Contacts menu screen
|
||||||
|
case MENU_CONTACTS:
|
||||||
|
if(msg.keys & KEY_UP)
|
||||||
|
{
|
||||||
|
if(ui_state.menu_selected > 0)
|
||||||
|
ui_state.menu_selected -= 1;
|
||||||
|
}
|
||||||
|
else if(msg.keys & KEY_DOWN)
|
||||||
|
{
|
||||||
|
contact_t contact;
|
||||||
|
if(nvm_readContactData(&contact, ui_state.menu_selected + 1) != -1)
|
||||||
|
ui_state.menu_selected += 1;
|
||||||
|
}
|
||||||
|
else if(msg.keys & KEY_ESC)
|
||||||
|
{
|
||||||
|
// Return to top menu
|
||||||
|
state.ui_screen = MENU_TOP;
|
||||||
|
// Reset menu selection
|
||||||
|
ui_state.menu_selected = 0;
|
||||||
|
}
|
||||||
|
else if(msg.keys & KEY_MONI)
|
||||||
|
{
|
||||||
|
// Open Macro Menu
|
||||||
|
state.ui_screen = MENU_MACRO;
|
||||||
|
}
|
||||||
|
break;
|
||||||
// Macro menu
|
// Macro menu
|
||||||
case MENU_MACRO:
|
case MENU_MACRO:
|
||||||
_ui_drawDarkOverlay();
|
_ui_drawDarkOverlay();
|
||||||
|
@ -863,10 +923,18 @@ void ui_updateGUI(state_t last_state)
|
||||||
case MENU_TOP:
|
case MENU_TOP:
|
||||||
_ui_drawMenuTop(&ui_state);
|
_ui_drawMenuTop(&ui_state);
|
||||||
break;
|
break;
|
||||||
|
// Zone menu screen
|
||||||
|
case MENU_ZONE:
|
||||||
|
_ui_drawMenuZone(&ui_state);
|
||||||
|
break;
|
||||||
// Channel menu screen
|
// Channel menu screen
|
||||||
case MENU_CHANNEL:
|
case MENU_CHANNEL:
|
||||||
_ui_drawMenuChannel(&ui_state);
|
_ui_drawMenuChannel(&ui_state);
|
||||||
break;
|
break;
|
||||||
|
// Contacts menu screen
|
||||||
|
case MENU_CONTACTS:
|
||||||
|
_ui_drawMenuContacts(&ui_state);
|
||||||
|
break;
|
||||||
// Macro menu
|
// Macro menu
|
||||||
case MENU_MACRO:
|
case MENU_MACRO:
|
||||||
_ui_drawMenuMacro(&last_state);
|
_ui_drawMenuMacro(&last_state);
|
||||||
|
|
|
@ -52,6 +52,39 @@ void _ui_drawMenuList(point_t pos, const char *entries[],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _ui_drawZoneList(point_t pos, uint8_t selected)
|
||||||
|
{
|
||||||
|
// Number of menu entries that fit in the screen height
|
||||||
|
uint8_t entries_in_screen = ((SCREEN_HEIGHT - pos.y) / layout.top_h) + 1;
|
||||||
|
uint8_t scroll = 0;
|
||||||
|
char entry_buf[MAX_ENTRY_LEN] = "";
|
||||||
|
int result = 0;
|
||||||
|
zone_t zone;
|
||||||
|
for(int item=0; (result == 0) && (pos.y < SCREEN_HEIGHT); item++)
|
||||||
|
{
|
||||||
|
// If selection is off the screen, scroll screen
|
||||||
|
if(selected >= entries_in_screen)
|
||||||
|
scroll = selected - entries_in_screen + 1;
|
||||||
|
result = nvm_readZoneData(&zone, item + scroll);
|
||||||
|
if(result != -1)
|
||||||
|
{
|
||||||
|
snprintf(entry_buf, sizeof(entry_buf), "%s", zone.name);
|
||||||
|
if(item + scroll == selected)
|
||||||
|
{
|
||||||
|
// Draw rectangle under selected item, compensating for text height
|
||||||
|
point_t rect_pos = {0, pos.y - layout.top_h + 3};
|
||||||
|
gfx_drawRect(rect_pos, SCREEN_WIDTH, layout.top_h, color_white, true);
|
||||||
|
gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, color_black);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, color_white);
|
||||||
|
}
|
||||||
|
pos.y += layout.top_h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _ui_drawChannelList(point_t pos, uint8_t selected)
|
void _ui_drawChannelList(point_t pos, uint8_t selected)
|
||||||
{
|
{
|
||||||
// Number of menu entries that fit in the screen height
|
// Number of menu entries that fit in the screen height
|
||||||
|
@ -66,19 +99,55 @@ void _ui_drawChannelList(point_t pos, uint8_t selected)
|
||||||
if(selected >= entries_in_screen)
|
if(selected >= entries_in_screen)
|
||||||
scroll = selected - entries_in_screen + 1;
|
scroll = selected - entries_in_screen + 1;
|
||||||
result = nvm_readChannelData(&channel, item + scroll);
|
result = nvm_readChannelData(&channel, item + scroll);
|
||||||
snprintf(entry_buf, sizeof(entry_buf), "%s", channel.name);
|
if(result != -1)
|
||||||
if(item + scroll == selected)
|
|
||||||
{
|
{
|
||||||
// Draw rectangle under selected item, compensating for text height
|
snprintf(entry_buf, sizeof(entry_buf), "%s", channel.name);
|
||||||
point_t rect_pos = {0, pos.y - layout.top_h + 3};
|
if(item + scroll == selected)
|
||||||
gfx_drawRect(rect_pos, SCREEN_WIDTH, layout.top_h, color_white, true);
|
{
|
||||||
gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, color_black);
|
// Draw rectangle under selected item, compensating for text height
|
||||||
|
point_t rect_pos = {0, pos.y - layout.top_h + 3};
|
||||||
|
gfx_drawRect(rect_pos, SCREEN_WIDTH, layout.top_h, color_white, true);
|
||||||
|
gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, color_black);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, color_white);
|
||||||
|
}
|
||||||
|
pos.y += layout.top_h;
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _ui_drawContactList(point_t pos, uint8_t selected)
|
||||||
|
{
|
||||||
|
// Number of menu entries that fit in the screen height
|
||||||
|
uint8_t entries_in_screen = ((SCREEN_HEIGHT - pos.y) / layout.top_h) + 1;
|
||||||
|
uint8_t scroll = 0;
|
||||||
|
char entry_buf[MAX_ENTRY_LEN] = "";
|
||||||
|
int result = 0;
|
||||||
|
contact_t contact;
|
||||||
|
for(int item=0; (result == 0) && (pos.y < SCREEN_HEIGHT); item++)
|
||||||
|
{
|
||||||
|
// If selection is off the screen, scroll screen
|
||||||
|
if(selected >= entries_in_screen)
|
||||||
|
scroll = selected - entries_in_screen + 1;
|
||||||
|
result = nvm_readContactData(&contact, item + scroll);
|
||||||
|
if(result != -1)
|
||||||
{
|
{
|
||||||
gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, color_white);
|
snprintf(entry_buf, sizeof(entry_buf), "%s", contact.name);
|
||||||
|
if(item + scroll == selected)
|
||||||
|
{
|
||||||
|
// Draw rectangle under selected item, compensating for text height
|
||||||
|
point_t rect_pos = {0, pos.y - layout.top_h + 3};
|
||||||
|
gfx_drawRect(rect_pos, SCREEN_WIDTH, layout.top_h, color_white, true);
|
||||||
|
gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, color_black);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, color_white);
|
||||||
|
}
|
||||||
|
pos.y += layout.top_h;
|
||||||
}
|
}
|
||||||
pos.y += layout.top_h;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,16 +161,36 @@ void _ui_drawMenuTop(ui_state_t* ui_state)
|
||||||
_ui_drawMenuList(layout.line1_left, menu_items, menu_num, ui_state->menu_selected);
|
_ui_drawMenuList(layout.line1_left, menu_items, menu_num, ui_state->menu_selected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _ui_drawMenuZone(ui_state_t* ui_state)
|
||||||
|
{
|
||||||
|
gfx_clearScreen();
|
||||||
|
// Print "Zone" on top bar
|
||||||
|
gfx_print(layout.top_left, "Zone", layout.top_font,
|
||||||
|
TEXT_ALIGN_CENTER, color_white);
|
||||||
|
// Print zone entries
|
||||||
|
_ui_drawZoneList(layout.line1_left, ui_state->menu_selected);
|
||||||
|
}
|
||||||
|
|
||||||
void _ui_drawMenuChannel(ui_state_t* ui_state)
|
void _ui_drawMenuChannel(ui_state_t* ui_state)
|
||||||
{
|
{
|
||||||
gfx_clearScreen();
|
gfx_clearScreen();
|
||||||
// Print "Channel" on top bar
|
// Print "Channel" on top bar
|
||||||
gfx_print(layout.top_left, "Channel", layout.top_font,
|
gfx_print(layout.top_left, "Channels", layout.top_font,
|
||||||
TEXT_ALIGN_CENTER, color_white);
|
TEXT_ALIGN_CENTER, color_white);
|
||||||
// Print channel entries
|
// Print channel entries
|
||||||
_ui_drawChannelList(layout.line1_left, ui_state->menu_selected);
|
_ui_drawChannelList(layout.line1_left, ui_state->menu_selected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _ui_drawMenuContacts(ui_state_t* ui_state)
|
||||||
|
{
|
||||||
|
gfx_clearScreen();
|
||||||
|
// Print "Contacts" on top bar
|
||||||
|
gfx_print(layout.top_left, "Contacts", layout.top_font,
|
||||||
|
TEXT_ALIGN_CENTER, color_white);
|
||||||
|
// Print contact entries
|
||||||
|
_ui_drawContactList(layout.line1_left, ui_state->menu_selected);
|
||||||
|
}
|
||||||
|
|
||||||
void _ui_drawMenuSettings(ui_state_t* ui_state)
|
void _ui_drawMenuSettings(ui_state_t* ui_state)
|
||||||
{
|
{
|
||||||
gfx_clearScreen();
|
gfx_clearScreen();
|
||||||
|
|
Ładowanie…
Reference in New Issue