summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Berg <bberg@redhat.com>2017-02-13 21:39:18 +0100
committerBenjamin Berg <bberg@redhat.com>2017-05-17 15:14:10 +0200
commit2c95c6a5d09d0c884631677e1631d912149355d6 (patch)
treef8e3025965013e9fafb634c7a0c8493a65ab4a49
parentf70ac1d863f34d03da26d886036a3b658cc8ccd1 (diff)
downloadgnome-control-center-2c95c6a5d09d0c884631677e1631d912149355d6.tar.gz
network: Include the connection title in the sort string
The list of networks is sorted by connection type. If a user has e.g. a lot of VPN connections, then the unsorted list is hard to browse. To fix this, include the title of the connection in the sort order and ensure the list is kept sorted when a title is changed. Reported-by: Oliver Haessler <oliver@redhat.com> https://bugzilla.gnome.org/show_bug.cgi?id=778685
-rw-r--r--panels/network/cc-network-panel.c59
-rw-r--r--panels/network/net-object.h2
-rw-r--r--panels/network/network.ui2
-rw-r--r--panels/network/panel-common.c20
-rw-r--r--panels/network/panel-common.h2
5 files changed, 62 insertions, 23 deletions
diff --git a/panels/network/cc-network-panel.c b/panels/network/cc-network-panel.c
index 74bdc845f..abc943e3a 100644
--- a/panels/network/cc-network-panel.c
+++ b/panels/network/cc-network-panel.c
@@ -80,7 +80,6 @@ struct _CcNetworkPanelPrivate
enum {
PANEL_DEVICES_COLUMN_ICON,
- PANEL_DEVICES_COLUMN_SORT,
PANEL_DEVICES_COLUMN_OBJECT,
PANEL_DEVICES_COLUMN_LAST
};
@@ -499,11 +498,48 @@ cc_network_panel_get_devices (CcNetworkPanel *panel)
return devices;
}
+static gint
+panel_net_object_get_sort_category (NetObject *net_object)
+{
+ if (NET_IS_DEVICE (net_object)) {
+ return panel_device_get_sort_category (net_device_get_nm_device (NET_DEVICE (net_object)));
+ } else if (NET_IS_PROXY (net_object)) {
+ return 9;
+ } else if (NET_IS_VPN (net_object)) {
+ return 5;
+ }
+
+ g_assert_not_reached ();
+}
+
+static gint
+panel_net_object_sort_func (GtkTreeModel *model, GtkTreeIter *a,
+ GtkTreeIter *b, void *data)
+{
+ g_autoptr(NetObject) obj_a = NULL;
+ g_autoptr(NetObject) obj_b = NULL;
+ gint cat_a, cat_b;
+
+ gtk_tree_model_get (model, a,
+ PANEL_DEVICES_COLUMN_OBJECT, &obj_a,
+ -1);
+ gtk_tree_model_get (model, b,
+ PANEL_DEVICES_COLUMN_OBJECT, &obj_b,
+ -1);
+
+ cat_a = panel_net_object_get_sort_category (obj_a);
+ cat_b = panel_net_object_get_sort_category (obj_b);
+
+ if (cat_a != cat_b)
+ return cat_a - cat_b;
+
+ return g_utf8_collate (net_object_get_title (obj_a), net_object_get_title (obj_b));
+}
+
static void
panel_net_object_notify_title_cb (NetObject *net_object, GParamSpec *pspec, CcNetworkPanel *panel)
{
GtkTreeIter iter;
- GtkTreePath *path;
GtkListStore *liststore;
if (!find_in_model_by_id (panel, net_object_get_id (net_object), &iter))
@@ -512,9 +548,12 @@ panel_net_object_notify_title_cb (NetObject *net_object, GParamSpec *pspec, CcNe
liststore = GTK_LIST_STORE (gtk_builder_get_object (panel->priv->builder,
"liststore_devices"));
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (liststore), &iter);
- gtk_tree_model_row_changed (GTK_TREE_MODEL (liststore), path, &iter);
- gtk_tree_path_free (path);
+ /* gtk_tree_model_row_changed would not cause the list store to resort.
+ * Instead set the object column to the current value.
+ * See https://bugzilla.gnome.org/show_bug.cgi?id=782737 */
+ gtk_list_store_set (liststore, &iter,
+ PANEL_DEVICES_COLUMN_OBJECT, net_object,
+ -1);
}
static void
@@ -795,7 +834,6 @@ panel_add_device (CcNetworkPanel *panel, NMDevice *device)
gtk_list_store_set (liststore_devices,
&iter,
PANEL_DEVICES_COLUMN_ICON, panel_device_to_icon_name (device, TRUE),
- PANEL_DEVICES_COLUMN_SORT, panel_device_to_sortable_string (device),
PANEL_DEVICES_COLUMN_OBJECT, net_device,
-1);
g_signal_connect (net_device, "notify::title",
@@ -892,11 +930,14 @@ panel_add_devices_columns (CcNetworkPanel *panel, GtkTreeView *treeview)
renderer,
get_object_title,
NULL, NULL);
- gtk_tree_view_column_set_sort_column_id (column, PANEL_DEVICES_COLUMN_SORT);
+ gtk_tree_view_column_set_sort_column_id (column, PANEL_DEVICES_COLUMN_OBJECT);
liststore_devices = GTK_LIST_STORE (gtk_builder_get_object (priv->builder,
"liststore_devices"));
+ gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (liststore_devices),
+ PANEL_DEVICES_COLUMN_OBJECT,
+ panel_net_object_sort_func, NULL, NULL);
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (liststore_devices),
- PANEL_DEVICES_COLUMN_SORT,
+ PANEL_DEVICES_COLUMN_OBJECT,
GTK_SORT_ASCENDING);
gtk_tree_view_append_column (treeview, column);
gtk_tree_view_column_set_expand (column, TRUE);
@@ -975,7 +1016,6 @@ panel_add_proxy_device (CcNetworkPanel *panel)
gtk_list_store_set (liststore_devices,
&iter,
PANEL_DEVICES_COLUMN_ICON, "preferences-system-network-symbolic",
- PANEL_DEVICES_COLUMN_SORT, "9",
PANEL_DEVICES_COLUMN_OBJECT, proxy,
-1);
@@ -1157,7 +1197,6 @@ panel_add_vpn_device (CcNetworkPanel *panel, NMConnection *connection)
gtk_list_store_set (liststore_devices,
&iter,
PANEL_DEVICES_COLUMN_ICON, "network-vpn-symbolic",
- PANEL_DEVICES_COLUMN_SORT, "5",
PANEL_DEVICES_COLUMN_OBJECT, net_vpn,
-1);
g_signal_connect (net_vpn, "notify::title",
diff --git a/panels/network/net-object.h b/panels/network/net-object.h
index e372f78f8..715236b13 100644
--- a/panels/network/net-object.h
+++ b/panels/network/net-object.h
@@ -41,6 +41,8 @@ typedef struct _NetObjectPrivate NetObjectPrivate;
typedef struct _NetObject NetObject;
typedef struct _NetObjectClass NetObjectClass;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (NetObject, g_object_unref)
+
struct _NetObject
{
GObject parent;
diff --git a/panels/network/network.ui b/panels/network/network.ui
index 8f3be26fa..e09276600 100644
--- a/panels/network/network.ui
+++ b/panels/network/network.ui
@@ -21,8 +21,6 @@
<columns>
<!-- column-name icon -->
<column type="gchararray"/>
- <!-- column-name sort -->
- <column type="gchararray"/>
<!-- column-name object -->
<column type="GObject"/>
</columns>
diff --git a/panels/network/panel-common.c b/panels/network/panel-common.c
index 087429033..058a20b30 100644
--- a/panels/network/panel-common.c
+++ b/panels/network/panel-common.c
@@ -73,38 +73,38 @@ panel_device_to_icon_name (NMDevice *device, gboolean symbolic)
}
/**
- * panel_device_to_sortable_string:
+ * panel_device_get_sort_category:
*
* Try to return order of approximate connection speed.
* But sort wifi first, since thats the common case.
**/
-const gchar *
-panel_device_to_sortable_string (NMDevice *device)
+gint
+panel_device_get_sort_category (NMDevice *device)
{
- const gchar *value = NULL;
+ gint value;
NMDeviceModemCapabilities caps;
switch (nm_device_get_device_type (device)) {
case NM_DEVICE_TYPE_ETHERNET:
- value = "2";
+ value = 2;
break;
case NM_DEVICE_TYPE_WIFI:
- value = "1";
+ value = 1;
break;
case NM_DEVICE_TYPE_MODEM:
caps = nm_device_modem_get_current_capabilities (NM_DEVICE_MODEM (device));
if ((caps & NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS) ||
(caps & NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO)) {
- value = "3";
+ value = 3;
}
break;
case NM_DEVICE_TYPE_BT:
- value = "4";
+ value = 4;
break;
case NM_DEVICE_TYPE_OLPC_MESH:
- value = "5";
+ value = 5;
break;
default:
- value = "6";
+ value = 6;
break;
}
return value;
diff --git a/panels/network/panel-common.h b/panels/network/panel-common.h
index 5953f3faf..8a87748c1 100644
--- a/panels/network/panel-common.h
+++ b/panels/network/panel-common.h
@@ -30,7 +30,7 @@ G_BEGIN_DECLS
const gchar *panel_device_to_icon_name (NMDevice *device,
gboolean symbolic);
-const gchar *panel_device_to_sortable_string (NMDevice *device);
+gint panel_device_get_sort_category (NMDevice *device);
const gchar *panel_ap_mode_to_localized_string (NM80211Mode mode);
const gchar *panel_vpn_state_to_localized_string (NMVpnConnectionState type);
void panel_set_device_status (GtkBuilder *builder,