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

Mike Massonnet mmassonnet at xfce.org
Fri Feb 8 12:35:27 CET 2008


Author: mmassonnet
Date: 2008-02-08 11:35:27 +0000 (Fri, 08 Feb 2008)
New Revision: 3935

Modified:
   xfmpc/trunk/src/mpdclient.c
   xfmpc/trunk/src/mpdclient.h
   xfmpc/trunk/src/playlist.c
   xfmpc/trunk/src/playlist.h
Log:
Display the playlist in the tree view
* src/mpdclient.c,
  src/mpdclient.h:
  - New signal playlist-changed
  - New function xfmpc_mpdclient_playlist_read, which returns every entry in
  the current playlist once at a time, should be used inside a loop
* src/playlist.c:
  - Insert a column "position of the song" in the tree model
  - Connect to signal playlist-changed
  - xfmpc_playlist_init(): Ellipsize + expand "artist - title"


Modified: xfmpc/trunk/src/mpdclient.c
===================================================================
--- xfmpc/trunk/src/mpdclient.c	2008-02-08 11:35:20 UTC (rev 3934)
+++ xfmpc/trunk/src/mpdclient.c	2008-02-08 11:35:27 UTC (rev 3935)
@@ -40,6 +40,7 @@
   SIG_TIME_CHANGED,
   SIG_VOLUME_CHANGED,
   SIG_STOPPED,
+  SIG_PLAYLIST_CHANGED,
   LAST_SIGNAL
 };
 
@@ -68,6 +69,7 @@
   void (*time_changed)      (XfmpcMpdclient *mpdclient, gint time, gint total_time, gpointer user_data);
   void (*volume_changed)    (XfmpcMpdclient *mpdclient, gint volume, gpointer user_data);
   void (*stopped)           (XfmpcMpdclient *mpdclient, gpointer user_data);
+  void (*playlist_changed)  (XfmpcMpdclient *mpdclient, gpointer user_data);
 };
 
 struct _XfmpcMpdclient
@@ -150,7 +152,7 @@
   xfmpc_mpdclient_signals[SIG_TIME_CHANGED] =
     g_signal_new ("time-changed", G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
-                  G_STRUCT_OFFSET (XfmpcMpdclientClass, pp_changed),
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, time_changed),
                   NULL, NULL,
                   g_cclosure_marshal_VOID__UINT_POINTER,
                   G_TYPE_NONE, 2,
@@ -160,7 +162,7 @@
   xfmpc_mpdclient_signals[SIG_VOLUME_CHANGED] =
     g_signal_new ("volume-changed", G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
-                  G_STRUCT_OFFSET (XfmpcMpdclientClass, pp_changed),
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, volume_changed),
                   NULL, NULL,
                   g_cclosure_marshal_VOID__INT,
                   G_TYPE_NONE, 1,
@@ -169,10 +171,18 @@
   xfmpc_mpdclient_signals[SIG_STOPPED] =
     g_signal_new ("stopped", G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
-                  G_STRUCT_OFFSET (XfmpcMpdclientClass, pp_changed),
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, stopped),
                   NULL, NULL,
                   g_cclosure_marshal_VOID__VOID,
                   G_TYPE_NONE, 0);
+
+  xfmpc_mpdclient_signals[SIG_PLAYLIST_CHANGED] =
+    g_signal_new ("playlist-changed", G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, playlist_changed),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
 }
 
 static void
@@ -470,6 +480,39 @@
   mpd_status_update (priv->mi);
 }
 
+gboolean
+xfmpc_mpdclient_playlist_read (XfmpcMpdclient *mpdclient,
+                               gint *pos,
+                               gchar **song,
+                               gchar **length)
+{
+  static MpdData       *data = NULL;
+  XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
+
+  if (NULL == data)
+    data = mpd_playlist_get_changes (priv->mi, -1);
+  else
+    data = mpd_data_get_next (data);
+
+  if (NULL != data)
+    {
+      if (NULL != data->song->title)
+        {
+          if (data->song->artist)
+            *song = g_strdup_printf ("%s - %s", data->song->artist, data->song->title);
+          else
+            *song = g_strdup (data->song->title);
+        }
+      else
+        *song = g_path_get_basename (data->song->file);
+
+      *length = g_strdup_printf ("%d:%02d", data->song->time / 60, data->song->time % 60);
+      *pos = data->song->id;
+    }
+
+  return NULL != data;
+}
+
 static void
 cb_xfmpc_mpdclient_status_changed (MpdObj *mi,
                                    ChangedStatusType what,
@@ -499,5 +542,8 @@
     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");
 }
 

Modified: xfmpc/trunk/src/mpdclient.h
===================================================================
--- xfmpc/trunk/src/mpdclient.h	2008-02-08 11:35:20 UTC (rev 3934)
+++ xfmpc/trunk/src/mpdclient.h	2008-02-08 11:35:27 UTC (rev 3935)
@@ -81,6 +81,11 @@
 
 void                    xfmpc_mpdclient_update_status           (XfmpcMpdclient *mpdclient);
 
+gboolean                xfmpc_mpdclient_playlist_read           (XfmpcMpdclient *mpdclient,
+                                                                 gint *pos,
+                                                                 gchar **song,
+                                                                 gchar **length);
+
 G_END_DECLS
 
 #endif

