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

Mike Massonnet mmassonnet at xfce.org
Fri Mar 21 22:01:59 CET 2008


Author: mmassonnet
Date: 2008-03-21 21:01:59 +0000 (Fri, 21 Mar 2008)
New Revision: 4085

Added:
   xfmpc/trunk/src/dbbrowser.c
   xfmpc/trunk/src/dbbrowser.h
Modified:
   xfmpc/trunk/src/Makefile.am
   xfmpc/trunk/src/extended-interface.c
   xfmpc/trunk/src/mpdclient.c
   xfmpc/trunk/src/mpdclient.h
   xfmpc/trunk/src/preferences.c
Log:
Add a database browser
* src/dbbrowser.c, src/dbbrowser.h,
  src/Makefile.am:
  - Import initial source files, and add them to Makefile.am
  - Current features: browsing, activate row to open a directory or add a song
* src/extended-interface.c:
  - Remove the "Hello World" widgets from the extended interface and add the
  new XfmpcDbbrowser
* src/mpdclient.c, src/mpdclient.h:
  - New functions _queue_add to add songs to the playlist
  - New functions _database_read that returns all the files from a directory
* src/preferences.c:
  - New preference for XfmpcDbbrowser to remember the last working directory


Modified: xfmpc/trunk/src/Makefile.am
===================================================================
--- xfmpc/trunk/src/Makefile.am	2008-03-21 21:01:51 UTC (rev 4084)
+++ xfmpc/trunk/src/Makefile.am	2008-03-21 21:01:59 UTC (rev 4085)
@@ -10,6 +10,8 @@
 	extended-interface.h						\
 	playlist.c							\
 	playlist.h							\
+	dbbrowser.c							\
+	dbbrowser.h							\
 	preferences.c							\
 	preferences.h							\
 	mpdclient.c							\

