|
|
@ -9,7 +9,7 @@ |
|
|
|
// How many menu items to show on screen at once
|
|
|
|
#define MODULE_MENU_SHOW_OPTIONS 8 |
|
|
|
// How long menu labels can be
|
|
|
|
#define MODULE_MENU_MAX_OPTION_LENGTH 15 |
|
|
|
#define MODULE_MENU_MAX_OPTION_LENGTH 14 |
|
|
|
|
|
|
|
#define MODULE_MENU_EAT_OFFSET 3 |
|
|
|
#define MODULE_MENU_EAT_ENTRY_LENGTH 16 // MODULE_MENU_MAX_OPTION_LENGTH + 1
|
|
|
@ -22,6 +22,7 @@ struct MenuItem |
|
|
|
{ |
|
|
|
byte id; |
|
|
|
char label[MODULE_MENU_MAX_OPTION_LENGTH]; |
|
|
|
bool disabled = false; |
|
|
|
}; |
|
|
|
|
|
|
|
void menu_draw(int hwnd, int x, int y, int width, int height) |
|
|
@ -82,22 +83,45 @@ void Module_Menu::tick() |
|
|
|
if ((e->param1 & MODULE_INPUT_BUTTON_UP) == MODULE_INPUT_BUTTON_UP) |
|
|
|
{ |
|
|
|
|
|
|
|
if (m_selected > 0) |
|
|
|
for (;;) |
|
|
|
{ |
|
|
|
m_selected -= 1; |
|
|
|
scroll_up = true; |
|
|
|
Kernel::debug("Scroll up!"); |
|
|
|
if (m_selected > 0) |
|
|
|
{ |
|
|
|
m_selected -= 1; |
|
|
|
scroll_up = true; |
|
|
|
Kernel::debug("Scroll up!"); |
|
|
|
if (!m_item[m_selected]->disabled) |
|
|
|
break; |
|
|
|
} |
|
|
|
if ((m_selected == 0 && m_item[m_selected]->disabled) || (m_selected > 0 && m_item[m_selected - 1]->disabled)) |
|
|
|
{ |
|
|
|
Kernel::debug("Cancelled!"); |
|
|
|
m_selected = prev_selected; |
|
|
|
scroll_up = false; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if ((e->param1 & MODULE_INPUT_BUTTON_DOWN) == MODULE_INPUT_BUTTON_DOWN) |
|
|
|
{ |
|
|
|
|
|
|
|
if (m_selected < MODULE_MENU_MAX_OPTIONS && m_item[m_selected + 1] != nullptr) |
|
|
|
for (;;) |
|
|
|
{ |
|
|
|
m_selected += 1; |
|
|
|
scroll_down = true; |
|
|
|
Kernel::debug("Scroll down!"); |
|
|
|
if (m_selected < MODULE_MENU_MAX_OPTIONS && m_item[m_selected + 1] != nullptr) |
|
|
|
{ |
|
|
|
m_selected += 1; |
|
|
|
scroll_down = true; |
|
|
|
Kernel::debug("Scroll down!"); |
|
|
|
} |
|
|
|
if (!m_item[m_selected]->disabled) |
|
|
|
break; |
|
|
|
if (m_item[m_selected]->disabled && (m_selected == MODULE_MENU_MAX_OPTIONS - 1 || m_item[m_selected + 1] == nullptr)) |
|
|
|
{ |
|
|
|
Kernel::debug("Cancelled!"); |
|
|
|
m_selected = prev_selected; |
|
|
|
scroll_down = false; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -160,9 +184,10 @@ void Module_Menu::read() |
|
|
|
{ |
|
|
|
m_item[i] = new MenuItem(); |
|
|
|
m_item[i]->id = id; |
|
|
|
m_item[i]->disabled = eat->read(MODULE_MENU, MODULE_MENU_EAT_OFFSET + (i * MODULE_MENU_EAT_ENTRY_LENGTH) + 1) != 0; |
|
|
|
for (int j = 0; j < MODULE_MENU_MAX_OPTION_LENGTH; j++) |
|
|
|
{ |
|
|
|
m_item[i]->label[j] = (char)eat->read(MODULE_MENU, MODULE_MENU_EAT_OFFSET + (i * MODULE_MENU_EAT_ENTRY_LENGTH) + j + 1); |
|
|
|
m_item[i]->label[j] = (char)eat->read(MODULE_MENU, MODULE_MENU_EAT_OFFSET + (i * MODULE_MENU_EAT_ENTRY_LENGTH) + j + 2); |
|
|
|
if (m_item[i]->label[j] == '\0') |
|
|
|
{ |
|
|
|
break; |
|
|
@ -191,15 +216,16 @@ void Module_Menu::commit() |
|
|
|
else |
|
|
|
{ |
|
|
|
eat->write(MODULE_MENU, MODULE_MENU_EAT_OFFSET + (i * MODULE_MENU_EAT_ENTRY_LENGTH), m_item[i]->id); |
|
|
|
eat->write(MODULE_MENU, MODULE_MENU_EAT_OFFSET + (i * MODULE_MENU_EAT_ENTRY_LENGTH) + 1, m_item[i]->disabled ? 0xFF : 0x00); |
|
|
|
for (int j = 0; j < MODULE_MENU_MAX_OPTION_LENGTH; j++) |
|
|
|
{ |
|
|
|
eat->write(MODULE_MENU, MODULE_MENU_EAT_OFFSET + (i * MODULE_MENU_EAT_ENTRY_LENGTH) + j + 1, (byte)(m_item[i]->label[j])); |
|
|
|
eat->write(MODULE_MENU, MODULE_MENU_EAT_OFFSET + (i * MODULE_MENU_EAT_ENTRY_LENGTH) + j + 2, (byte)(m_item[i]->label[j])); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void Module_Menu::addItem(byte id, char* label) |
|
|
|
void Module_Menu::addItem(byte id, char* label, bool disabled) |
|
|
|
{ |
|
|
|
for (int i = 0; i < MODULE_MENU_MAX_OPTIONS; i++) |
|
|
|
{ |
|
|
@ -207,7 +233,14 @@ void Module_Menu::addItem(byte id, char* label) |
|
|
|
{ |
|
|
|
m_item[i] = new MenuItem(); |
|
|
|
m_item[i]->id = id; |
|
|
|
m_item[i]->disabled = disabled; |
|
|
|
strcpy(m_item[i]->label, label); |
|
|
|
|
|
|
|
// todo: this will break if you _only_ add disabled options
|
|
|
|
if (m_selected == i && disabled) |
|
|
|
{ |
|
|
|
m_selected++; |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
@ -264,7 +297,7 @@ void Module_Menu::draw(int hwnd, int x, int y, int width, int height) |
|
|
|
if (m_item[idx] != nullptr) |
|
|
|
{ |
|
|
|
ui->getGfx()->setFont(&FreeMono12pt7b); |
|
|
|
if (idx == m_selected) |
|
|
|
if (idx == m_selected || m_item[idx]->disabled) |
|
|
|
{ |
|
|
|
ui->getGfx()->fillRect(x, y, width, height, COLOUR_PRIMARY); |
|
|
|
ui->getGfx()->setTextColor(COLOUR_SECONDARY); |
|
|
|