[Goodies-commits] r3988 - xfmpc/trunk/src

Mike Massonnet mmassonnet at xfce.org
Sat Feb 23 16:16:05 CET 2008


Author: mmassonnet
Date: 2008-02-23 15:16:05 +0000 (Sat, 23 Feb 2008)
New Revision: 3988

Modified:
   xfmpc/trunk/src/mpdclient.c
   xfmpc/trunk/src/playlist.c
Log:
Activate item within filter entry with enter
* src/playlist.c:
  - Add a private data "current" to represent the current id in the treeview
  - Add gtk entry signal "activate" on filter entry to start the selected song
  - Add gtk entry signal "changed" to filter the model
* src/mpdclient.c(xfmpc_playlist_select_row):
  - Verify that the model isn't empty
* src/playlist.c(cb_filter_entry_key_released):
  - Move refilter call outside in new callback cb_filter_entry_changed
  - Re-select current song on Escape key event


Modified: xfmpc/trunk/src/mpdclient.c
===================================================================
--- xfmpc/trunk/src/mpdclient.c	2008-02-23 15:15:59 UTC (rev 3987)
+++ xfmpc/trunk/src/mpdclient.c	2008-02-23 15:16:05 UTC (rev 3988)
@@ -538,6 +538,9 @@
   XfmpcMpdclient *mpdclient = XFMPC_MPDCLIENT (user_data);
   g_return_if_fail (G_LIKELY (NULL != user_data));
 
+  if (what & MPD_CST_PLAYLIST)
+    g_signal_emit_by_name (mpdclient, "playlist-changed");
+
   if (what & MPD_CST_SONGID)
     g_signal_emit_by_name (mpdclient, "song-changed");
 
@@ -559,9 +562,6 @@
     g_signal_emit_by_name (mpdclient, "time-changed",
                            xfmpc_mpdclient_get_time (mpdclient),
                            xfmpc_mpdclient_get_total_time (mpdclient));
-
-  if (what & MPD_CST_PLAYLIST)
-    g_signal_emit_by_name (mpdclient, "playlist-changed");
 }
 
 gboolean

Modified: xfmpc/trunk/src/playlist.c
===================================================================
--- xfmpc/trunk/src/playlist.c	2008-02-23 15:15:59 UTC (rev 3987)
+++ xfmpc/trunk/src/playlist.c	2008-02-23 15:16:05 UTC (rev 3988)
@@ -47,8 +47,12 @@
                                                                  GtkTreeViewColumn *column);
 static gboolean         cb_key_released                         (XfmpcPlaylist *playlist,
                                                                  GdkEventKey *event);
+static void             cb_filter_entry_activated               (XfmpcPlaylist *playlist);
+
 static gboolean         cb_filter_entry_key_released            (XfmpcPlaylist *playlist,
                                                                  GdkEventKey *event);
+static void             cb_filter_entry_changed                 (XfmpcPlaylist *playlist);
+
 static gboolean         visible_func_filter_tree                (GtkTreeModel *filter,
                                                                  GtkTreeIter *iter,
                                                                  XfmpcPlaylist *playlist);
@@ -85,9 +89,9 @@
   GtkWidget            *treeview;
   GtkTreeModelFilter   *filter;
   GtkListStore         *store;
-
   GtkWidget            *filter_entry;
 
+  gint                  current;
   gboolean              autocenter;
 };
 
@@ -151,14 +155,14 @@
                 "playlist-autocenter", &priv->autocenter,
                 NULL);
 
-  /* Tree model */
+  /* === Tree model === */
   priv->store = gtk_list_store_new (N_COLUMNS,
                                     G_TYPE_INT,
                                     G_TYPE_STRING,
                                     G_TYPE_STRING,
                                     G_TYPE_INT);
 
-  /* Filter */
+  /* === 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);
@@ -167,7 +171,7 @@
                                           playlist,
                                           NULL);
 
-  /* Tree view */
+  /* === 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);
@@ -202,28 +206,34 @@
                                                "weight", COLUMN_WEIGHT,
                                                NULL);
 
-  /* Scrolled window */
+  /* === Scrolled window === */
   GtkWidget *scrolled = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
                                   GTK_POLICY_AUTOMATIC,
                                   GTK_POLICY_ALWAYS);
 