Added: xfmpc/trunk/src/dbbrowser.c
===================================================================
--- xfmpc/trunk/src/dbbrowser.c	                        (rev 0)
+++ xfmpc/trunk/src/dbbrowser.c	2008-03-21 21:01:59 UTC (rev 4085)
@@ -0,0 +1,350 @@
+/*
+ *  Copyright (c) 2008 Mike Massonnet <mmassonnet at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <libxfce4util/libxfce4util.h>
+
+#include "dbbrowser.h"
+#include "preferences.h"
+#include "mpdclient.h"
+
+#define BORDER 4
+
+#define XFMPC_DBBROWSER_GET_PRIVATE(o) \
+    (G_TYPE_INSTANCE_GET_PRIVATE ((o), XFMPC_TYPE_DBBROWSER, XfmpcDbbrowserPrivate))
+
+
+
+static void             xfmpc_dbbrowser_class_init             (XfmpcDbbrowserClass *klass);
+static void             xfmpc_dbbrowser_init                   (XfmpcDbbrowser *dbbrowser);
+static void             xfmpc_dbbrowser_dispose                (GObject *object);
+static void             xfmpc_dbbrowser_finalize               (GObject *object);
+
+static void             cb_row_activated                       (XfmpcDbbrowser *dbbrowser,
+                                                                GtkTreePath *path,
+                                                                GtkTreeViewColumn *column);
+
+
+
+/* List store identifiers */
+enum
+{
+  COLUMN_ID,
+  COLUMN_PIXBUF,
+  COLUMN_FILENAME,
+  COLUMN_BASENAME,
+  COLUMN_IS_DIR,
+  N_COLUMNS,
+};
+
+
+
+struct _XfmpcDbbrowserClass
+{
+  GtkVBoxClass              parent_class;
+};
+
+struct _XfmpcDbbrowser
+{
+  GtkVBox                   parent;
+  XfmpcDbbrowserPrivate    *priv;
+  XfmpcPreferences         *preferences;
+  XfmpcMpdclient           *mpdclient;
+};
+
+struct _XfmpcDbbrowserPrivate
+{
+  GtkWidget                *treeview;
+  GtkListStore             *store;
+  GtkWidget                *search_entry;
+
+  gchar                    *wdir;
+};
+
+
+
+static GObjectClass *parent_class = NULL;
+
+
+
+GType
+xfmpc_dbbrowser_get_type ()
+{
+  static GType xfmpc_dbbrowser_type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (xfmpc_dbbrowser_type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo xfmpc_dbbrowser_info =
+        {
+          sizeof (XfmpcDbbrowserClass),
+          (GBaseInitFunc) NULL,
+          (GBaseFinalizeFunc) NULL,
+          (GClassInitFunc) xfmpc_dbbrowser_class_init,
+          (GClassFinalizeFunc) NULL,
+          NULL,
+          sizeof (XfmpcDbbrowser),
+          0,
+          (GInstanceInitFunc) xfmpc_dbbrowser_init,
+          NULL
+        };
+      xfmpc_dbbrowser_type = g_type_register_static (GTK_TYPE_VBOX, "XfmpcDbbrowser", &xfmpc_dbbrowser_info, 0);
+    }
+
+  return xfmpc_dbbrowser_type;
+}
+
+
+
+static void
+xfmpc_dbbrowser_class_init (XfmpcDbbrowserClass *klass)
+{
+  GObjectClass *gobject_class;
+
+  g_type_class_add_private (klass, sizeof (XfmpcDbbrowserPrivate));
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->dispose = xfmpc_dbbrowser_dispose;
+  gobject_class->finalize = xfmpc_dbbrowser_finalize;
+}
+
+static void
+xfmpc_dbbrowser_init (XfmpcDbbrowser *dbbrowser)
+{
+  XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
+
+  dbbrowser->preferences = xfmpc_preferences_get ();
+  dbbrowser->mpdclient = xfmpc_mpdclient_new ();
+
+  g_object_get (G_OBJECT (dbbrowser->preferences),
+                "dbbrowser-last-path", &priv->wdir,
+                NULL);
+
+  /* === Tree model === */
+  priv->store = gtk_list_store_new (N_COLUMNS,
+                                    G_TYPE_INT,
+                                    GDK_TYPE_PIXBUF,
+                                    G_TYPE_STRING,
+                                    G_TYPE_STRING,
+                                    G_TYPE_BOOLEAN);
+
+  /* === 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), TRUE);
+  gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->treeview), COLUMN_BASENAME);
+  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);
+
+  /* Columns */
+  GtkCellRenderer *cell = gtk_cell_renderer_pixbuf_new ();
+  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (priv->treeview),
+                                               -1, "", cell,
+                                               "pixbuf", COLUMN_PIXBUF,
+                                               NULL);
+
+  cell = gtk_cell_renderer_text_new ();
+  g_object_set (G_OBJECT (cell),
+                "ellipsize", PANGO_ELLIPSIZE_END,
+                NULL);
+  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (priv->treeview),
+                                               -1, "Filename", cell,
+                                               "text", COLUMN_BASENAME,
+                                               NULL);
+
+  /* === 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_container_add (GTK_CONTAINER (dbbrowser), scrolled);
+
+  /* === Signals === */
+  g_signal_connect_swapped (dbbrowser->mpdclient, "connected",
+                            G_CALLBACK (xfmpc_dbbrowser_reload), dbbrowser);
+#if 0
+  g_signal_connect_swapped (dbbrowser->mpdclient, "database-changed",
+                            G_CALLBACK (cb_database_changed), dbbrowser);
+#endif
+  /* Tree view */
+  g_signal_connect_swapped (priv->treeview, "row-activated",
+                            G_CALLBACK (cb_row_activated), dbbrowser);
+}
+
+static void
+xfmpc_dbbrowser_dispose (GObject *object)
+{
+  (*G_OBJECT_CLASS (parent_class)->dispose) (object);
+}
+
+static void
+xfmpc_dbbrowser_finalize (GObject *object)
+{
+  XfmpcDbbrowser *dbbrowser = XFMPC_DBBROWSER (object);
+  XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
+
+  g_object_set (G_OBJECT (dbbrowser->preferences),
+                "dbbrowser-last-path", priv->wdir,
+                NULL);
+
+  g_object_unref (G_OBJECT (dbbrowser->preferences));
+  g_object_unref (G_OBJECT (dbbrowser->mpdclient));
+  (*G_OBJECT_CLASS (parent_class)->finalize) (object);
+}
+
+
+
+GtkWidget*
+xfmpc_dbbrowser_new ()
+{
+  return g_object_new (XFMPC_TYPE_DBBROWSER, NULL);
+}
+
+void
+xfmpc_dbbrowser_clear (XfmpcDbbrowser *dbbrowser)
+{
+  XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
+
+  gtk_list_store_clear (priv->store);
+}
+
+void
+xfmpc_dbbrowser_append (XfmpcDbbrowser *dbbrowser,
+                        gchar *filename,
+                        gchar *basename,
+                        gboolean is_dir)
+{
+  XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
+  GdkPixbuf                *pixbuf;
+  GtkTreeIter               iter;
+
+  pixbuf = gtk_widget_render_icon (priv->treeview,
+                                   is_dir ? GTK_STOCK_DIRECTORY : GTK_STOCK_FILE,
+                                   GTK_ICON_SIZE_MENU,
+                                   NULL);
+
+  gtk_list_store_append (priv->store, &iter);
+  gtk_list_store_set (priv->store, &iter,
+                      COLUMN_PIXBUF, pixbuf,
+                      COLUMN_FILENAME, filename,
+                      COLUMN_BASENAME, basename,
+                      COLUMN_IS_DIR, is_dir,
+                      -1);
+}
+
+void
+xfmpc_dbbrowser_reload (XfmpcDbbrowser *dbbrowser)
+{
+  XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
+  gchar                    *filename;
+  gchar                    *basename;
+  gboolean                  is_dir;
+
+  xfmpc_dbbrowser_clear (dbbrowser);
+
+  if (!xfmpc_dbbrowser_wdir_is_root (dbbrowser))
+    {
+      filename = xfmpc_dbbrowser_get_parent_wdir (dbbrowser);
+      xfmpc_dbbrowser_append (dbbrowser, filename, "..", TRUE);
+      g_free (filename);
+    }
+
+  while (xfmpc_mpdclient_database_read (dbbrowser->mpdclient, priv->wdir,
+                                        &filename, &basename, &is_dir))
+    {
+      xfmpc_dbbrowser_append (dbbrowser, filename, basename, is_dir);
+      g_free (filename);
+      g_free (basename);
+    }
+}
+
+void
+xfmpc_dbbrowser_set_wdir (XfmpcDbbrowser *dbbrowser,
+                          const gchar *dir)
+{
+  XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
+
+  g_free (priv->wdir);
+  priv->wdir = g_strdup (dir);
+}
+
+gboolean
+xfmpc_dbbrowser_wdir_is_root (XfmpcDbbrowser *dbbrowser)
+{
+  XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
+
+  return priv->wdir[0] == '\0';
+}
+
+gchar *
+xfmpc_dbbrowser_get_parent_wdir (XfmpcDbbrowser *dbbrowser)
+{
+  XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
+  gchar                    *filename;
+
+  filename = g_strrstr (priv->wdir, "/");
+  if (NULL == filename)
+    filename = g_strdup ("");
+  else
+    filename = g_strndup (priv->wdir, filename - priv->wdir);
+
+  return filename;
+}
+
+static void
+cb_row_activated (XfmpcDbbrowser *dbbrowser,
+                  GtkTreePath *path,
+                  GtkTreeViewColumn *column)
+{
+  XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
+  GtkTreeIter               iter;
+  gchar                    *filename;
+  gboolean                  is_dir;
+
+  if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->store), &iter, path))
+    return;
+
+  gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter,
+                      COLUMN_FILENAME, &filename,
+                      COLUMN_IS_DIR, &is_dir,
+                      -1);
+
+  if (is_dir)
+    {
+      xfmpc_dbbrowser_set_wdir (dbbrowser, filename);
+      xfmpc_dbbrowser_reload (dbbrowser);
+    }
+  else
+    {
+      xfmpc_mpdclient_queue_add (dbbrowser->mpdclient, filename);
+      xfmpc_mpdclient_queue_commit (dbbrowser->mpdclient);
+    }
+
+  g_free (filename);
+}
+

