[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