diff options
author | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2017-07-21 14:39:27 -0300 |
---|---|---|
committer | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2017-08-07 20:20:41 +0100 |
commit | b5e7e50e14608a8ba5fc69642eaf107841d7f506 (patch) | |
tree | df3e393fd0b1afee1afdca5d0160047f8af29ddf | |
parent | 03a82a54e7bbaecb321dcede994980492b11e7f1 (diff) | |
download | gnome-control-center-b5e7e50e14608a8ba5fc69642eaf107841d7f506.tar.gz |
network: Update VPN section
The last remaining network device to be updated is
the VPN device, and this patch is the result of this
effort.
The changes were mostly towards cleaning up and
removing unecessary code. By removing the info labels,
many getters were removed as well.
In order to achieve a listbox-like UI, a couple of
UI refactorings.
https://bugzilla.gnome.org/show_bug.cgi?id=785581
-rw-r--r-- | panels/network/cc-network-panel.c | 30 | ||||
-rw-r--r-- | panels/network/net-vpn.c | 141 | ||||
-rw-r--r-- | panels/network/net-vpn.h | 2 | ||||
-rw-r--r-- | panels/network/network-vpn.ui | 363 | ||||
-rw-r--r-- | panels/network/network.ui | 43 |
5 files changed, 133 insertions, 446 deletions
diff --git a/panels/network/cc-network-panel.c b/panels/network/cc-network-panel.c index 072c6198f..ad019a380 100644 --- a/panels/network/cc-network-panel.c +++ b/panels/network/cc-network-panel.c @@ -65,6 +65,7 @@ struct _CcNetworkPanel GtkWidget *box_proxy; GtkWidget *box_vpn; GtkWidget *box_wired; + GtkWidget *empty_listbox; /* wireless dialog stuff */ CmdlineOperation arg_operation; @@ -382,6 +383,28 @@ handle_argv (CcNetworkPanel *panel) g_debug ("Could not handle argv operation, no matching device yet?"); } +/* HACK: this function is basically a workaround. We don't have a single + * listbox in the VPN section, thus we need to track the separators and the + * stub row manually. + */ +static void +update_vpn_section (CcNetworkPanel *self) +{ + guint i, n_vpns; + + for (i = 0, n_vpns = 0; i < self->devices->len; i++) { + NetObject *net_object = g_ptr_array_index (self->devices, i); + + if (!NET_IS_VPN (net_object)) + continue; + + net_vpn_set_show_separator (NET_VPN (net_object), n_vpns > 0); + n_vpns++; + } + + gtk_widget_set_visible (self->empty_listbox, n_vpns == 0); +} + static GtkWidget * add_device_stack (CcNetworkPanel *self, NetObject *object) { @@ -504,6 +527,9 @@ panel_remove_device (CcNetworkPanel *panel, NMDevice *device) return; g_ptr_array_remove (panel->devices, object); + + /* update vpn widgets */ + update_vpn_section (panel); } static void @@ -663,6 +689,9 @@ panel_add_vpn_device (CcNetworkPanel *panel, NMConnection *connection) g_ptr_array_add (panel->devices, net_vpn); g_free (title); + + /* update vpn widgets */ + update_vpn_section (panel); } static void @@ -788,6 +817,7 @@ cc_network_panel_class_init (CcNetworkPanelClass *klass) gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, box_proxy); gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, box_vpn); gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, box_wired); + gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, empty_listbox); gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, sizegroup); gtk_widget_class_bind_template_callback (widget_class, create_connection_cb); diff --git a/panels/network/net-vpn.c b/panels/network/net-vpn.c index a2e6905be..47b7391a9 100644 --- a/panels/network/net-vpn.c +++ b/panels/network/net-vpn.c @@ -51,6 +51,16 @@ enum { G_DEFINE_TYPE (NetVpn, net_vpn, NET_TYPE_OBJECT) +void +net_vpn_set_show_separator (NetVpn *self, + gboolean show_separator) +{ + GtkWidget *separator; + + separator = GTK_WIDGET (gtk_builder_get_object (self->priv->builder, "separator")); + gtk_widget_set_visible (separator, show_separator); +} + static void connection_vpn_state_changed_cb (NMVpnConnection *connection, NMVpnConnectionState state, @@ -136,98 +146,6 @@ net_vpn_get_state (NetVpn *vpn) return nm_vpn_connection_get_vpn_state (NM_VPN_CONNECTION (priv->connection)); } -/* VPN parameters can be found at: - * http://git.gnome.org/browse/network-manager-openvpn/tree/src/nm-openvpn-service.h - * http://git.gnome.org/browse/network-manager-vpnc/tree/src/nm-vpnc-service.h - * http://git.gnome.org/browse/network-manager-pptp/tree/src/nm-pptp-service.h - * http://git.gnome.org/browse/network-manager-openconnect/tree/src/nm-openconnect-service.h - * http://git.gnome.org/browse/network-manager-openswan/tree/src/nm-openswan-service.h - * See also 'properties' directory in these plugins. - */ -static const gchar * -get_vpn_key_gateway (const char *vpn_type) -{ - if (g_strcmp0 (vpn_type, "openvpn") == 0) return "remote"; - if (g_strcmp0 (vpn_type, "vpnc") == 0) return "IPSec gateway"; - if (g_strcmp0 (vpn_type, "pptp") == 0) return "gateway"; - if (g_strcmp0 (vpn_type, "openconnect") == 0) return "gateway"; - if (g_strcmp0 (vpn_type, "openswan") == 0) return "right"; - return ""; -} - -static const gchar * -get_vpn_key_group (const char *vpn_type) -{ - if (g_strcmp0 (vpn_type, "openvpn") == 0) return ""; - if (g_strcmp0 (vpn_type, "vpnc") == 0) return "IPSec ID"; - if (g_strcmp0 (vpn_type, "pptp") == 0) return ""; - if (g_strcmp0 (vpn_type, "openconnect") == 0) return ""; - if (g_strcmp0 (vpn_type, "openswan") == 0) return ""; - return ""; -} - -static const gchar * -get_vpn_key_username (const char *vpn_type) -{ - if (g_strcmp0 (vpn_type, "openvpn") == 0) return "username"; - if (g_strcmp0 (vpn_type, "vpnc") == 0) return "Xauth username"; - if (g_strcmp0 (vpn_type, "pptp") == 0) return "user"; - if (g_strcmp0 (vpn_type, "openconnect") == 0) return "username"; - if (g_strcmp0 (vpn_type, "openswan") == 0) return "leftxauthusername"; - return ""; -} - -static const gchar * -get_vpn_key_group_password (const char *vpn_type) -{ - if (g_strcmp0 (vpn_type, "openvpn") == 0) return ""; - if (g_strcmp0 (vpn_type, "vpnc") == 0) return "Xauth password"; - if (g_strcmp0 (vpn_type, "pptp") == 0) return ""; - if (g_strcmp0 (vpn_type, "openconnect") == 0) return ""; - if (g_strcmp0 (vpn_type, "openswan") == 0) return ""; - return ""; -} - -static const gchar * -net_vpn_get_gateway (NetVpn *vpn) -{ - NetVpnPrivate *priv = vpn->priv; - const gchar *key; - - key = get_vpn_key_gateway (priv->service_type); - return nm_setting_vpn_get_data_item (nm_connection_get_setting_vpn (priv->connection), key); -} - -static const gchar * -net_vpn_get_id (NetVpn *vpn) -{ - NetVpnPrivate *priv = vpn->priv; - const gchar *key; - - key = get_vpn_key_group (priv->service_type); - return nm_setting_vpn_get_data_item (nm_connection_get_setting_vpn (priv->connection), key); -} - -static const gchar * -net_vpn_get_username (NetVpn *vpn) -{ - NetVpnPrivate *priv = vpn->priv; - const gchar *key; - - key = get_vpn_key_username (priv->service_type); - return nm_setting_vpn_get_data_item (nm_connection_get_setting_vpn (priv->connection), key); -} - -static const gchar * -net_vpn_get_password (NetVpn *vpn) -{ - NetVpnPrivate *priv = vpn->priv; - const gchar *key; - - key = get_vpn_key_group_password (priv->service_type); - return nm_setting_vpn_get_data_item (nm_connection_get_setting_vpn (priv->connection), key); -} - static void vpn_proxy_delete (NetObject *object) { @@ -246,10 +164,6 @@ vpn_proxy_add_to_stack (NetObject *object, /* add widgets to size group */ widget = GTK_WIDGET (gtk_builder_get_object (vpn->priv->builder, - "heading_group_password")); - gtk_size_group_add_widget (heading_size_group, widget); - - widget = GTK_WIDGET (gtk_builder_get_object (vpn->priv->builder, "vbox9")); gtk_stack_add_named (stack, widget, net_object_get_id (object)); return widget; @@ -260,7 +174,6 @@ nm_device_refresh_vpn_ui (NetVpn *vpn) { GtkWidget *widget; GtkWidget *sw; - const gchar *status; NetVpnPrivate *priv = vpn->priv; const GPtrArray *acs; NMActiveConnection *a; @@ -269,10 +182,6 @@ nm_device_refresh_vpn_ui (NetVpn *vpn) gchar *title; NMClient *client; - sw = GTK_WIDGET (gtk_builder_get_object (priv->builder, - "device_off_switch")); - gtk_widget_set_visible (sw, TRUE); - /* update title */ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "label_device")); @@ -318,40 +227,12 @@ nm_device_refresh_vpn_ui (NetVpn *vpn) } } - widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, - "label_status")); - status = panel_vpn_state_to_localized_string (state); - gtk_label_set_label (GTK_LABEL (widget), status); priv->updating_device = TRUE; + sw = GTK_WIDGET (gtk_builder_get_object (priv->builder, "device_off_switch")); gtk_switch_set_active (GTK_SWITCH (sw), state != NM_VPN_CONNECTION_STATE_FAILED && state != NM_VPN_CONNECTION_STATE_DISCONNECTED); priv->updating_device = FALSE; - - /* service type */ - panel_set_device_widget_details (vpn->priv->builder, - "service_type", - vpn->priv->service_type); - - /* gateway */ - panel_set_device_widget_details (vpn->priv->builder, - "gateway", - net_vpn_get_gateway (vpn)); - - /* groupname */ - panel_set_device_widget_details (vpn->priv->builder, - "group_name", - net_vpn_get_id (vpn)); - - /* username */ - panel_set_device_widget_details (vpn->priv->builder, - "username", - net_vpn_get_username (vpn)); - - /* password */ - panel_set_device_widget_details (vpn->priv->builder, - "group_password", - net_vpn_get_password (vpn)); } static void diff --git a/panels/network/net-vpn.h b/panels/network/net-vpn.h index 6ca1910e8..adcf8ad75 100644 --- a/panels/network/net-vpn.h +++ b/panels/network/net-vpn.h @@ -52,6 +52,8 @@ struct _NetVpnClass }; GType net_vpn_get_type (void); +void net_vpn_set_show_separator (NetVpn *self, + gboolean show_separator); G_END_DECLS diff --git a/panels/network/network-vpn.ui b/panels/network/network-vpn.ui index 7a3fab4fc..3fb080abf 100644 --- a/panels/network/network-vpn.ui +++ b/panels/network/network-vpn.ui @@ -1,268 +1,46 @@ <?xml version="1.0" encoding="UTF-8"?> <interface> <!-- interface-requires gtk+ 3.0 --> - <object class="GtkVBox" id="vbox9"> - <property name="visible">True</property> + <object class="GtkBox" id="vbox9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="orientation">vertical</property> + + <!-- HACK: a separator above the row, since we don't have a real listbox widget in the panel --> + <child> + <object class="GtkSeparator" id="separator"> <property name="can_focus">False</property> - <property name="border_width">12</property> - <property name="spacing">6</property> + <property name="orientation">horizontal</property> + </object> + </child> + + <!-- Main listbox --> + <child> + <object class="GtkListBox"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="selection_mode">none</property> <child> - <object class="GtkGrid" id="grid4"> + <object class="GtkListBoxRow"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="valign">start</property> - <property name="row_spacing">10</property> - <property name="column_spacing">6</property> - <child> - <object class="GtkLabel" id="heading_service_type"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">VPN Type</property> - <property name="mnemonic_widget">label_service_type</property> - <style> - <class name="dim-label"/> - </style> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="heading_gateway"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Gateway</property> - <property name="mnemonic_widget">label_gateway</property> - <style> - <class name="dim-label"/> - </style> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">2</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="heading_group_name"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Group Name</property> - <property name="mnemonic_widget">label_group_name</property> - <style> - <class name="dim-label"/> - </style> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">3</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="heading_group_password"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Group Password</property> - <property name="mnemonic_widget">label_group_password</property> - <style> - <class name="dim-label"/> - </style> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">4</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> + <property name="can_focus">True</property> + <property name="activatable">False</property> <child> - <object class="GtkLabel" id="heading_username"> + <object class="GtkBox"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Username</property> - <property name="mnemonic_widget">label_username</property> - <style> - <class name="dim-label"/> - </style> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">5</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label_service_type"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label">openvpn</property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">1</property> - <property name="width">2</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label_gateway"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label">AA:BB:CC:DD:55:66:77:88</property> - <property name="ellipsize">end</property> - <property name="max-width-chars">24</property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">2</property> - <property name="width">2</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label_group_name"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label">SEKRIT</property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">3</property> - <property name="width">2</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label_group_password"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label">**********</property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">4</property> - <property name="width">2</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label_username"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label">smithy</property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">5</property> - <property name="width">2</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkAlignment" id="alignment_switch"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">end</property> <property name="valign">start</property> + <property name="margin">12</property> + <property name="spacing">12</property> <child> - <placeholder/> - </child> - </object> - <packing> - <property name="left_attach">2</property> - <property name="top_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkBox" id="box1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="hexpand">True</property> - <property name="spacing">6</property> - <child> - <object class="GtkImage" id="image_device"> + <object class="GtkLabel" id="label_device"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="halign">end</property> - <property name="valign">start</property> - <property name="xalign">1</property> - <property name="pixel_size">48</property> - <property name="icon_name">network-vpn</property> - <property name="icon-size">6</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkVBox" id="vbox12"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="valign">start</property> + <property name="xalign">0</property> + <property name="ellipsize">end</property> <property name="hexpand">True</property> - <child> - <object class="GtkLabel" id="label_device"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label">VPN</property> - <property name="ellipsize">end</property> - <attributes> - <attribute name="weight" value="bold"/> - <attribute name="scale" value="1.2"/> - </attributes> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label_status"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label">Not connected</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> </child> <child> <object class="GtkSwitch" id="device_off_switch"> @@ -276,80 +54,35 @@ </object> </child> </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">2</property> - </packing> </child> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> - <property name="width">3</property> - <property name="height">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="box3"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkButton" id="button_options"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="halign">end</property> - <property name="valign">end</property> - <property name="hexpand">True</property> - <property name="vexpand">True</property> - <property name="use_underline">True</property> - <style> - <class name="image-button"/> - </style> <child> - <object class="GtkImage" id="image1"> + <object class="GtkButton" id="button_options"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">emblem-system-symbolic</property> - <property name="icon_size">1</property> - </object> - </child> - <child internal-child="accessible"> - <object class="AtkObject" id="button_options-accessible"> - <property name="accessible-name" translatable="yes">Options…</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <style> + <class name="image-button"/> + </style> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">emblem-system-symbolic</property> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="button_options-accessible"> + <property name="accessible-name" translatable="yes">Options…</property> + </object> + </child> </object> </child> </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> </child> </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> </child> </object> - <object class="GtkSizeGroup" id="sizegroup1"> - <widgets> - <widget name="heading_service_type"/> - <widget name="heading_gateway"/> - <widget name="heading_group_name"/> - <widget name="heading_group_password"/> - <widget name="heading_username"/> - </widgets> + </child> </object> </interface> diff --git a/panels/network/network.ui b/panels/network/network.ui index 52691fa7a..d287734a5 100644 --- a/panels/network/network.ui +++ b/panels/network/network.ui @@ -72,10 +72,11 @@ </object> </child> <child> - <object class="GtkBox" id="box_vpn"> + <object class="GtkBox"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="orientation">vertical</property> + <property name="spacing">6</property> <!-- VPN header --> <child> @@ -111,6 +112,46 @@ </child> </object> </child> + <child> + <object class="GtkFrame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="box_vpn"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + + <!-- "Not set up" row --> + <child> + <object class="GtkListBox" id="empty_listbox"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="selection_mode">none</property> + <child> + <object class="GtkListBoxRow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="activatable">False</property> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="margin">16</property> + <property name="xalign">0</property> + <property name="ellipsize">end</property> + <property name="label" translatable="yes">Not set up</property> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </child> </object> </child> <child> |