]> git.ozlabs.org Git - petitboot/commitdiff
ui/ncurses: Add widget_select_drop_options
authorJeremy Kerr <jk@ozlabs.org>
Wed, 20 Nov 2013 03:17:31 +0000 (14:17 +1100)
committerJeremy Kerr <jk@ozlabs.org>
Fri, 22 Nov 2013 05:13:14 +0000 (13:13 +0800)
We want to be able to re-set the options in a select widget.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
ui/ncurses/nc-widgets.c
ui/ncurses/nc-widgets.h

index 583e5ed82d9169c6762ff986cd2b599e928d103e..688722cd69cc7826aba7d8b60dc5f54286bd856f 100644 (file)
@@ -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)                  \
index d598d5aa440dc4c87a5cebac8b7fd470c814ddbd..18af6d84c7be24d7ab6ce360903cd35ea5519038 100644 (file)
@@ -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);