diff --git a/panels/network/net-proxy.c b/panels/network/net-proxy.c index fd4873ff3..d1b46026a 100644 --- a/panels/network/net-proxy.c +++ b/panels/network/net-proxy.c @@ -29,14 +29,49 @@ #define NET_PROXY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NET_TYPE_PROXY, NetProxyPrivate)) +typedef enum +{ + MODE_DISABLED, + MODE_MANUAL, + MODE_AUTOMATIC, + N_MODES +} ProxyMode; + struct _NetProxyPrivate { GSettings *settings; GtkBuilder *builder; + GtkToggleButton *mode_radios[3]; }; G_DEFINE_TYPE (NetProxy, net_proxy, NET_TYPE_OBJECT) +static const gchar * +panel_get_string_for_value (ProxyMode mode) +{ + switch (mode) { + case MODE_DISABLED: + return _("Off"); + case MODE_MANUAL: + return _("Manual"); + case MODE_AUTOMATIC: + return _("Automatic"); + default: + g_assert_not_reached (); + } +} + +static inline void +panel_update_status_label (NetProxy *self, + ProxyMode mode) +{ + GtkLabel *label; + + /* update the label */ + label = GTK_LABEL (gtk_builder_get_object (self->priv->builder, "status_label")); + gtk_label_set_label (label, panel_get_string_for_value (mode)); +} + static void check_wpad_warning (NetProxy *proxy) { @@ -50,7 +85,7 @@ check_wpad_warning (NetProxy *proxy) /* check we're using 'Automatic' */ mode = g_settings_get_enum (proxy->priv->settings, "mode"); - if (mode != 2) + if (mode != MODE_AUTOMATIC) goto out; /* see if the PAC is blank */ @@ -93,120 +128,72 @@ settings_changed_cb (GSettings *settings, } static void -panel_proxy_mode_combo_setup_widgets (NetProxy *proxy, guint value) +panel_proxy_mode_setup_widgets (NetProxy *proxy, ProxyMode value) { - GtkWidget *widget; + GtkStack *stack; + + stack = GTK_STACK (gtk_builder_get_object (proxy->priv->builder, "stack")); /* hide or show the PAC text box */ - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "heading_proxy_url")); - gtk_widget_set_visible (widget, value == 2); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "entry_proxy_url")); - gtk_widget_set_visible (widget, value == 2); - - /* hide or show the manual entry text boxes */ - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "heading_proxy_http")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "entry_proxy_http")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "spinbutton_proxy_http")); - gtk_widget_set_visible (widget, value == 1); - - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "heading_proxy_https")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "entry_proxy_https")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "spinbutton_proxy_https")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "heading_proxy_ftp")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "entry_proxy_ftp")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "spinbutton_proxy_ftp")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "heading_proxy_socks")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "entry_proxy_socks")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "spinbutton_proxy_socks")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "heading_proxy_ignore")); - gtk_widget_set_visible (widget, value == 1); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "entry_proxy_ignore")); - gtk_widget_set_visible (widget, value == 1); + switch (value) { + case MODE_DISABLED: + gtk_stack_set_visible_child_name (stack, "disabled"); + break; + case MODE_MANUAL: + gtk_stack_set_visible_child_name (stack, "manual"); + break; + case MODE_AUTOMATIC: + gtk_stack_set_visible_child_name (stack, "automatic"); + break; + default: + g_assert_not_reached (); + } /* perhaps show the wpad warning */ check_wpad_warning (proxy); } static void -panel_set_value_for_combo (NetProxy *proxy, GtkComboBox *combo_box, gint value) +panel_proxy_mode_radio_changed_cb (GtkToggleButton *radio, + NetProxy *proxy) { - gboolean ret; - gint value_tmp; - GtkTreeIter iter; - GtkTreeModel *model; + ProxyMode value; - /* get entry */ - model = gtk_combo_box_get_model (combo_box); - ret = gtk_tree_model_get_iter_first (model, &iter); - if (!ret) + if (!gtk_toggle_button_get_active (radio)) return; - /* try to make the UI match the setting */ - do { - gtk_tree_model_get (model, &iter, - 1, &value_tmp, - -1); - if (value == value_tmp) { - gtk_combo_box_set_active_iter (combo_box, &iter); - break; - } - } while (gtk_tree_model_iter_next (model, &iter)); - - /* hide or show the correct widgets */ - panel_proxy_mode_combo_setup_widgets (proxy, value); -} - -static void -panel_proxy_mode_combo_changed_cb (GtkWidget *widget, NetProxy *proxy) -{ - gboolean ret; - gint value; - GtkTreeIter iter; - GtkTreeModel *model; - - /* no selection */ - ret = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter); - if (!ret) - return; - - /* get entry */ - model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget)); - gtk_tree_model_get (model, &iter, - 1, &value, - -1); + /* get selected radio */ + if (radio == proxy->priv->mode_radios[MODE_DISABLED]) + value = MODE_DISABLED; + else if (radio == proxy->priv->mode_radios[MODE_MANUAL]) + value = MODE_MANUAL; + else if (radio == proxy->priv->mode_radios[MODE_AUTOMATIC]) + value = MODE_AUTOMATIC; + else + g_assert_not_reached (); /* set */ g_settings_set_enum (proxy->priv->settings, "mode", value); /* hide or show the correct widgets */ - panel_proxy_mode_combo_setup_widgets (proxy, value); + panel_proxy_mode_setup_widgets (proxy, value); + + /* status label */ + panel_update_status_label (proxy, value); +} + +static void +show_dialog_cb (GtkWidget *button, + NetProxy *self) +{ + GtkWidget *toplevel; + GtkWindow *dialog; + + toplevel = gtk_widget_get_toplevel (button); + dialog = GTK_WINDOW (gtk_builder_get_object (self->priv->builder, "dialog")); + + gtk_window_set_transient_for (dialog, GTK_WINDOW (toplevel)); + gtk_window_present (dialog); } static GtkWidget * @@ -217,13 +204,9 @@ net_proxy_add_to_stack (NetObject *object, GtkWidget *widget; NetProxy *proxy = NET_PROXY (object); - /* add widgets to size group */ widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "heading_proxy_method")); + "main_widget")); gtk_size_group_add_widget (heading_size_group, widget); - - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "grid5")); gtk_stack_add_named (stack, widget, net_object_get_id (object)); return widget; } @@ -302,11 +285,12 @@ set_ignore_hosts (const GValue *value, static void net_proxy_init (NetProxy *proxy) { - GError *error = NULL; - gint value; - GSettings *settings_tmp; GtkAdjustment *adjustment; + GSettings *settings_tmp; + ProxyMode value; GtkWidget *widget; + GError *error = NULL; + guint i; proxy->priv = NET_PROXY_GET_PRIVATE (proxy); @@ -328,12 +312,6 @@ net_proxy_init (NetProxy *proxy) /* actions */ value = g_settings_get_enum (proxy->priv->settings, "mode"); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "combobox_proxy_mode")); - panel_set_value_for_combo (proxy, GTK_COMBO_BOX (widget), value); - g_signal_connect (widget, "changed", - G_CALLBACK (panel_proxy_mode_combo_changed_cb), - proxy); /* bind the proxy values */ widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, @@ -398,20 +376,6 @@ net_proxy_init (NetProxy *proxy) G_SETTINGS_BIND_DEFAULT); g_object_unref (settings_tmp); - /* set header to something sane */ - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "image_proxy_device")); - gtk_image_set_from_icon_name (GTK_IMAGE (widget), - "preferences-system-network", - GTK_ICON_SIZE_DIALOG); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "label_proxy_device")); - gtk_label_set_label (GTK_LABEL (widget), - _("Proxy")); - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "label_proxy_status")); - gtk_label_set_label (GTK_LABEL (widget), ""); - /* bind the proxy ignore hosts */ widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, "entry_proxy_ignore")); @@ -420,11 +384,41 @@ net_proxy_init (NetProxy *proxy) G_SETTINGS_BIND_DEFAULT, get_ignore_hosts, set_ignore_hosts, NULL, NULL); - /* hide the switch until we get some more detail in the mockup */ - widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, - "device_proxy_off_switch")); - if (widget != NULL) - gtk_widget_hide (widget); + /* radio buttons */ + proxy->priv->mode_radios[MODE_DISABLED] = + GTK_TOGGLE_BUTTON (gtk_builder_get_object (proxy->priv->builder, "radio_none")); + proxy->priv->mode_radios[MODE_MANUAL] = + GTK_TOGGLE_BUTTON (gtk_builder_get_object (proxy->priv->builder, "radio_manual")); + proxy->priv->mode_radios[MODE_AUTOMATIC] = + GTK_TOGGLE_BUTTON (gtk_builder_get_object (proxy->priv->builder, "radio_automatic")); + + /* setup the radio before connecting to the :toggled signal */ + gtk_toggle_button_set_active (proxy->priv->mode_radios[value], TRUE); + panel_proxy_mode_setup_widgets (proxy, value); + panel_update_status_label (proxy, value); + + for (i = MODE_DISABLED; i < N_MODES; i++) { + g_signal_connect (proxy->priv->mode_radios[i], + "toggled", + G_CALLBACK (panel_proxy_mode_radio_changed_cb), + proxy); + } + + /* show dialog button */ + widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, "dialog_button")); + + g_signal_connect (widget, + "clicked", + G_CALLBACK (show_dialog_cb), + proxy); + + /* prevent the dialog from being destroyed */ + widget = GTK_WIDGET (gtk_builder_get_object (proxy->priv->builder, "dialog")); + + g_signal_connect (widget, + "delete-event", + G_CALLBACK (gtk_widget_hide_on_delete), + widget); } NetProxy * diff --git a/panels/network/network-proxy.ui b/panels/network/network-proxy.ui index 9cf51b6a7..232c4d00b 100644 --- a/panels/network/network-proxy.ui +++ b/panels/network/network-proxy.ui @@ -17,477 +17,465 @@ 65535 1 - - - - - - - - - - None - 0 - - - Manual - 1 - - - Automatic - 2 - - - - + + True + False + + True False - start - 12 - 10 - 6 + none - + True False - end - start + False - - - - - 2 - 0 - 1 - 1 - - - - - True - False - 1 - _Method - True - combobox_proxy_mode - - - - 0 - 1 - 1 - 1 - - - - - True - False - 0 - 1 - liststore_proxy_method - - - 1 - 1 - 2 - 1 - - - - - True - False - 1 - _Configuration URL - True - entry_proxy_url - - - - 0 - 2 - 1 - 1 - - - - - True - True - - True - - - 1 - 2 - 2 - 1 - - - - - True - False - 1 - _HTTP Proxy - True - entry_proxy_http - - - - 0 - 3 - 1 - 1 - - - - - True - False - 1 - H_TTPS Proxy - True - entry_proxy_https - - - - 0 - 4 - 1 - 1 - - - - - True - False - 1 - _FTP Proxy - True - entry_proxy_ftp - - - - 0 - 5 - 1 - 1 - - - - - True - False - 1 - _Socks Host - True - entry_proxy_socks - - - - 0 - 6 - 1 - 1 - - - - - True - False - 1 - _Ignore Hosts - True - entry_proxy_ignore - - - - 0 - 7 - 1 - 1 - - - - - False - False - 0 - WPAD warning… - True - 50 - - - 0 - 8 - 3 - 1 - - - - - True - True - - True - - - 1 - 3 - 1 - 1 - - - - - True - True - - 1 - True - adjustment_proxy_port_http - - - HTTP proxy port - - - - - 2 - 3 - 1 - 1 - - - - - True - True - - True - - - 1 - 4 - 1 - 1 - - - - - True - True - - True - - - 1 - 5 - 1 - 1 - - - - - True - True - - True - - - 1 - 6 - 1 - 1 - - - - - True - True - - True - - - 1 - 7 - 2 - 1 - - - - - True - True - - 1 - True - adjustment_proxy_port_https - - - HTTPS proxy port - - - - - 2 - 4 - 1 - 1 - - - - - True - True - - 1 - True - adjustment_proxy_port_ftp - - - FTP proxy port - - - - - 2 - 5 - 1 - 1 - - - - - True - True - - 1 - True - adjustment_proxy_port_socks - - - Socks proxy port - - - - - 2 - 6 - 1 - 1 - - - - - True - False - 6 - - + True False - end - start - 1 - 48 - preferences-system-network - 6 - - - False - True - 0 - - - - - True - False - start - True - 3 + 12 + 12 - + True False - 0 - Proxy - end + True + Network Proxy + 0.0 - - + + + + + True + True + + + + + + True + True + + + True + False + emblem-system-symbolic + + + + + + + + + + + + + 1 + False + 18 + 350 + True + dialog + center + True + Network Proxy + + + True + False + 0 + 6 + + + True + True + Automatic + False + True + radio_none + + + + + True + True + Manual + False + True + radio_none + + + + + True + True + Disabled + False + True + + + + + True + False + crossfade + + + + + True + False + + + disabled + + + + + + + True + False + start + 12 + 10 + 6 + + + True + False + end + start + - False - False - 0 + 2 + 0 + 1 + 1 - + True False - 0 - Not connected + 1 + _HTTP Proxy + True + entry_proxy_http + - False - False - 1 + 0 + 3 + 1 + 1 + + + + + True + False + 1 + H_TTPS Proxy + True + entry_proxy_https + + + + 0 + 4 + 1 + 1 + + + + + True + False + 1 + _FTP Proxy + True + entry_proxy_ftp + + + + 0 + 5 + 1 + 1 + + + + + True + False + 1 + _Socks Host + True + entry_proxy_socks + + + + 0 + 6 + 1 + 1 + + + + + True + False + 1 + _Ignore Hosts + True + entry_proxy_ignore + + + + 0 + 7 + 1 + 1 + + + + + True + True + + True + + + 1 + 3 + 1 + 1 + + + + + True + True + + 1 + True + adjustment_proxy_port_http + + + HTTP proxy port + + + + + 2 + 3 + 1 + 1 + + + + + True + True + + True + + + 1 + 4 + 1 + 1 + + + + + True + True + + True + + + 1 + 5 + 1 + 1 + + + + + True + True + + True + + + 1 + 6 + 1 + 1 + + + + + True + True + + True + + + 1 + 7 + 2 + 1 + + + + + True + True + + 1 + True + adjustment_proxy_port_https + + + HTTPS proxy port + + + + + 2 + 4 + 1 + 1 + + + + + True + True + + 1 + True + adjustment_proxy_port_ftp + + + FTP proxy port + + + + + 2 + 5 + 1 + 1 + + + + + True + True + + 1 + True + adjustment_proxy_port_socks + + + Socks proxy port + + + + + 2 + 6 + 1 + 1 - False - True - 1 + manual + + - + True - True - end - center + False + 12 + 12 + + + True + False + 1 + _Configuration URL + True + entry_proxy_url + + + + 0 + 0 + + + + + True + True + + True + + + 0 + 1 + + + + + False + False + 0 + WPAD warning… + True + 50 + + + 1 + 0 + 2 + + - False - True - 2 + automatic - - 0 - 0 - 3 - 1 - - - - - - +