};
static void widgetset_add_field(struct nc_widgetset *set, FIELD *field);
+static void widgetset_remove_field(struct nc_widgetset *set, FIELD *field);
+
+static bool key_is_select(int key)
+{
+ return key == ' ' || key == '\r' || key == '\n' || key == KEY_ENTER;
+}
static bool process_key_nop(struct nc_widget *widget __attribute__((unused)),
FORM *form __attribute((unused)),
{
struct nc_widget_checkbox *checkbox = to_checkbox(widget);
- if (key != ' ')
+ if (!key_is_select(key))
return false;
checkbox->checked = !checkbox->checked;
int i, new_idx;
FIELD *field;
- switch (key) {
- case ' ':
- case KEY_ENTER:
- break;
- default:
+ if (!key_is_select(key))
return false;
- }
field = current_field(form);
new_opt = NULL;
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)
{
if (!button->click)
return false;
- switch (key) {
- case ' ':
- case '\r':
- case '\n':
- button->click(button->arg);
- return true;
- }
+ if (!key_is_select(key))
+ return false;
- return false;
+ button->click(button->arg);
+ return true;
}
static int button_destructor(void *ptr)
return set;
}
+void widgetset_set_windows(struct nc_widgetset *set,
+ WINDOW *main, WINDOW *sub)
+{
+ set->mainwin = main;
+ set->subwin = sub;
+}
+
void widgetset_set_widget_focus(struct nc_widgetset *set,
widget_focus_cb cb, void *arg)
{
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) \