bool (*process_key)(struct nc_widget *, FORM *, int);
void (*set_visible)(struct nc_widget *, bool);
void (*move)(struct nc_widget *, int, int);
+ void (*field_focus)(struct nc_widget *, FIELD *);
int focussed_attr;
int unfocussed_attr;
int height;
int width;
+ int focus_y;
int x;
int y;
};
};
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)),
field_move(select->options[i].field, y + i, x);
}
+static void select_field_focus(struct nc_widget *widget, FIELD *field)
+{
+ struct nc_widget_select *select = to_select(widget);
+ int i;
+
+ for (i = 0; i < select->n_options; i++) {
+ if (field != select->options[i].field)
+ continue;
+ widget->focus_y = i;
+ return;
+ }
+}
+
static int select_destructor(void *ptr)
{
struct nc_widget_select *select = ptr;
select->widget.process_key = select_process_key;
select->widget.set_visible = select_set_visible;
select->widget.move = select_move;
+ select->widget.field_focus = select_field_focus;
select->widget.focussed_attr = A_REVERSE;
select->widget.unfocussed_attr = A_NORMAL;
select->top = y;
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)
{
field = current_field(set->form);
widget = field_userptr(field);
widget_focus_change(widget, field, true);
+ if (widget->field_focus)
+ widget->field_focus(widget, field);
if (set->widget_focus)
set->widget_focus(widget, set->widget_focus_arg);
return true;
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) \
return widget->y;
}
+int widget_focus_y(struct nc_widget *widget)
+{
+ return widget->focus_y;
+}
+