summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-11-20 14:17:31 +1100
committerJeremy Kerr <jk@ozlabs.org>2013-11-22 13:13:14 +0800
commitd2668cb8a8b9f5ded7b36217408e688ebc49442a (patch)
tree54fd106858c9ca56ad78a2c2d0d41a7a57c1e957 /ui
parentb7a7eb9a248f8afb1667b3e6675b49853e567ce1 (diff)
downloadtalos-petitboot-d2668cb8a8b9f5ded7b36217408e688ebc49442a.tar.gz
talos-petitboot-d2668cb8a8b9f5ded7b36217408e688ebc49442a.zip
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 <jk@ozlabs.org>
Diffstat (limited to 'ui')
-rw-r--r--ui/ncurses/nc-widgets.c39
-rw-r--r--ui/ncurses/nc-widgets.h1
2 files changed, 40 insertions, 0 deletions
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);
OpenPOWER on IntegriCloud