[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