Added: xfmpc/trunk/src/dbbrowser.h
===================================================================
--- xfmpc/trunk/src/dbbrowser.h	                        (rev 0)
+++ xfmpc/trunk/src/dbbrowser.h	2008-03-21 21:01:59 UTC (rev 4085)
@@ -0,0 +1,59 @@
+/*
+ *  Copyright (c) 2008 Mike Massonnet <mmassonnet at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __XFMPC_DBBROWSER_H__
+#define __XFMPC_DBBROWSER_H__
+
+G_BEGIN_DECLS
+
+#define XFMPC_TYPE_DBBROWSER                (xfmpc_dbbrowser_get_type())
+
+#define XFMPC_DBBROWSER(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFMPC_TYPE_DBBROWSER, XfmpcDbbrowser))
+#define XFMPC_DBBROWSER_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST ((klass), XFMPC_TYPE_DBBROWSER, XfmpcDbbrowserClass))
+
+#define XFMPC_IS_DBBROWSER(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFMPC_TYPE_DBBROWSER))
+#define XFMPC_IS_DBBROWSER_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), XFMPC_TYPE_DBBROWSER))
+
+#define XFMPC_DBBROWSER_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS ((obj), XFMPC_TYPE_DBBROWSER, XfmpcDbbrowserClass))
+
+typedef struct _XfmpcDbbrowserClass         XfmpcDbbrowserClass;
+typedef struct _XfmpcDbbrowser              XfmpcDbbrowser;
+typedef struct _XfmpcDbbrowserPrivate       XfmpcDbbrowserPrivate;
+
+GType           xfmpc_dbbrowser_get_type                () G_GNUC_CONST;
+
+GtkWidget *     xfmpc_dbbrowser_new                     ();
+
+void            xfmpc_dbbrowser_clear                   (XfmpcDbbrowser *dbbrowser);
+
+void            xfmpc_dbbrowser_append                  (XfmpcDbbrowser *dbbrowser,
+                                                         gchar *filename,
+                                                         gchar *basename,
+                                                         gboolean is_dir);
+void            xfmpc_dbbrowser_reload                  (XfmpcDbbrowser *dbbrowser);
+
+void            xfmpc_dbbrowser_set_wdir                (XfmpcDbbrowser *dbbrowser,
+                                                         const gchar *dir);
+gboolean        xfmpc_dbbrowser_wdir_is_root            (XfmpcDbbrowser *dbbrowser);
+
+gchar *         xfmpc_dbbrowser_get_parent_wdir         (XfmpcDbbrowser *dbbrowser);
+
+G_END_DECLS
+
+#endif
+

Modified: xfmpc/trunk/src/extended-interface.c
===================================================================
--- xfmpc/trunk/src/extended-interface.c	2008-03-21 21:01:51 UTC (rev 4084)
+++ xfmpc/trunk/src/extended-interface.c	2008-03-21 21:01:59 UTC (rev 4085)
@@ -25,6 +25,7 @@
 
 #include "extended-interface.h"
 #include "playlist.h"
+#include "dbbrowser.h"
 
 #define BORDER 4
 
@@ -48,7 +49,8 @@
 static void             xfmpc_extended_interface_dispose    (GObject *object);
 static void             xfmpc_extended_interface_finalize   (GObject *object);
 
-static void             cb_xfmpc_extended_interface_combobox_changed (GtkComboBox *widget,
+static void             cb_xfmpc_extended_interface_combobox_changed
+                                                            (GtkComboBox *widget,
                                                              XfmpcExtendedInterface *extended_interface);
 
 
@@ -145,8 +147,8 @@
   GtkWidget *child = xfmpc_playlist_new ();
   xfmpc_extended_interface_append_child (extended_interface, child, _("Current Playlist"));
 
-  child = gtk_label_new ("Hello world!");
-  xfmpc_extended_interface_append_child (extended_interface, child, "Hello world!");
+  child = xfmpc_dbbrowser_new ();
+  xfmpc_extended_interface_append_child (extended_interface, child, _("Browse database"));
 
   /* Containers */
   gtk_box_pack_start (GTK_BOX (extended_interface), priv->combobox, FALSE, FALSE, BORDER);

