[Goodies-commits] r3987 - xfmpc/trunk/src
Mike Massonnet
mmassonnet at xfce.org
Sat Feb 23 16:15:59 CET 2008
Author: mmassonnet
Date: 2008-02-23 15:15:59 +0000 (Sat, 23 Feb 2008)
New Revision: 3987
Modified:
xfmpc/trunk/src/playlist.c
Log:
New entry to filter the treeview
* src/playlist.c(xfmpc_playlist_init):
- Add a GtkTreeModelFilter between the model and the treeview
- Add a GtkEntry
* src/playlist.c(cb_filter_entry_key_released),
src/playlist.c(visible_func_filter_tree):
- New functions
- (cb_filter_entry_key_released): Callback for the new GtkEntry on changes
- (visible_func_filter_tree): Visible function for the filter
* src/playlist.c(cb_playlist_changed):
- Check if the new GtkEntry is empty to enable the autocenter
* src/playlist.c(cb_row_activated):
- Activate items from the new filter model
Modified: xfmpc/trunk/src/playlist.c
===================================================================
--- xfmpc/trunk/src/playlist.c 2008-02-23 15:15:54 UTC (rev 3986)
+++ xfmpc/trunk/src/playlist.c 2008-02-23 15:15:59 UTC (rev 3987)
@@ -47,6 +47,11 @@
GtkTreeViewColumn *column);
static gboolean cb_key_released (XfmpcPlaylist *playlist,
GdkEventKey *event);
+static gboolean cb_filter_entry_key_released (XfmpcPlaylist *playlist,
+ GdkEventKey *event);
+static gboolean visible_func_filter_tree (GtkTreeModel *filter,
+ GtkTreeIter *iter,
+ XfmpcPlaylist *playlist);
@@ -78,7 +83,11 @@
struct _XfmpcPlaylistPrivate
{
GtkWidget *treeview;
+ GtkTreeModelFilter *filter;
GtkListStore *store;
+
+ GtkWidget *filter_entry;
+
gboolean autocenter;
};
@@ -149,13 +158,23 @@
G_TYPE_STRING,
G_TYPE_INT);
+ /* Filter */
+ priv->filter_entry = gtk_entry_new ();
+ priv->filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (priv->store), NULL));
+ g_object_unref (priv->store);
+ gtk_tree_model_filter_set_visible_func (priv->filter,
+ (GtkTreeModelFilterVisibleFunc)visible_func_filter_tree,
+ playlist,
+ NULL);
+
/* Tree view */
priv->treeview = gtk_tree_view_new ();
gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview)), GTK_SELECTION_MULTIPLE);
+ gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->treeview), FALSE);
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->treeview), FALSE);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (priv->treeview), TRUE);
- gtk_tree_view_set_model (GTK_TREE_VIEW (priv->treeview), GTK_TREE_MODEL (priv->store));
- g_object_unref (priv->store);
+ gtk_tree_view_set_model (GTK_TREE_VIEW (priv->treeview), GTK_TREE_MODEL (priv->filter));
+ g_object_unref (priv->filter);
/* Column "artist - title" */
GtkCellRenderer *cell = gtk_cell_renderer_text_new ();
@@ -192,10 +211,13 @@
/* Containers */
gtk_container_add (GTK_CONTAINER (scrolled), priv->treeview);
gtk_box_pack_start (GTK_BOX (playlist), scrolled, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (playlist), priv->filter_entry, FALSE, FALSE, 0);
/* Signals */
g_signal_connect_swapped (priv->treeview, "key-release-event",
G_CALLBACK (cb_key_released), playlist);
+ g_signal_connect_swapped (priv->filter_entry, "key-release-event",
+ G_CALLBACK (cb_filter_entry_key_released), playlist);
g_signal_connect_swapped (priv->treeview, "row-activated",
G_CALLBACK (cb_row_activated), playlist);
g_signal_connect_swapped (playlist->mpdclient, "song-changed",
@@ -316,7 +338,8 @@
g_free (length);
}
- if (priv->autocenter)
+ /* don't autocenter if a filter is typped in */
+ if (gtk_entry_get_text (GTK_ENTRY (priv->filter_entry))[0] == '\0' && priv->autocenter)
xfmpc_playlist_select_row (playlist, i);
}
@@ -329,10 +352,10 @@
GtkTreeIter iter;
gint id;
- if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->store), &iter, path))
+ if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->filter), &iter, path))
return;
- gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter,
+ gtk_tree_model_get (GTK_TREE_MODEL (priv->filter), &iter,
COLUMN_ID, &id,
-1);
xfmpc_mpdclient_set_id (playlist->mpdclient, id);
@@ -358,3 +381,53 @@
return TRUE;
}
+static gboolean
+cb_filter_entry_key_released (XfmpcPlaylist *playlist,
+ GdkEventKey *event)
+{
+ XfmpcPlaylistPrivate *priv = XFMPC_PLAYLIST_GET_PRIVATE (playlist);
+
+ if (event->type != GDK_KEY_RELEASE)
+ return FALSE;
+
+ if (event->keyval == GDK_Escape)
+ gtk_entry_set_text (GTK_ENTRY (priv->filter_entry), "");
+
+ gtk_tree_model_filter_refilter (priv->filter);
+}
+
+static gboolean
+visible_func_filter_tree (GtkTreeModel *filter,
+ GtkTreeIter *iter,
+ XfmpcPlaylist *playlist)
+{
+ XfmpcPlaylistPrivate *priv = XFMPC_PLAYLIST_GET_PRIVATE (playlist);
+ gchar *song, *song_tmp;
+ gchar *search;
+ gboolean result = TRUE;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (filter), iter,
+ COLUMN_SONG, &song,
+ -1);
+ if (G_UNLIKELY (NULL == song))
+ return TRUE;
+
+ search = g_utf8_casefold (gtk_entry_get_text (GTK_ENTRY (priv->filter_entry)), -1);
+ g_return_val_if_fail (G_LIKELY (NULL != search), TRUE);
+
+ if (G_UNLIKELY (search[0] != '\0'))
+ {
+ song_tmp = g_utf8_casefold (song, -1);
+ g_free (song);
+ song = song_tmp;
+
+ if (NULL == g_strrstr (song, search))
+ result = FALSE;
+ }
+
+ g_free (song);
+ g_free (search);
+
+ return result;
+}
+
More information about the Goodies-commits
mailing list