From d2668cb8a8b9f5ded7b36217408e688ebc49442a Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Wed, 20 Nov 2013 14:17:31 +1100 Subject: ui/ncurses: Add widget_select_drop_options We want to be able to re-set the options in a select widget. Signed-off-by: Jeremy Kerr --- ui/ncurses/nc-widgets.c | 39 +++++++++++++++++++++++++++++++++++++++ ui/ncurses/nc-widgets.h | 1 + 2 files changed, 40 insertions(+) (limited to 'ui') diff --git a/ui/ncurses/nc-widgets.c b/ui/ncurses/nc-widgets.c index 583e5ed..688722c 100644 --- a/ui/ncurses/nc-widgets.c +++ b/ui/ncurses/nc-widgets.c @@ -130,6 +130,7 @@ struct nc_widget_button { }; static void widgetset_add_field(struct nc_widgetset *set, FIELD *field); +static void widgetset_remove_field(struct nc_widgetset *set, FIELD *field); static bool process_key_nop(struct nc_widget *widget __attribute__((unused)), FORM *form __attribute((unused)), @@ -526,6 +527,27 @@ void widget_select_on_change(struct nc_widget_select *select, select->on_change_arg = arg; } +void widget_select_drop_options(struct nc_widget_select *select) +{ + struct nc_widgetset *set = select->set; + int i; + + for (i = 0; i < select->n_options; i++) { + FIELD *field = select->options[i].field; + widgetset_remove_field(set, field); + if (field == set->cur_field) + set->cur_field = NULL; + free_field(select->options[i].field); + } + + talloc_free(select->options); + select->options = NULL; + select->n_options = 0; + select->widget.height = 0; + select->widget.focus_y = 0; + +} + static bool button_process_key(struct nc_widget *widget, FORM *form __attribute__((unused)), int key) { @@ -723,6 +745,23 @@ static void widgetset_add_field(struct nc_widgetset *set, FIELD *field) set->fields[set->n_fields] = NULL; } +static void widgetset_remove_field(struct nc_widgetset *set, FIELD *field) +{ + int i; + + for (i = 0; i < set->n_fields; i++) { + if (set->fields[i] == field) + break; + } + + if (i == set->n_fields) + return; + + memmove(&set->fields[i], &set->fields[i+i], + (set->n_fields - i) * sizeof(set->fields[i])); + set->n_fields--; +} + #define DECLARE_BASEFN(type) \ struct nc_widget *widget_ ## type ## _base \ (struct nc_widget_ ## type *w) \ diff --git a/ui/ncurses/nc-widgets.h b/ui/ncurses/nc-widgets.h index d598d5a..18af6d8 100644 --- a/ui/ncurses/nc-widgets.h +++ b/ui/ncurses/nc-widgets.h @@ -45,6 +45,7 @@ char *widget_textbox_get_value(struct nc_widget_textbox *textbox); bool widget_checkbox_get_value(struct nc_widget_checkbox *checkbox); int widget_select_get_value(struct nc_widget_select *select); int widget_select_height(struct nc_widget_select *select); +void widget_select_drop_options(struct nc_widget_select *select); /* generic widget API */ struct nc_widget *widget_textbox_base(struct nc_widget_textbox *textbox); -- cgit v1.2.1