diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2017-07-03 12:12:45 +0200 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2017-07-11 17:51:04 +0200 |
commit | b0036e5c20cf1367fa528a0f6451a10a47e08f07 (patch) | |
tree | e7b28ffadde3a754c3b15429ef6bd4f3badb1243 | |
parent | 50996886f4a60e9d99a1187e0f300e20f52a02aa (diff) | |
download | network-manager-applet-b0036e5c20cf1367fa528a0f6451a10a47e08f07.tar.gz |
editor: use custom search bar for filtering
We need our own search bar, because we also want to do filtering an
refilter on earch search entry change.
-rw-r--r-- | src/connection-editor/nm-connection-list.c | 58 | ||||
-rw-r--r-- | src/connection-editor/nm-connection-list.ui | 137 |
2 files changed, 138 insertions, 57 deletions
diff --git a/src/connection-editor/nm-connection-list.c b/src/connection-editor/nm-connection-list.c index 7caa5153..ce4d0f27 100644 --- a/src/connection-editor/nm-connection-list.c +++ b/src/connection-editor/nm-connection-list.c @@ -50,6 +50,8 @@ struct _NMConnectionListPrivate { GtkWidget *connection_del; GtkWidget *connection_edit; GtkTreeView *connection_list; + GtkSearchBar *search_bar; + GtkEntry *search_entry; GtkTreeModel *model; GtkTreeModelFilter *filter; GtkTreeSortable *sortable; @@ -459,14 +461,45 @@ list_close_cb (GtkDialog *dialog, gpointer user_data) } static gboolean -key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data) +key_press_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data) { - if (event->keyval == GDK_KEY_Escape) { - gtk_window_close (GTK_WINDOW (user_data)); - return TRUE; + NMConnectionList *list = user_data; + NMConnectionListPrivate *priv = NM_CONNECTION_LIST_GET_PRIVATE (list); + GdkEventKey *key_event = (GdkEventKey *) event; + + if (gtk_search_bar_handle_event (priv->search_bar, event) == GDK_EVENT_STOP) + return GDK_EVENT_STOP; + + if (key_event->keyval == GDK_KEY_Escape) { + if (gtk_search_bar_get_search_mode (priv->search_bar)) + gtk_search_bar_set_search_mode (priv->search_bar, FALSE); + else + gtk_window_close (GTK_WINDOW (user_data)); + return GDK_EVENT_STOP; } - return FALSE; + return GDK_EVENT_PROPAGATE; +} + +static gboolean +start_search (GtkTreeView *treeview, gpointer user_data) +{ + NMConnectionList *list = user_data; + NMConnectionListPrivate *priv = NM_CONNECTION_LIST_GET_PRIVATE (list); + + gtk_search_bar_set_search_mode (priv->search_bar, TRUE); + + return TRUE; +} + +static void +search_changed (GtkSearchEntry *entry, gpointer user_data) +{ + NMConnectionList *list = user_data; + NMConnectionListPrivate *priv = NM_CONNECTION_LIST_GET_PRIVATE (list); + + gtk_tree_model_filter_refilter (priv->filter); + gtk_tree_view_expand_all (priv->connection_list); } static void @@ -520,6 +553,8 @@ nm_connection_list_class_init (NMConnectionListClass *klass) gtk_widget_class_bind_template_child_private (widget_class, NMConnectionList, connection_add); gtk_widget_class_bind_template_child_private (widget_class, NMConnectionList, connection_del); gtk_widget_class_bind_template_child_private (widget_class, NMConnectionList, connection_edit); + gtk_widget_class_bind_template_child_private (widget_class, NMConnectionList, search_bar); + gtk_widget_class_bind_template_child_private (widget_class, NMConnectionList, search_entry); gtk_widget_class_bind_template_callback (widget_class, add_clicked); gtk_widget_class_bind_template_callback (widget_class, do_edit); @@ -527,6 +562,8 @@ nm_connection_list_class_init (NMConnectionListClass *klass) gtk_widget_class_bind_template_callback (widget_class, list_close_cb); gtk_widget_class_bind_template_callback (widget_class, selection_changed_cb); gtk_widget_class_bind_template_callback (widget_class, key_press_cb); + gtk_widget_class_bind_template_callback (widget_class, start_search); + gtk_widget_class_bind_template_callback (widget_class, search_changed); } static void @@ -615,13 +652,21 @@ tree_model_visible_func (GtkTreeModel *model, NMSettingConnection *s_con; const char *master; const char *slave_type; + gs_free char *id = NULL; - gtk_tree_model_get (model, iter, COL_CONNECTION, &connection, -1); + gtk_tree_model_get (model, iter, + COL_ID, &id, + COL_CONNECTION, &connection, + -1); if (!connection) { /* Top-level type nodes are visible iff they have children */ return gtk_tree_model_iter_has_child (model, iter); } + if ( gtk_search_bar_get_search_mode (priv->search_bar) + && strcasestr (id, gtk_entry_get_text (GTK_ENTRY (priv->search_entry))) == NULL) + return FALSE; + /* A connection node is visible unless it is a slave to a known * bond or team or bridge. */ @@ -706,6 +751,7 @@ initialize_treeview (NMConnectionList *self) gtk_tree_view_set_model (priv->connection_list, GTK_TREE_MODEL (priv->sortable)); gtk_tree_view_set_search_equal_func (priv->connection_list, connection_list_equal, NULL, NULL); + gtk_tree_view_set_search_entry (priv->connection_list, priv->search_entry); /* Name column */ renderer = gtk_cell_renderer_text_new (); diff --git a/src/connection-editor/nm-connection-list.ui b/src/connection-editor/nm-connection-list.ui index e3e48e80..02bcb5f5 100644 --- a/src/connection-editor/nm-connection-list.ui +++ b/src/connection-editor/nm-connection-list.ui @@ -9,94 +9,129 @@ <property name="default_width">600</property> <property name="default_height">400</property> <property name="gravity">north-east</property> - <signal name="key-press-event" handler="key_press_cb" swapped="no"/> <signal name="destroy" handler="list_close_cb" swapped="no"/> + <signal name="key-press-event" handler="key_press_cb" swapped="no"/> <child> - <object class="GtkBox" id="connection_box"> + <object class="GtkBox" id="box"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="border_width">6</property> <property name="orientation">vertical</property> <child> - <object class="GtkScrolledWindow" id="scrolledwindow1"> + <object class="GtkSearchBar" id="search_bar"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">never</property> - <property name="shadow_type">in</property> + <property name="can_focus">False</property> <child> - <object class="GtkTreeView" id="connection_list"> + <object class="GtkSearchEntry" id="search_entry"> <property name="visible">True</property> <property name="can_focus">True</property> - <signal name="row-activated" handler="do_edit" swapped="yes"/> - <child internal-child="selection"> - <object class="GtkTreeSelection"> - <signal name="changed" handler="selection_changed_cb" swapped="no"/> - </object> - </child> + <property name="primary_icon_name">edit-find-symbolic</property> + <property name="primary_icon_activatable">False</property> + <property name="primary_icon_sensitive">False</property> + <signal name="activate" handler="do_edit" swapped="yes"/> + <signal name="search-changed" handler="search_changed" swapped="no"/> </object> </child> </object> <packing> - <property name="expand">True</property> + <property name="expand">False</property> <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> - <object class="GtkToolbar" id="connection_toolbar"> + <object class="GtkBox" id="connection_box"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="toolbar_style">icons</property> - <property name="icon_size">2</property> - <child> - <object class="GtkToolButton" id="connection_add"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes">Add a new connection</property> - <property name="label" translatable="yes">_Add</property> - <property name="use_underline">True</property> - <property name="icon_name">list-add-symbolic</property> - <signal name="clicked" handler="add_clicked" swapped="no"/> - </object> - <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> - </packing> - </child> + <property name="border_width">6</property> + <property name="orientation">vertical</property> <child> - <object class="GtkToolButton" id="connection_del"> + <object class="GtkScrolledWindow" id="scrolledwindow1"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">_Delete</property> - <property name="use_underline">True</property> - <property name="icon_name">list-remove-symbolic</property> - <signal name="clicked" handler="delete_clicked" swapped="no"/> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="connection_list"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <signal name="row-activated" handler="do_edit" swapped="yes"/> + <signal name="start-interactive-search" handler="start_search" swapped="no"/> + <child internal-child="selection"> + <object class="GtkTreeSelection"> + <signal name="changed" handler="selection_changed_cb" swapped="no"/> + </object> + </child> + </object> + </child> </object> <packing> - <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> </packing> </child> <child> - <object class="GtkToolButton" id="connection_edit"> + <object class="GtkToolbar" id="connection_toolbar"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">_Edit</property> - <property name="use_underline">True</property> - <property name="icon_name">emblem-system-symbolic</property> - <signal name="clicked" handler="do_edit" swapped="yes"/> + <property name="toolbar_style">icons</property> + <property name="icon_size">2</property> + <child> + <object class="GtkToolButton" id="connection_add"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Add a new connection</property> + <property name="label" translatable="yes">_Add</property> + <property name="use_underline">True</property> + <property name="icon_name">list-add-symbolic</property> + <signal name="clicked" handler="add_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="connection_del"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">_Delete</property> + <property name="use_underline">True</property> + <property name="icon_name">list-remove-symbolic</property> + <signal name="clicked" handler="delete_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="connection_edit"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">_Edit</property> + <property name="use_underline">True</property> + <property name="icon_name">emblem-system-symbolic</property> + <signal name="clicked" handler="do_edit" swapped="yes"/> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <style> + <class name="inline-toolbar"/> + </style> </object> <packing> <property name="expand">False</property> - <property name="homogeneous">True</property> + <property name="fill">True</property> + <property name="position">2</property> </packing> </child> - <style> - <class name="inline-toolbar"/> - </style> </object> <packing> - <property name="expand">False</property> + <property name="expand">True</property> <property name="fill">True</property> <property name="position">1</property> </packing> |