Modified: xfmpc/trunk/src/mpdclient.c
===================================================================
--- xfmpc/trunk/src/mpdclient.c	2008-03-21 21:01:51 UTC (rev 4084)
+++ xfmpc/trunk/src/mpdclient.c	2008-03-21 21:01:59 UTC (rev 4085)
@@ -35,6 +35,7 @@
 
 enum
 {
+  SIG_CONNECTED,
   SIG_SONG_CHANGED,
   SIG_PP_CHANGED,
   SIG_TIME_CHANGED,
@@ -64,6 +65,7 @@
 {
   GObjectClass              parent_class;
 
+  void (*connected)         (XfmpcMpdclient *mpdclient, gpointer user_data);
   void (*song_changed)      (XfmpcMpdclient *mpdclient, gpointer user_data);
   void (*pp_changed)        (XfmpcMpdclient *mpdclient, gboolean is_playing, gpointer user_data);
   void (*time_changed)      (XfmpcMpdclient *mpdclient, gint time, gint total_time, gpointer user_data);
@@ -132,6 +134,14 @@
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = xfmpc_mpdclient_finalize;
 
+  xfmpc_mpdclient_signals[SIG_CONNECTED] =
+    g_signal_new ("connected", G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, connected),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
   xfmpc_mpdclient_signals[SIG_SONG_CHANGED] =
     g_signal_new ("song-changed", G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
@@ -263,6 +273,8 @@
 
   mpd_send_password (priv->mi);
 
+  g_signal_emit_by_name (mpdclient, "connected");
+
   return TRUE;
 }
 
@@ -505,39 +517,6 @@
   mpd_status_update (priv->mi);
 }
 
-gboolean
-xfmpc_mpdclient_playlist_read (XfmpcMpdclient *mpdclient,
-                               gint *id,
-                               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);
-      *id = data->song->id;
-    }
-
-  return NULL != data;
-}
-
 static void
 cb_xfmpc_mpdclient_status_changed (MpdObj *mi,
                                    ChangedStatusType what,
@@ -584,6 +563,18 @@
 }
 
 gboolean
