From 5ed2b85c847995da3f4dc01c4d2790358adeb03d Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Wed, 5 Mar 2008 06:54:30 +0000 Subject: [PATCH] Make clicks on leftmost panel in the Setup screen change setup pages, like the keyboard navigation does. Fixes bug reported by Tero Keinanen. https://sourceforge.net/tracker/index.php?func=detail&aid=1754735&group_id=108839&atid=651633 --- CategoriesPanel.c | 52 ++++++++++++++++++++++++++--------------------- Panel.c | 5 +++++ 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; } } diff --git a/Panel.c b/Panel.c index 8c1bf560..14f542bc 100644 --- a/Panel.c +++ b/Panel.c @@ -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) { diff --git a/Panel.h b/Panel.h index 54e30877..c0f603a6 100644 --- a/Panel.h +++ b/Panel.h @@ -33,6 +33,8 @@ typedef enum HandlerResult_ { BREAK_LOOP } HandlerResult; +#define EVENT_SETSELECTED -1 + typedef HandlerResult(*Panel_EventHandler)(Panel*, int); struct Panel_ {