[Goodies-commits] r6893 - in xfmpc/trunk: . src
Vincent Legout
vincent at xfce.org
Sat Mar 14 00:00:53 CET 2009
Author: vincent
Date: 2009-03-13 23:00:52 +0000 (Fri, 13 Mar 2009)
New Revision: 6893
Added:
xfmpc/trunk/src/song-dialog.c
xfmpc/trunk/src/song-dialog.h
Modified:
xfmpc/trunk/ChangeLog
xfmpc/trunk/src/Makefile.am
xfmpc/trunk/src/mpdclient.c
xfmpc/trunk/src/mpdclient.h
xfmpc/trunk/src/playlist.c
Log:
New dialog which displays information about a song
Modified: xfmpc/trunk/ChangeLog
===================================================================
--- xfmpc/trunk/ChangeLog 2009-03-13 15:31:39 UTC (rev 6892)
+++ xfmpc/trunk/ChangeLog 2009-03-13 23:00:52 UTC (rev 6893)
@@ -1,3 +1,17 @@
+2009-03-13 Vincent Legout <vincent at legout.info>
+
+New dialog which displays information about a song
+ * src/song-dialog.c, src/song-dialog.h:
+ - New widget XfmpcSongDialog
+ * src/mpdclient.c, src/mpdclient.h:
+ - New structure XfmpcSongInfo and new function xfmpc_song_info_free to
+ free this structure
+ - New function xfmpc_mpdclient_get_song_info to retrieve information
+ on a song
+ * src/playlist.c:
+ - New button to display the new XfmpcSongDialog and it's callback
+ function cb_info_selection
+
2009-03-04 Mike Massonnet <mmassonnet at xfce.org>
Rework "API" in XfmpcExtendedInterface
Modified: xfmpc/trunk/src/Makefile.am
===================================================================
--- xfmpc/trunk/src/Makefile.am 2009-03-13 15:31:39 UTC (rev 6892)
+++ xfmpc/trunk/src/Makefile.am 2009-03-13 23:00:52 UTC (rev 6893)
@@ -22,6 +22,8 @@
preferences-dialog.h \
mpdclient.c \
mpdclient.h \
+ song-dialog.c \
+ song-dialog.h \
xfce-arrow-button.c \
xfce-arrow-button.h
Modified: xfmpc/trunk/src/mpdclient.c
===================================================================
--- xfmpc/trunk/src/mpdclient.c 2009-03-13 15:31:39 UTC (rev 6892)
+++ xfmpc/trunk/src/mpdclient.c 2009-03-13 23:00:52 UTC (rev 6893)
@@ -1127,3 +1127,35 @@
return formatted_name;
}
+XfmpcSongInfo *
+xfmpc_mpdclient_get_song_info (XfmpcMpdclient *mpdclient, gint id)
+{
+ XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT (mpdclient)->priv;
+ XfmpcSongInfo *song_info = g_slice_new0 (XfmpcSongInfo);
+ mpd_Song *song = mpd_playlist_get_song (priv->mi, id);
+
+ song_info->filename = song->file;
+ song_info->artist = song->artist;
+ song_info->title = song->title;
+ song_info->album = song->album;
+ song_info->track = song->track;
+ song_info->date = song->date;
+ song_info->genre = song->genre;
+
+ return song_info;
+}
+
+void
+xfmpc_song_info_free (XfmpcSongInfo *song_info)
+{
+ g_free (song_info->filename);
+ g_free (song_info->artist);
+ g_free (song_info->title);
+ g_free (song_info->album);
+ g_free (song_info->date);
+ g_free (song_info->track);
+ g_free (song_info->genre);
+
+ g_slice_free (XfmpcSongInfo, song_info);
+}
+
Modified: xfmpc/trunk/src/mpdclient.h
===================================================================
--- xfmpc/trunk/src/mpdclient.h 2009-03-13 15:31:39 UTC (rev 6892)
+++ xfmpc/trunk/src/mpdclient.h 2009-03-13 23:00:52 UTC (rev 6893)
@@ -21,6 +21,18 @@
G_BEGIN_DECLS
+typedef struct _XfmpcSongInfo XfmpcSongInfo;
+struct _XfmpcSongInfo
+{
+ gchar *filename;
+ gchar *artist;
+ gchar *title;
+ gchar *album;
+ gchar *date;
+ gchar *track;
+ gchar *genre;
+};
+
#define XFMPC_TYPE_MPDCLIENT (xfmpc_mpdclient_get_type())
#define XFMPC_MPDCLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFMPC_TYPE_MPDCLIENT, XfmpcMpdclient))
@@ -104,6 +116,11 @@
gchar **filename,
gchar **basename);
+XfmpcSongInfo * xfmpc_mpdclient_get_song_info (XfmpcMpdclient *mpdclient,
+ gint id);
+
+void xfmpc_song_info_free ();
+
G_END_DECLS
#endif
Modified: xfmpc/trunk/src/playlist.c
===================================================================
--- xfmpc/trunk/src/playlist.c 2009-03-13 15:31:39 UTC (rev 6892)
+++ xfmpc/trunk/src/playlist.c 2009-03-13 23:00:52 UTC (rev 6893)
@@ -30,6 +30,7 @@
#include "mpdclient.h"
#include "dbbrowser.h"
#include "extended-interface.h"
+#include "song-dialog.h"
#define BORDER 4
@@ -64,6 +65,7 @@
XfmpcPlaylist *playlist);
void cb_browse_selection (XfmpcPlaylist *playlist);
+void cb_info_selection (XfmpcPlaylist *playlist);
@@ -239,6 +241,11 @@
GtkWidget *image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
+ mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_INFO, NULL);
+ gtk_menu_shell_append (GTK_MENU_SHELL (priv->menu), mi);
+ g_signal_connect_swapped (mi, "activate",
+ G_CALLBACK (cb_info_selection), playlist);
+
gtk_widget_show_all (priv->menu);
/* === Filter entry === */
@@ -645,3 +652,33 @@
g_list_free (list);
}
+void
+cb_info_selection (XfmpcPlaylist *playlist)
+{
+ XfmpcPlaylistPrivate *priv = XFMPC_PLAYLIST (playlist)->priv;
+
+ GtkTreeModel *store = GTK_TREE_MODEL (priv->store);
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ GList *list;
+ gint id;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
+ if (gtk_tree_selection_count_selected_rows (selection) > 1)
+ return;
+
+ list = gtk_tree_selection_get_selected_rows (selection, &store);
+ if (gtk_tree_model_get_iter (store, &iter, list->data))
+ {
+ gtk_tree_model_get (store, &iter,
+ COLUMN_ID, &id,
+ -1);
+
+ GtkWidget *dialog = xfmpc_song_dialog_new (id);
+ gtk_widget_show (dialog);
+ }
+
+ g_list_foreach (list, (GFunc)gtk_tree_path_free, NULL);
+ g_list_free (list);
+}
+
Added: xfmpc/trunk/src/song-dialog.c
===================================================================
--- xfmpc/trunk/src/song-dialog.c (rev 0)
+++ xfmpc/trunk/src/song-dialog.c 2009-03-13 23:00:52 UTC (rev 6893)
@@ -0,0 +1,269 @@
+/*
+ * Copyright (c) 2009 Mike Massonnet <mmassonnet at xfce.org>
+ * Copyright (c) 2009 Vincent Legout <vincent 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <libxfcegui4/libxfcegui4.h>
+#include <libxfce4util/libxfce4util.h>
+
+#include "song-dialog.h"
+#include "mpdclient.h"
+
+#define GET_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), XFMPC_TYPE_SONG_DIALOG, XfmpcSongDialogPrivate))
+
+
+
+static void xfmpc_song_dialog_class_init (XfmpcSongDialogClass *klass);
+static void xfmpc_song_dialog_init (XfmpcSongDialog *dialog);
+static void xfmpc_song_dialog_finalize (GObject *object);
+
+static void xfmpc_song_dialog_response (GtkDialog *dialog,
+ gint response);
+
+static void xfmpc_song_dialog_set_song_info (XfmpcSongDialog *dialog,
+ XfmpcSongInfo *song_info);
+
+
+
+struct _XfmpcSongDialogClass
+{
+ XfceTitledDialogClass parent_class;
+};
+
+struct _XfmpcSongDialog
+{
+ XfceTitledDialog parent;
+ /*<private>*/
+ XfmpcSongDialogPrivate *priv;
+};
+
+struct _XfmpcSongDialogPrivate
+{
+ GtkWidget *label_file;
+ GtkWidget *label_artist;
+ GtkWidget *label_title;
+ GtkWidget *label_album;
+ GtkWidget *label_year;
+ GtkWidget *label_track;
+ GtkWidget *label_genre;
+};
+
+
+
+static GObjectClass *parent_class = NULL;
+
+
+
+GType
+xfmpc_song_dialog_get_type (void)
+{
+ static GType xfmpc_song_dialog_type = G_TYPE_INVALID;
+
+ if (G_UNLIKELY (xfmpc_song_dialog_type == G_TYPE_INVALID))
+ {
+ static const GTypeInfo xfmpc_song_dialog_info =
+ {
+ sizeof (XfmpcSongDialogClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) xfmpc_song_dialog_class_init,
+ NULL,
+ NULL,
+ sizeof (XfmpcSongDialog),
+ 0,
+ (GInstanceInitFunc) xfmpc_song_dialog_init,
+ NULL,
+ };
+
+ xfmpc_song_dialog_type = g_type_register_static (XFCE_TYPE_TITLED_DIALOG, "XfmpcSongDialog", &xfmpc_song_dialog_info, 0);
+ }
+
+ return xfmpc_song_dialog_type;
+}
+
+
+
+static void
+xfmpc_song_dialog_class_init (XfmpcSongDialogClass *klass)
+{
+ GtkDialogClass *gtkdialog_class;
+ GObjectClass *gobject_class;
+
+ g_type_class_add_private (klass, sizeof (XfmpcSongDialogPrivate));
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = xfmpc_song_dialog_finalize;
+
+ gtkdialog_class = GTK_DIALOG_CLASS (klass);
+ gtkdialog_class->response = xfmpc_song_dialog_response;
+}
+
+static void
+xfmpc_song_dialog_init (XfmpcSongDialog *dialog)
+{
+ XfmpcSongDialogPrivate *priv = dialog->priv = GET_PRIVATE (dialog);
+
+ gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
+ gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), TRUE);
+ gtk_window_set_icon_name (GTK_WINDOW (dialog), "stock_volume");
+ gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+ gtk_window_set_title (GTK_WINDOW (dialog), "Xfmpc");
+
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+ GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
+ NULL);
+
+ PangoAttrList *attrs = pango_attr_list_new ();
+ PangoAttribute *attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
+ pango_attr_list_insert (attrs, attr);
+
+ GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
+ gtk_widget_show (vbox);
+
+ GtkWidget *vbox2 = gtk_vbox_new (FALSE, 0);
+ GtkWidget *frame = xfce_create_framebox_with_content ("", vbox2);
+ gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+
+ /* File */
+ GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+ GtkWidget *label = gtk_label_new ("File : ");
+ gtk_widget_set_size_request (GTK_WIDGET (label), 60, 10);
+ gtk_label_set_attributes (GTK_LABEL (label), attrs);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ priv->label_file = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (hbox), priv->label_file, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 6);
+
+ /* Artist */
+ hbox = gtk_hbox_new (FALSE, 0);
+ label = gtk_label_new ("Artist : ");
+ gtk_widget_set_size_request (GTK_WIDGET (label), 60, 10);
+ gtk_label_set_attributes (GTK_LABEL (label), attrs);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ priv->label_artist = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (hbox), priv->label_artist, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 6);
+
+ /* Title */
+ hbox = gtk_hbox_new (FALSE, 0);
+ label = gtk_label_new ("Title : ");
+ gtk_widget_set_size_request (GTK_WIDGET (label), 60, 10);
+ gtk_label_set_attributes (GTK_LABEL (label), attrs);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ priv->label_title = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (hbox), priv->label_title, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 6);
+
+ /* Album */
+ hbox = gtk_hbox_new (FALSE, 0);
+ label = gtk_label_new ("Album : ");
+ gtk_widget_set_size_request (GTK_WIDGET (label), 60, 10);
+ gtk_label_set_attributes (GTK_LABEL (label), attrs);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ priv->label_album = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (hbox), priv->label_album, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 6);
+
+ /* Year and Track */
+ hbox = gtk_hbox_new (TRUE, 0);
+ label = gtk_label_new ("Year : ");
+ gtk_widget_set_size_request (GTK_WIDGET (label), 60, 10);
+ gtk_label_set_attributes (GTK_LABEL (label), attrs);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ priv->label_year = gtk_label_new ("");
+ gtk_widget_set_size_request (GTK_WIDGET (priv->label_year), 60, 10);
+ gtk_box_pack_start (GTK_BOX (hbox), priv->label_year, FALSE, FALSE, 0);
+ label = gtk_label_new ("Track : ");
+ gtk_widget_set_size_request (GTK_WIDGET (label), 60, 10);
+ gtk_label_set_attributes (GTK_LABEL (label), attrs);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ priv->label_track = gtk_label_new ("");
+ gtk_widget_set_size_request (GTK_WIDGET (label), 60, 10);
+ gtk_box_pack_start (GTK_BOX (hbox), priv->label_track, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 6);
+
+ /* Genre */
+ hbox = gtk_hbox_new (FALSE, 0);
+ label = gtk_label_new ("Genre : ");
+ gtk_widget_set_size_request (GTK_WIDGET (label), 60, 10);
+ gtk_label_set_attributes (GTK_LABEL (label), attrs);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ priv->label_genre = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (hbox), priv->label_genre, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 6);
+
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, TRUE, TRUE, 0);
+ gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);
+}
+
+static void
+xfmpc_song_dialog_finalize (GObject *object)
+{
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+
+static void
+xfmpc_song_dialog_response (GtkDialog *dialog,
+ gint response)
+{
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+
+
+GtkWidget *
+xfmpc_song_dialog_new (gint id)
+{
+ XfmpcMpdclient *mpdclient = xfmpc_mpdclient_get ();
+
+ XfmpcSongInfo *song_info = xfmpc_mpdclient_get_song_info (mpdclient, id);
+
+ GtkWidget *dialog = g_object_new (XFMPC_TYPE_SONG_DIALOG, NULL);
+ xfmpc_song_dialog_set_song_info (XFMPC_SONG_DIALOG (dialog), song_info);
+
+ return dialog;
+}
+
+static void
+xfmpc_song_dialog_set_song_info (XfmpcSongDialog *dialog,
+ XfmpcSongInfo *song_info)
+{
+ XfmpcSongDialogPrivate *priv = dialog->priv = GET_PRIVATE (dialog);
+
+ gtk_label_set_text (GTK_LABEL (priv->label_file), g_path_get_basename (song_info->filename));
+ gtk_label_set_text (GTK_LABEL (priv->label_artist), song_info->artist);
+ gtk_label_set_text (GTK_LABEL (priv->label_album), song_info->album);
+ gtk_label_set_text (GTK_LABEL (priv->label_title), song_info->title);
+ gtk_label_set_text (GTK_LABEL (priv->label_year), song_info->date);
+ gtk_label_set_text (GTK_LABEL (priv->label_track), song_info->track);
+ gtk_label_set_text (GTK_LABEL (priv->label_genre), song_info->genre);
+
+ gtk_window_set_title (GTK_WINDOW (dialog), song_info->title);
+}
+
Added: xfmpc/trunk/src/song-dialog.h
===================================================================
--- xfmpc/trunk/src/song-dialog.h (rev 0)
+++ xfmpc/trunk/src/song-dialog.h 2009-03-13 23:00:52 UTC (rev 6893)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2009 Mike Massonnet <mmassonnet at xfce.org>
+ * Copyright (c) 2009 Vincent Legout <vincent 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __XFMPC_SONG_DIALOG_H__
+#define __XFMPC_SONG_DIALOG_H__
+
+G_BEGIN_DECLS;
+
+#define XFMPC_TYPE_SONG_DIALOG (xfmpc_song_dialog_get_type ())
+
+#define XFMPC_SONG_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFMPC_TYPE_SONG_DIALOG, XfmpcSongDialog))
+#define XFMPC_SONG_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), XFMPC_TYPE_SONG_DIALOG, XfmpcSongDialogClass))
+
+#define XFMPC_IS_SONG_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFMPC_TYPE_SONG_DIALOG))
+#define XFMPC_IS_SONG_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XFMPC_TYPE_SONG_DIALOG))
+
+#define XFMPC_SONG_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), XFMPC_TYPE_SONG_DIALOG, XfmpcSongDialogClass))
+
+typedef struct _XfmpcSongDialogClass XfmpcSongDialogClass;
+typedef struct _XfmpcSongDialog XfmpcSongDialog;
+typedef struct _XfmpcSongDialogPrivate XfmpcSongDialogPrivate;
+
+GType xfmpc_song_dialog_get_type () G_GNUC_CONST;
+
+GtkWidget * xfmpc_song_dialog_new (gint id);
+
+
+G_END_DECLS;
+
+#endif
+
+
More information about the Goodies-commits
mailing list