+xfmpc_mpdclient_queue_add (XfmpcMpdclient *mpdclient,
+                           const gchar *path)
+{
+  XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
+
+  if (mpd_playlist_queue_add (priv->mi, (gchar *)path) != MPD_OK)
+    return FALSE;
+
+  return TRUE;
+}
+
+gboolean
 xfmpc_mpdclient_queue_remove_id (XfmpcMpdclient *mpdclient,
                                  gint id)
 {
@@ -595,3 +586,94 @@
   return TRUE;
 }
 
+gboolean
+xfmpc_mpdclient_playlist_read (XfmpcMpdclient *mpdclient,
+                               gint *id,
+                               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);
+      *id = data->song->id;
+    }
+
+  return NULL != data;
+}
+
+gboolean
+xfmpc_mpdclient_database_read (XfmpcMpdclient *mpdclient,
+                               const gchar *dir,
+                               gchar **filename,
+                               gchar **basename,
+                               gboolean *is_dir)
+{
+  static MpdData       *data = NULL;
+  XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
+
+  if (NULL == data)
+    data = mpd_database_get_directory (priv->mi, (gchar *)dir);
+  else
+    data = mpd_data_get_next (data);
+
+  if (NULL != data)
+    {
+      switch (data->type)
+        {
+        case MPD_DATA_TYPE_DIRECTORY:
+          *is_dir = TRUE;
+          *filename = g_strdup (data->directory);
+          *basename = g_path_get_basename (data->directory);
+          break;
+
+        case MPD_DATA_TYPE_SONG:
+          *is_dir = FALSE;
+          *filename = g_strdup (data->song->file);
+
+          if (NULL != data->song->title)
+            {
+              if (data->song->artist)
+                *basename = g_strdup_printf ("%s - %s", data->song->artist, data->song->title);
+              else
+                *basename = g_strdup (data->song->title);
+            }
+          else
+            *basename = g_path_get_basename (data->song->file);
+
+          break;
+
+        case MPD_DATA_TYPE_PLAYLIST:
+#if 0
+          *is_dir = FALSE;
+          *filename = g_strdup (data->playlist);
+          *basename = g_strconcat ("Playlist: ", data->playlist, NULL);
+          break;
+#endif
+
+        default:
+          return xfmpc_mpdclient_database_read (mpdclient, dir, filename, basename, is_dir);
+          break;
+        }
+    }
+
+  return NULL != data;
+}
+