-  /* Containers */
+  /* === 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 */
+  /* === Signals === */
+  g_signal_connect_swapped (playlist->mpdclient, "song-changed",
+                            G_CALLBACK (cb_playlist_changed), playlist);
+  g_signal_connect_swapped (playlist->mpdclient, "playlist-changed",
+                            G_CALLBACK (cb_playlist_changed), playlist);
+  /* Tree view */
+  g_signal_connect_swapped (priv->treeview, "row-activated",
+                            G_CALLBACK (cb_row_activated), playlist);
   g_signal_connect_swapped (priv->treeview, "key-release-event",
                             G_CALLBACK (cb_key_released), playlist);
+  /* Filter */
+  g_signal_connect_swapped (priv->filter_entry, "activate",
+                            G_CALLBACK (cb_filter_entry_activated), 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",
-                            G_CALLBACK (cb_playlist_changed), playlist);
-  g_signal_connect_swapped (playlist->mpdclient, "playlist-changed",
-                            G_CALLBACK (cb_playlist_changed), playlist);
+  g_signal_connect_swapped (priv->filter_entry, "changed",
+                            G_CALLBACK (cb_filter_entry_changed), playlist);
 }
 
 static void
@@ -281,6 +291,9 @@
 {
   XfmpcPlaylistPrivate *priv = XFMPC_PLAYLIST_GET_PRIVATE (playlist);
 
+  if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->filter), NULL) == 0)
+    return;
+
   GtkTreePath *path = gtk_tree_path_new_from_indices (i, -1);
   gtk_tree_view_set_cursor (GTK_TREE_VIEW (priv->treeview), path, NULL, FALSE);
   gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (priv->treeview), path, NULL, TRUE, 0.42, 0);
@@ -317,6 +330,7 @@
 }
 
 
+
 static void
 cb_playlist_changed (XfmpcPlaylist *playlist)
 {
@@ -338,9 +352,10 @@
       g_free (length);
     }
 
+  priv->current = i;
   /* 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);
+  if (gtk_entry_get_text (GTK_ENTRY (priv->filter_entry))[0] == '\0' && i > 0 && priv->autocenter)
+    xfmpc_playlist_select_row (playlist, priv->current);
 }
 
 static void
@@ -381,6 +396,24 @@
   return TRUE;
 }
 
+static void
+cb_filter_entry_activated (XfmpcPlaylist *playlist)
+{
+  XfmpcPlaylistPrivate *priv = XFMPC_PLAYLIST_GET_PRIVATE (playlist);
+  GtkTreeModel         *model = GTK_TREE_MODEL (priv->filter);
+  GList                *list;
+
+  list = gtk_tree_selection_get_selected_rows (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview)), &model);
+  if (G_LIKELY (NULL != list))
+    {
+      gtk_tree_view_row_activated (GTK_TREE_VIEW (priv->treeview), list->data, NULL);
+      gtk_entry_set_text (GTK_ENTRY (priv->filter_entry), "");
+      xfmpc_playlist_select_row (playlist, priv->current);
+      g_list_foreach (list, (GFunc)gtk_tree_path_free, NULL);
+      g_list_free (list);
+    }
+}
+
 static gboolean
 cb_filter_entry_key_released (XfmpcPlaylist *playlist,
                               GdkEventKey *event)
@@ -391,8 +424,21 @@
     return FALSE;
 
   if (event->keyval == GDK_Escape)
-    gtk_entry_set_text (GTK_ENTRY (priv->filter_entry), "");
+    {
+      gtk_entry_set_text (GTK_ENTRY (priv->filter_entry), "");
+      xfmpc_playlist_select_row (playlist, priv->current);
+    }
+  else if (gtk_entry_get_text (GTK_ENTRY (priv->filter_entry))[0] != '\0')
+    xfmpc_playlist_select_row (playlist, 0);
 
+  return TRUE;
+}
+
+static void
+cb_filter_entry_changed (XfmpcPlaylist *playlist)
+{
+  XfmpcPlaylistPrivate *priv = XFMPC_PLAYLIST_GET_PRIVATE (playlist);
+
   gtk_tree_model_filter_refilter (priv->filter);
 }
 




More information about the Goodies-commits mailing list