diff options
-rw-r--r-- | CategoriesPanel.c | 52 | ||||
-rw-r--r-- | Panel.c | 5 | ||||
-rw-r--r-- | Panel.h | 2 |
3 files changed, 36 insertions, 23 deletions
diff --git a/CategoriesPanel.c b/CategoriesPanel.c index 89e93385..9d471217 100644 --- a/CategoriesPanel.c +++ b/CategoriesPanel.c @@ -64,37 +64,43 @@ HandlerResult CategoriesPanel_eventHandler(Panel* super, int ch) { HandlerResult result = IGNORED; - int previous = Panel_getSelectedIndex(super); - + int selected = Panel_getSelectedIndex(super); switch (ch) { + case EVENT_SETSELECTED: + result = HANDLED; + break; case KEY_UP: case KEY_DOWN: case KEY_NPAGE: case KEY_PPAGE: case KEY_HOME: case KEY_END: { + int previous = selected; Panel_onKey(super, ch); - int selected = Panel_getSelectedIndex(super); - if (previous != selected) { - int size = ScreenManager_size(this->scr); - for (int i = 1; i < size; i++) - ScreenManager_remove(this->scr, 1); - switch (selected) { - case 0: - CategoriesPanel_makeMetersPage(this); - break; - case 1: - CategoriesPanel_makeDisplayOptionsPage(this); - break; - case 2: - CategoriesPanel_makeColorsPage(this); - break; - case 3: - CategoriesPanel_makeColumnsPage(this); - break; - } - } - result = HANDLED; + selected = Panel_getSelectedIndex(super); + if (previous != selected) + result = HANDLED; + break; + } + } + + if (result == HANDLED) { + int size = ScreenManager_size(this->scr); + for (int i = 1; i < size; i++) + ScreenManager_remove(this->scr, 1); + switch (selected) { + case 0: + CategoriesPanel_makeMetersPage(this); + break; + case 1: + CategoriesPanel_makeDisplayOptionsPage(this); + break; + case 2: + CategoriesPanel_makeColorsPage(this); + break; + case 3: + CategoriesPanel_makeColumnsPage(this); + break; } } @@ -31,6 +31,8 @@ typedef enum HandlerResult_ { BREAK_LOOP } HandlerResult; +#define EVENT_SETSELECTED -1 + typedef HandlerResult(*Panel_EventHandler)(Panel*, int); struct Panel_ { @@ -222,6 +224,9 @@ void Panel_setSelected(Panel* this, int selected) { selected = MAX(0, MIN(Vector_size(this->items) - 1, selected)); this->selected = selected; + if (this->eventHandler) { + this->eventHandler(this, EVENT_SETSELECTED); + } } void Panel_draw(Panel* this, bool focus) { @@ -33,6 +33,8 @@ typedef enum HandlerResult_ { BREAK_LOOP } HandlerResult; +#define EVENT_SETSELECTED -1 + typedef HandlerResult(*Panel_EventHandler)(Panel*, int); struct Panel_ { |