Modified: xfmpc/trunk/src/mpdclient.h
===================================================================
--- xfmpc/trunk/src/mpdclient.h	2008-03-21 21:01:51 UTC (rev 4084)
+++ xfmpc/trunk/src/mpdclient.h	2008-03-21 21:01:59 UTC (rev 4085)
@@ -87,15 +87,22 @@
 
 void                    xfmpc_mpdclient_update_status           (XfmpcMpdclient *mpdclient);
 
+gboolean                xfmpc_mpdclient_queue_commit            (XfmpcMpdclient *mpdclient);
+
+gboolean                xfmpc_mpdclient_queue_add               (XfmpcMpdclient *mpdclient,
+                                                                 const gchar *path);
+gboolean                xfmpc_mpdclient_queue_remove_id         (XfmpcMpdclient *mpdclient,
+                                                                 gint id);
 gboolean                xfmpc_mpdclient_playlist_read           (XfmpcMpdclient *mpdclient,
                                                                  gint *id,
                                                                  gchar **song,
                                                                  gchar **length);
-gboolean                xfmpc_mpdclient_queue_commit            (XfmpcMpdclient *mpdclient);
+gboolean                xfmpc_mpdclient_database_read           (XfmpcMpdclient *mpdclient,
+                                                                 const gchar *dir,
+                                                                 gchar **filename,
+                                                                 gchar **basename,
+                                                                 gboolean *is_dir);
 
-gboolean                xfmpc_mpdclient_queue_remove_id         (XfmpcMpdclient *mpdclient,
-                                                                 gint id);
-
 G_END_DECLS
 
 #endif

Modified: xfmpc/trunk/src/preferences.c
===================================================================
--- xfmpc/trunk/src/preferences.c	2008-03-21 21:01:51 UTC (rev 4084)
+++ xfmpc/trunk/src/preferences.c	2008-03-21 21:01:59 UTC (rev 4085)
@@ -37,6 +37,7 @@
   PROP_LAST_WINDOW_HEIGHT,
   PROP_LAST_WINDOW_STATE_STICKY,
   PROP_PLAYLIST_AUTOCENTER,
+  PROP_DBBROWSER_LAST_PATH,
   N_PROPERTIES,
 };
 
@@ -165,6 +166,14 @@
                                                          "Auto-centers the current song in the playlist",
                                                          TRUE,
                                                          G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_DBBROWSER_LAST_PATH,
+                                   g_param_spec_string ("dbbrowser-last-path",
+                                                        "DbbrowserLastPath",
+                                                        "Restores the last path from the database browser",
+                                                         "",
+                                                         G_PARAM_READWRITE));
 }
 
 static void




More information about the Goodies-commits mailing list