[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