diff --git a/DisplayOptionsPanel.c b/DisplayOptionsPanel.c index 98237d666..176b017ee 100644 --- a/DisplayOptionsPanel.c +++ b/DisplayOptionsPanel.c @@ -20,9 +20,12 @@ in the source distribution for its full text. #include "ProvideCurses.h" -static const char* const DisplayOptionsFunctions[] = {"(De)Select ","Increment ", "Decrement ", "Done ", NULL}; -static const char* const DisplayOptionsKeys[] = {"Enter","+", "-", "F10", "Esc"}; -static const int DisplayOptionsEvents[] = {KEY_ENTER, '+', '-', KEY_F(10), 27}; +static const char* const BooleanDisplayOptionsFunctions[] = {"Select ", "Done ", NULL}; +static const char* const BooleanDisplayOptionsKeys[] = {"Enter", "F10", "Esc"}; +static const int BooleanDisplayOptionsEvents[] = {KEY_ENTER, KEY_F(10), 27}; +static const char* const NumericDisplayOptionsFunctions[] = {"Decrement ", "Increment ", "Done ", NULL}; +static const char* const NumericDisplayOptionsKeys[] = {"-", "+", "F10", "Esc"}; +static const int NumericDisplayOptionsEvents[] = {'-', '+', KEY_F(10), 27}; static void DisplayOptionsPanel_delete(Object* object) { Panel* super = (Panel*) object; @@ -31,6 +34,16 @@ static void DisplayOptionsPanel_delete(Object* object) { free(this); } +static void DisplayOptionsPanel_setFunctionBar(Panel *super, OptionItem* item){ + if (OptionItem_kind(item) == OPTION_ITEM_NUMBER) { + FunctionBar* fuBar = FunctionBar_new(NumericDisplayOptionsFunctions, NumericDisplayOptionsKeys, NumericDisplayOptionsEvents); + super->currentBar = fuBar; + } else { + FunctionBar* fuBar = FunctionBar_new(BooleanDisplayOptionsFunctions, BooleanDisplayOptionsKeys, BooleanDisplayOptionsEvents); + super->currentBar = fuBar; + } +} + static HandlerResult DisplayOptionsPanel_eventHandler(Panel* super, int ch) { DisplayOptionsPanel* this = (DisplayOptionsPanel*) super; @@ -38,6 +51,23 @@ static HandlerResult DisplayOptionsPanel_eventHandler(Panel* super, int ch) { OptionItem* selected = (OptionItem*) Panel_getSelected(super); switch (ch) { + + case KEY_UP: { + int selected_index = Panel_getSelectedIndex(super); + if (selected_index > 1) { + OptionItem* next_to_select = (OptionItem*) Panel_get(super, selected_index -1); + DisplayOptionsPanel_setFunctionBar(super, next_to_select); + } + break; + } + case KEY_DOWN: { + int selected_index = Panel_getSelectedIndex(super); + if (selected_index < Panel_size(super) - 1) { + OptionItem* next_to_select = (OptionItem*) Panel_get(super, selected_index +1); + DisplayOptionsPanel_setFunctionBar(super, next_to_select); + } + break; + } case '\n': case '\r': case KEY_ENTER: @@ -92,7 +122,7 @@ const PanelClass DisplayOptionsPanel_class = { DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* scr) { DisplayOptionsPanel* this = AllocThis(DisplayOptionsPanel); Panel* super = (Panel*) this; - FunctionBar* fuBar = FunctionBar_new(DisplayOptionsFunctions, DisplayOptionsKeys, DisplayOptionsEvents); + FunctionBar* fuBar = FunctionBar_new(BooleanDisplayOptionsFunctions, BooleanDisplayOptionsKeys, BooleanDisplayOptionsEvents); Panel_init(super, 1, 1, 1, 1, Class(OptionItem), true, fuBar); this->settings = settings;