ui/ncurses: Use a fixed-sized for small, known-length fields
authorJeremy Kerr <jk@ozlabs.org>
Tue, 15 Apr 2014 03:08:39 +0000 (11:08 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Wed, 16 Apr 2014 01:08:45 +0000 (09:08 +0800)
Fields without O_STATIC can "scroll" horizontally, and we may miss a
left-hand section of text from the current display. This can mean that
the user can't leave a validated field with no indication why, if the
off-to-the-left data is not a valid entry.

This change adds a widgetset function to mark a field as fixed-size, so
we don't have this scrolling behaviour. This means that the entire field
contents will always be visible, and any validation errors can be seen.

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

index f4fa073308e88c3246f30bd5357b433173bac05c..3107c72bddfa966caaeefe4044f8ec31bf9e9a2e 100644 (file)
@@ -503,6 +503,7 @@ static void config_screen_setup_widgets(struct config_screen *screen,
        screen->widgets.timeout_f = widget_new_textbox(set, 0, 0, 5, str);
        screen->widgets.timeout_help_l = widget_new_label(set, 0, 0, "seconds");
 
+       widget_textbox_set_fixed_size(screen->widgets.timeout_f);
        widget_textbox_set_validator_integer(screen->widgets.timeout_f, 0, 999);
 
        screen->widgets.network_l = widget_new_label(set, 0, 0, "Network");
@@ -561,10 +562,12 @@ static void config_screen_setup_widgets(struct config_screen *screen,
        screen->widgets.ip_addr_l = widget_new_label(set, 0, 0, "IP/mask:");
        screen->widgets.ip_addr_f = widget_new_textbox(set, 0, 0, 16, ip);
        screen->widgets.ip_mask_l = widget_new_label(set, 0, 0, "/");
-       screen->widgets.ip_mask_f = widget_new_textbox(set, 0, 0, 4, mask);
+       screen->widgets.ip_mask_f = widget_new_textbox(set, 0, 0, 3, mask);
        screen->widgets.ip_addr_mask_help_l =
                widget_new_label(set, 0, 0, "(eg. 192.168.0.10 / 24)");
 
+       widget_textbox_set_fixed_size(screen->widgets.ip_addr_f);
+       widget_textbox_set_fixed_size(screen->widgets.ip_mask_f);
        widget_textbox_set_validator_ipv4(screen->widgets.ip_addr_f);
        widget_textbox_set_validator_integer(screen->widgets.ip_mask_f, 1, 31);
 
@@ -573,6 +576,7 @@ static void config_screen_setup_widgets(struct config_screen *screen,
        screen->widgets.gateway_help_l =
                widget_new_label(set, 0, 0, "(eg. 192.168.0.1)");
 
+       widget_textbox_set_fixed_size(screen->widgets.gateway_f);
        widget_textbox_set_validator_ipv4(screen->widgets.gateway_f);
 
        str = talloc_strdup(screen, "");
index 2829040b46ba236a7ad01e9e1dd828d0199ac7d9..bd78927781f2c6dc830dd514bd5d97a9128b5c1f 100644 (file)
@@ -353,6 +353,11 @@ struct nc_widget_textbox *widget_new_textbox(struct nc_widgetset *set,
        return textbox;
 }
 
+void widget_textbox_set_fixed_size(struct nc_widget_textbox *textbox)
+{
+       field_opts_on(textbox->widget.field, O_STATIC);
+}
+
 void widget_textbox_set_validator_integer(struct nc_widget_textbox *textbox,
                long min, long max)
 {
index 32b6bae7a584e53e224fb261d75c647ae2d638bf..09c3b1f448aa4d56cb9dad3805ee4ae214593552 100644 (file)
@@ -35,6 +35,7 @@ struct nc_widget_button *widget_new_button(struct nc_widgetset *set,
                int y, int x, int size, const char *str,
                void (*click)(void *), void *arg);
 
+void widget_textbox_set_fixed_size(struct nc_widget_textbox *textbox);
 void widget_textbox_set_validator_integer(struct nc_widget_textbox *textbox,
                long min, long max);
 void widget_textbox_set_validator_ipv4(struct nc_widget_textbox *textbox);