Modified: xfmpc/trunk/src/playlist.c
===================================================================
--- xfmpc/trunk/src/playlist.c	2008-02-08 11:35:20 UTC (rev 3934)
+++ xfmpc/trunk/src/playlist.c	2008-02-08 11:35:27 UTC (rev 3935)
@@ -24,6 +24,7 @@
 #include <libxfce4util/libxfce4util.h>
 
 #include "playlist.h"
+#include "mpdclient.h"
 
 #define BORDER 4
 
@@ -37,11 +38,15 @@
 static void             xfmpc_playlist_dispose                  (GObject *object);
 static void             xfmpc_playlist_finalize                 (GObject *object);
 
+static void             cb_playlist_changed                     (XfmpcPlaylist *playlist);
 
 
+
+
 /* List store identifiers */
 enum
 {
+  COLUMN_POS,
   COLUMN_SONG,
   COLUMN_LENGTH,
   N_COLUMNS,
@@ -58,6 +63,7 @@
 {
   GtkVBox               parent;
   XfmpcPlaylistPrivate *priv;
+  XfmpcMpdclient       *mpdclient;
 };
 
 struct _XfmpcPlaylistPrivate
@@ -119,22 +125,35 @@
 {
   XfmpcPlaylistPrivate *priv = XFMPC_PLAYLIST_GET_PRIVATE (playlist);
 
+  playlist->mpdclient = xfmpc_mpdclient_new ();
+
+  /* Tree model */
   priv->store = gtk_list_store_new (N_COLUMNS,
-                                         G_TYPE_STRING,
-                                         G_TYPE_STRING);
+                                    G_TYPE_INT,
+                                    G_TYPE_STRING,
+                                    G_TYPE_STRING);
 
+  /* Tree view */
   priv->treeview = gtk_tree_view_new ();
   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);
 
+  /* Column "artist - title" */
   GtkCellRenderer *cell = gtk_cell_renderer_text_new ();
-  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (priv->treeview),
-                                               -1, "Song", cell,
-                                               "text", COLUMN_SONG,
-                                               NULL);
+  g_object_set (G_OBJECT (cell),
+                "ellipsize", PANGO_ELLIPSIZE_END,
+                NULL);
+  GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ("Song", cell,
+                                                                        "text", COLUMN_SONG,
+                                                                        NULL);
+  g_object_set (G_OBJECT (column),
+                "expand", TRUE,
+                NULL);
+  gtk_tree_view_append_column (GTK_TREE_VIEW (priv->treeview), column);
 
+  /* Column "length" */
   cell = gtk_cell_renderer_text_new ();
   g_object_set (G_OBJECT (cell), "xalign", 1.0, NULL);
   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (priv->treeview),
@@ -142,18 +161,19 @@
                                                "text", COLUMN_LENGTH,
                                                NULL);
 
-#if 1
-  xfmpc_playlist_append (playlist, "Hello - World!", "0:00");
-  xfmpc_playlist_append (playlist, "Good bye - World!", "0:00");
-#endif
-
+  /* 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 */
   gtk_container_add (GTK_CONTAINER (scrolled), priv->treeview);
   gtk_box_pack_start (GTK_BOX (playlist), scrolled, TRUE, TRUE, 0);
+
+  /* Signals */
+  g_signal_connect_swapped (playlist->mpdclient, "playlist-changed",
+                            G_CALLBACK (cb_playlist_changed), playlist);
 }
 
 static void
@@ -165,6 +185,8 @@
 static void
 xfmpc_playlist_finalize (GObject *object)
 {
+  XfmpcPlaylist *playlist = XFMPC_PLAYLIST (object);
+  g_object_unref (G_OBJECT (playlist->mpdclient));
   (*G_OBJECT_CLASS (parent_class)->finalize) (object);
 }
 
@@ -178,6 +200,7 @@
 
 void
 xfmpc_playlist_append (XfmpcPlaylist *playlist,
+                       gint pos,
                        gchar *song,
                        gchar *length)
 {
@@ -186,6 +209,7 @@
 
   gtk_list_store_append (priv->store, &iter);
   gtk_list_store_set (priv->store, &iter,
+                      COLUMN_POS, pos,
                       COLUMN_SONG, song,
                       COLUMN_LENGTH, length,
                       -1);
@@ -199,3 +223,19 @@
   gtk_list_store_clear (priv->store);
 }
 
+static void
+cb_playlist_changed (XfmpcPlaylist *playlist)
+{
+  gchar                *song;
+  gchar                *length;
+  gint                  pos;
+
+  xfmpc_playlist_clear (playlist);
+  while (xfmpc_mpdclient_playlist_read (playlist->mpdclient, &pos, &song, &length))
+    {
+      xfmpc_playlist_append (playlist, pos, song, length);
+      g_free (song);
+      g_free (length);
+    }
+}
+

Modified: xfmpc/trunk/src/playlist.h
===================================================================
--- xfmpc/trunk/src/playlist.h	2008-02-08 11:35:20 UTC (rev 3934)
+++ xfmpc/trunk/src/playlist.h	2008-02-08 11:35:27 UTC (rev 3935)
@@ -40,6 +40,7 @@
 GtkWidget *             xfmpc_playlist_new                      ();
 
 void                    xfmpc_playlist_append                   (XfmpcPlaylist *playlist,
+                                                                 gint pos,
                                                                  gchar *song,
                                                                  gchar *length);
 void                    xfmpc_playlist_clear                    (XfmpcPlaylist *playlist);




More information about the Goodies-commits mailing list