[Goodies-commits] r6696 - in xfmpc/trunk: . src

Mike Massonnet mmassonnet at xfce.org
Mon Feb 16 09:56:24 CET 2009


Author: mmassonnet
Date: 2009-02-16 08:56:24 +0000 (Mon, 16 Feb 2009)
New Revision: 6696

Added:
   xfmpc/trunk/src/statusbar.c
   xfmpc/trunk/src/statusbar.h
Modified:
   xfmpc/trunk/ChangeLog
   xfmpc/trunk/NEWS
   xfmpc/trunk/src/Makefile.am
   xfmpc/trunk/src/dbbrowser.c
   xfmpc/trunk/src/dbbrowser.h
   xfmpc/trunk/src/extended-interface.c
   xfmpc/trunk/src/main.c
   xfmpc/trunk/src/mpdclient.c
   xfmpc/trunk/src/mpdclient.h
   xfmpc/trunk/src/playlist.c
   xfmpc/trunk/src/playlist.h
Log:
Features for the database browser and a statusbar contributed by Vincent Legout

* src/mpdclient.c, src/mpdclient.h:
  - New functions xfmpc_mpdclient_playlist_get_length() and get_total_time()
  - New function xfmpc_mpdclient_playlist_has_filename() to know if a
  filename is already in the playlist
  - (xfmpc_mpdclient_playlist_read): Takes a new argument **filename that
  will be useful to browse the database from the playlist
  - (cb_status_changed): The signal "song-changed" must not be emitted
  when the playlist changed
* src/playlist.c, src/playlist.h:
  - Use new function playlist_read from mpdclient
  - (xfmpc_playlist_append): New argument filename
* src/dbbrowser.c, src/dbbrowser.h:
  - New menu item Browse that is only displayed on a search and on a
  single row selection to open the directory of the filename
  - The rows are displayed in bold if they exist in the playlist
  - (xfmpc_dbbrowser_append): New argument is_bold
  - (cb_playlist_changed): New callback to refresh the rows in bold on
  playlist changes
  - (xfmpc_dbbrowser_add_selected_rows): Fix leak, list ended being NULL
  thus it didn't freed anything
  - (xfmpc_dbbrowser_reload): Fix a bug with i not being kept at -1
  when last_wdir is found in the current directory
* src/statusbar.c, src/statusbar.h, src/main.c:
  - New statusbar displayed in the main interface


Modified: xfmpc/trunk/ChangeLog
===================================================================
--- xfmpc/trunk/ChangeLog	2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/ChangeLog	2009-02-16 08:56:24 UTC (rev 6696)
@@ -1,3 +1,111 @@
+2009-02-16	Mike Massonnet <mmassonnet at gmail.com>
+
+Features for the database browser and a statusbar contributed by Vincent Legout
+	* src/mpdclient.c, src/mpdclient.h:
+	  - New functions xfmpc_mpdclient_playlist_get_length() and get_total_time()
+	  - New function xfmpc_mpdclient_playlist_has_filename() to know if a
+	  filename is already in the playlist
+	  - (xfmpc_mpdclient_playlist_read): Takes a new argument **filename that
+	  will be useful to browse the database from the playlist
+	  - (cb_status_changed): The signal "song-changed" must not be emitted
+	  when the playlist changed
+	* src/playlist.c, src/playlist.h:
+	  - Use new function playlist_read from mpdclient
+	  - (xfmpc_playlist_append): New argument filename
+	* src/dbbrowser.c, src/dbbrowser.h:
+	  - New menu item Browse that is only displayed on a search and on a
+	  single row selection to open the directory of the filename
+	  - The rows are displayed in bold if they exist in the playlist
+	  - (xfmpc_dbbrowser_append): New argument is_bold
+	  - (cb_playlist_changed): New callback to refresh the rows in bold on
+	  playlist changes
+	  - (xfmpc_dbbrowser_add_selected_rows): Fix leak, list ended being NULL
+	  thus it didn't freed anything
+	  - (xfmpc_dbbrowser_reload): Fix a bug with i not being kept at -1
+	  when last_wdir is found in the current directory
+	* src/statusbar.c, src/statusbar.h, src/main.c:
+	  - New statusbar displayed in the main interface
+
+2009-02-05	Mike Massonnet <mmassonnet at gmail.com>
+
+Small leak
+	* src/extended-interface.c, src/extended-interface.h:
+	  - Move xfmpc_extended_interface_context_menu_new() to the C source and made
+	  it a static function
+	  - (xfmpc_server_dialog_show): Free the strings host and passwd
+	  - (popup_context_menu): Don't destroy the menu to recreate it as it doesn't
+	  make sense because it doesn't have any dynamic items
+	* IDEAS:
+	  - A very small update
+
+2009-02-03	Mike Massonnet <mmassonnet at gmail.com>
+
+Rename Server Settings to MPD Settings and run make update-po
+	* src/extended-interface.c:
+	  - Rename Server Settings to MPD Settings
+	* po/*.po, po/*.pot:
+	  - Run make update-po
+
+2009-02-03	Mike Massonnet <mmassonnet at gmail.com>
+
+General cleanup
+	* configure.in.in:
+	  - Move from AC_PROG_CC to AM_PROG_CC_C_O as suggested by the autotools output
+	  to support multiple program rules
+	  - Add call to AC_PROG_LIBTOOL as required by recent versions of libtool
+	* Makefile.am:
+	  - Add distclean rule
+	* po/POTFILES.*:
+	  - Clean up
+	* src/*.c, src/*.h:
+	  - Store private pointer in class structure to avoid repeatitive and boring
+	  calls via the GET_PRIVATE macro
+	  - Copyright headers
+	  - Merge the action entries
+	  - Replace calls of g_signal_emit_by_name() against g_signal_emit()
+	* src/extended-interface.c:
+	  - Drop the repeat and random pointers out from the private data structure
+
+2009-02-03	Mike Massonnet <mmassonnet at gmail.com>
+
+Fix weird condition in XfmpcMpdclient
+	* src/mpdclient.c(cb_xfmpc_mpdclient_status_changed):
+	  - The signal "song-changed" must not be emitted when the database has been
+	  updated
+
+2009-02-03	Mike Massonnet <mmassonnet at gmail.com>
+
+Add a graphical settings dialog for the MPD host contributed by Vincent Legout
+	* src/preferences.c(xfmpc_preferences_class_init):
+	  - Install new class properties for the MPD host
+	* src/mpdclient.c:
+	  - Use the XfmpcPreferences interface to fetch the host or the environment
+	  variables when mpd-use-defaults is true
+	  - Use the environment variables when 
+	  - Check the host before connecting for real
+	* src/extended-interface.c:
+	  - Implement a dialog to set the MPD host
+	* src/interface.c(xfmpc_interface_init):
+	  - Connect to "connected" signal to refresh the interface when connecting
+	  manually to a new MPD host.
+	* src/main.c:
+	  - Set a default window size to 330x330.
+	* autogen.sh:
+	  - Fix the revision number from svn, enable debug, and delete configure.in
+
+2008-08-26	Mike Massonnet <mmassonnet at gmail.com>
+
+Add Replace to the right click menu in the database browser
+	* src/mpdclient.c(xfmpc_mpdclient_queue_clear):
+	  - New function that removes all the songs from the playlist without
+	  commiting to MPD
+	* src/mpdclient.c(xfmpc_mpdclient_playlist_read):
+	  - Possibility to pass NULL to song and length
+	* src/dbbrowser.c(xfmpc_dbbrowser_replace_with_selected_rows):
+	  - New function to replace the playlist with the selected rows
+	* src/dbbrowser.c(xfmpc_dbbrowser_init):
+	  - Add Replace item in the right click menu
+
 2008-08-25	Mike Massonnet <mmassonnet at gmail.com>
 
 === Release 0.0.7 ===

Modified: xfmpc/trunk/NEWS
===================================================================
--- xfmpc/trunk/NEWS	2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/NEWS	2009-02-16 08:56:24 UTC (rev 6696)
@@ -1,3 +1,12 @@
+    0.0.8 (2009-0x-xx)
+
+- Graphical settings dialog for the MPD host
+- The database browser shows filenames already in the playlist in bold
+- A status bar with the number of songs and the total time of the playlist
+- Add a Replace item in the database browser context menu
+- Fix misc bugs
+- New translations: Swedish, Turkish, Portuguese, Czech, Basque, Italian
+
     0.0.7 (2008-08-25)
 
 - Add a search entry in the database browser

Modified: xfmpc/trunk/src/Makefile.am
===================================================================
--- xfmpc/trunk/src/Makefile.am	2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/Makefile.am	2009-02-16 08:56:24 UTC (rev 6696)
@@ -12,6 +12,8 @@
 	playlist.h							\
 	dbbrowser.c							\
 	dbbrowser.h							\
+	statusbar.c							\
+	statusbar.h							\
 	preferences.c							\
 	preferences.h							\
 	mpdclient.c							\

Modified: xfmpc/trunk/src/dbbrowser.c
===================================================================
--- xfmpc/trunk/src/dbbrowser.c	2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/dbbrowser.c	2009-02-16 08:56:24 UTC (rev 6696)
@@ -49,6 +49,7 @@
                                                                 GdkEventButton *event);
 static gboolean         cb_popup_menu                          (XfmpcDbbrowser *dbbrowser);
 static void             popup_menu                             (XfmpcDbbrowser *dbbrowser);
+static void             cb_browse                              (XfmpcDbbrowser *dbbrowser);
 
 static void             cb_search_entry_activated              (XfmpcDbbrowser *dbbrowser);
 static gboolean         cb_search_entry_key_released           (XfmpcDbbrowser *dbbrowser,
@@ -57,8 +58,10 @@
 static gboolean         timeout_search                         (XfmpcDbbrowser *dbbrowser);
 static void             timeout_search_destroy                 (XfmpcDbbrowser *dbbrowser);
 
+static void             cb_playlist_changed                    (XfmpcDbbrowser *dbbrowser);
 
 
+
 /* List store identifiers */
 enum
 {
@@ -67,6 +70,7 @@
   COLUMN_FILENAME,
   COLUMN_BASENAME,
   COLUMN_IS_DIR,
+  COLUMN_WEIGHT,
   N_COLUMNS,
 };
 
@@ -92,6 +96,7 @@
   GtkListStore             *store;
   GtkWidget                *search_entry;
   GtkWidget                *menu;
+  GtkWidget                *mi_browse;
 
   guint                     search_timeout;
   gboolean                  is_searching;
@@ -167,7 +172,8 @@
                                     GDK_TYPE_PIXBUF,
                                     G_TYPE_STRING,
                                     G_TYPE_STRING,
-                                    G_TYPE_BOOLEAN);
+                                    G_TYPE_BOOLEAN,
+                                    G_TYPE_INT);
 
   /* === Tree view === */
   priv->treeview = gtk_tree_view_new ();
@@ -194,6 +200,7 @@
   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (priv->treeview),
                                                -1, "Filename", cell,
                                                "text", COLUMN_BASENAME,
+                                               "weight", COLUMN_WEIGHT,
                                                NULL);
 
   /* Scrolled window */
@@ -219,6 +226,14 @@
   GtkWidget *image = gtk_image_new_from_stock (GTK_STOCK_CUT, GTK_ICON_SIZE_MENU);
   gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
 
+  /* Menu -> Browse (only shown on a search) */
+  mi = priv->mi_browse = gtk_image_menu_item_new_with_mnemonic (_("_Browse"));
+  gtk_menu_shell_append (GTK_MENU_SHELL (priv->menu), mi);
+  g_signal_connect_swapped (mi, "activate",
+                            G_CALLBACK (cb_browse), dbbrowser);
+  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);
+
   gtk_widget_show_all (priv->menu);
 
   /* === Search entry === */
@@ -234,6 +249,8 @@
                             G_CALLBACK (xfmpc_dbbrowser_reload), dbbrowser);
   g_signal_connect_swapped (dbbrowser->mpdclient, "database-changed",
                             G_CALLBACK (xfmpc_dbbrowser_reload), dbbrowser);
+  g_signal_connect_swapped (dbbrowser->mpdclient, "playlist-changed",
+                            G_CALLBACK (cb_playlist_changed), dbbrowser);
   /* Tree view */
   g_signal_connect_swapped (priv->treeview, "row-activated",
                             G_CALLBACK (cb_row_activated), dbbrowser);
@@ -292,7 +309,8 @@
 xfmpc_dbbrowser_append (XfmpcDbbrowser *dbbrowser,
                         gchar *filename,
                         gchar *basename,
-                        gboolean is_dir)
+                        gboolean is_dir,
+                        gboolean is_bold)
 {
   XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
   GdkPixbuf                *pixbuf;
@@ -309,6 +327,7 @@
                       COLUMN_FILENAME, filename,
                       COLUMN_BASENAME, basename,
                       COLUMN_IS_DIR, is_dir,
+                      COLUMN_WEIGHT, is_bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
                       -1);
 }
 
@@ -318,14 +337,14 @@
   XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
   GtkTreeModel         *store = GTK_TREE_MODEL (priv->store);
   GtkTreeIter           iter;
-  GList                *list;
+  GList                *l, *list;
   gchar                *filename;
 
-  list = gtk_tree_selection_get_selected_rows (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview)),
-                                               &store);
-  while (NULL != list)
+  list = gtk_tree_selection_get_selected_rows (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview)), &store);
+
+  for (l = list; l != NULL; l = l->next)
     {
-      if (gtk_tree_model_get_iter (store, &iter, list->data))
+      if (gtk_tree_model_get_iter (store, &iter, l->data))
         {       
           gtk_tree_model_get (store, &iter,
                               COLUMN_FILENAME, &filename,
@@ -333,7 +352,6 @@
           xfmpc_mpdclient_queue_add (dbbrowser->mpdclient, filename);
           g_free (filename);
         }
-      list = g_list_next (list);
     }
 
   xfmpc_mpdclient_queue_commit (dbbrowser->mpdclient);
@@ -356,6 +374,7 @@
   gchar                    *filename;
   gchar                    *basename;
   gboolean                  is_dir;
+  gboolean                  is_bold;
   gint                      i = 0;
 
   if (G_UNLIKELY (!xfmpc_mpdclient_is_connected (dbbrowser->mpdclient)))
@@ -368,7 +387,7 @@
   if (!xfmpc_dbbrowser_wdir_is_root (dbbrowser))
     {
       filename = xfmpc_dbbrowser_get_parent_wdir (dbbrowser);
-      xfmpc_dbbrowser_append (dbbrowser, filename, "..", TRUE);
+      xfmpc_dbbrowser_append (dbbrowser, filename, "..", TRUE, FALSE);
       g_free (filename);
       i++;
     }
@@ -376,7 +395,8 @@
   while (xfmpc_mpdclient_database_read (dbbrowser->mpdclient, priv->wdir,
                                         &filename, &basename, &is_dir))
     {
-      xfmpc_dbbrowser_append (dbbrowser, filename, basename, is_dir);
+      is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename);
+      xfmpc_dbbrowser_append (dbbrowser, filename, basename, is_dir, is_bold);
 
       if (i >= 0)
         {
@@ -389,7 +409,8 @@
 
               i = -1;
             }
-          i++;
+          else
+            i++;
         }
 
       g_free (filename);
@@ -404,6 +425,7 @@
   XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
   gchar                    *filename;
   gchar                    *basename;
+  gboolean                  is_bold;
   gint                      i = 0;
   static gboolean           no_result, no_result_buf;
   GdkColor                  color = {0, 0xFFFF, 0x6666, 0x6666};
@@ -416,7 +438,8 @@
 
   while (xfmpc_mpdclient_database_search (dbbrowser->mpdclient, query, &filename, &basename))
     {
-      xfmpc_dbbrowser_append (dbbrowser, filename, basename, FALSE);
+      is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename);
+      xfmpc_dbbrowser_append (dbbrowser, filename, basename, FALSE, is_bold);
       g_free (filename);
       g_free (basename);
       i++;
@@ -599,6 +622,17 @@
 popup_menu (XfmpcDbbrowser *dbbrowser)
 {
   XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
+  GtkTreeSelection      *selection;
+  gint                   count;
+
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
+  count = gtk_tree_selection_count_selected_rows (selection);
+
+  if (priv->is_searching && count == 1)
+    gtk_widget_show (priv->mi_browse);
+  else
+    gtk_widget_hide (priv->mi_browse);
+
   gtk_menu_popup (GTK_MENU (priv->menu),
                   NULL, NULL,
                   NULL, NULL,
@@ -606,8 +640,39 @@
                   gtk_get_current_event_time ());
 }
 
+static void
+cb_browse (XfmpcDbbrowser *dbbrowser)
+{
+  XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
+  GtkTreeSelection      *selection;
+  GtkTreeModel          *store = GTK_TREE_MODEL (priv->store);
+  GtkTreeIter            iter;
+  GList                 *list;
+  gchar                 *dir, *filename;
 
+  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_FILENAME, &filename,
+                          -1);
+
+      priv->is_searching = FALSE;
+      dir = g_path_get_dirname (filename);
+      xfmpc_dbbrowser_set_wdir (dbbrowser, dir);
+      xfmpc_dbbrowser_reload (dbbrowser);
+
+      g_free (filename);
+      g_free (dir);
+    }
+}
+
+
+
 static void
 cb_search_entry_activated (XfmpcDbbrowser *dbbrowser)
 {
@@ -675,3 +740,33 @@
   priv->search_timeout = 0;
 }
 
+
+
+static void
+cb_playlist_changed (XfmpcDbbrowser *dbbrowser)
+{
+  XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER (dbbrowser)->priv;
+  GtkTreeModel         *store = GTK_TREE_MODEL (priv->store);
+  GtkTreeIter           iter;
+  gchar                *filename;
+  gboolean              is_bold;
+
+  if (!gtk_tree_model_get_iter_first (store, &iter))
+    return;
+
+  do
+    {
+      gtk_tree_model_get (store, &iter,
+                          COLUMN_FILENAME, &filename,
+                          -1);
+
+      is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename);
+      gtk_list_store_set (GTK_LIST_STORE (store), &iter,
+                          COLUMN_WEIGHT, is_bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
+                          -1);
+
+      g_free (filename);
+    }
+  while (gtk_tree_model_iter_next (store, &iter));
+}
+

Modified: xfmpc/trunk/src/dbbrowser.h
===================================================================
--- xfmpc/trunk/src/dbbrowser.h	2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/dbbrowser.h	2009-02-16 08:56:24 UTC (rev 6696)
@@ -43,7 +43,8 @@
 void            xfmpc_dbbrowser_append                         (XfmpcDbbrowser *dbbrowser,
                                                                 gchar *filename,
                                                                 gchar *basename,
-                                                                gboolean is_dir);
+                                                                gboolean is_dir,
+                                                                gboolean is_bold);
 
 void            xfmpc_dbbrowser_add_selected_rows              (XfmpcDbbrowser *dbbrowser);
 void            xfmpc_dbbrowser_replace_with_selected_rows     (XfmpcDbbrowser *dbbrowser);

Modified: xfmpc/trunk/src/extended-interface.c
===================================================================
--- xfmpc/trunk/src/extended-interface.c	2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/extended-interface.c	2009-02-16 08:56:24 UTC (rev 6696)
@@ -57,8 +57,6 @@
                                                             (XfmpcExtendedInterface *extended_interface,
                                                              GtkWidget *attach_widget);
 static void             xfmpc_server_dialog_show            (XfmpcExtendedInterface *extended_interface);
-static void             cb_use_defaults_toggled             (GtkToggleButton *button,
-                                                             GtkWidget *widget);
 
 static void             cb_interface_changed                (GtkComboBox *widget,
                                                              XfmpcExtendedInterface *extended_interface);
@@ -74,6 +72,8 @@
                                                              gint *y,
                                                              gboolean *push_in,
                                                              GtkWidget *widget);
+static void             cb_use_defaults_toggled             (GtkToggleButton *button,
+                                                             GtkWidget *widget);
 
 
 

Modified: xfmpc/trunk/src/main.c
===================================================================
--- xfmpc/trunk/src/main.c	2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/main.c	2009-02-16 08:56:24 UTC (rev 6696)
@@ -37,6 +37,7 @@
 #include "main-ui.h"
 #include "interface.h"
 #include "extended-interface.h"
+#include "statusbar.h"
 
 #define BORDER 4
 
@@ -102,17 +103,6 @@
 
   gtk_window_set_default_icon_name ("xfmpc");
 
-  /* Window */
-  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_icon_name (GTK_WINDOW (window), "stock_volume");
-  gtk_window_set_title (GTK_WINDOW (window), _("Xfmpc"));
-  gtk_window_set_default_size (GTK_WINDOW (window), 330, 330);
-  g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (cb_window_closed), NULL);
-  g_signal_connect (G_OBJECT (window), "window-state-event", G_CALLBACK (cb_window_state_event), NULL);
-
-  GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
-  gtk_container_add (GTK_CONTAINER (window), vbox);
-
   /* Read window preferences */
   gint posx, posy;
   gint width, height;
@@ -126,6 +116,18 @@
                 "last-window-height", &height,
                 "last-window-state-sticky", &sticky,
                 NULL);
+
+  /* Window */
+  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_icon_name (GTK_WINDOW (window), "stock_volume");
+  gtk_window_set_title (GTK_WINDOW (window), _("Xfmpc"));
+  gtk_window_set_default_size (GTK_WINDOW (window), 330, 330);
+  g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (cb_window_closed), NULL);
+  g_signal_connect (G_OBJECT (window), "window-state-event", G_CALLBACK (cb_window_state_event), NULL);
+
+  GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
+  gtk_container_add (GTK_CONTAINER (window), vbox);
+
   if (G_LIKELY (posx != -1 && posy != -1))
     gtk_window_move (GTK_WINDOW (window), posx, posy);
   if (G_LIKELY (width != -1 && height != -1))
@@ -148,6 +150,10 @@
   GtkWidget *extended_interface = xfmpc_extended_interface_new ();
   gtk_box_pack_start (GTK_BOX (vbox), extended_interface, TRUE, TRUE, 0);
 
+  /* Statusbar */
+  GtkWidget *statusbar = xfmpc_statusbar_new ();
+  gtk_box_pack_start (GTK_BOX (vbox), statusbar, FALSE, FALSE, 2);
+
   gtk_widget_show_all (window);
 
   /* Accelerators */

Modified: xfmpc/trunk/src/mpdclient.c
===================================================================
--- xfmpc/trunk/src/mpdclient.c	2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/mpdclient.c	2009-02-16 08:56:24 UTC (rev 6696)
@@ -630,7 +630,7 @@
   if (what & MPD_CST_PLAYLIST)
     g_signal_emit (mpdclient, signals[SIG_PLAYLIST_CHANGED], 0);
 
-  if (what & MPD_CST_SONGID && !(what & MPD_CST_DATABASE))
+  if (what & MPD_CST_SONGID && !(what & (MPD_CST_DATABASE|MPD_CST_PLAYLIST)))
     g_signal_emit (mpdclient, signals[SIG_SONG_CHANGED], 0);
 
   if (what & MPD_CST_STATE)
@@ -703,7 +703,7 @@
 {
   gint id;
 
-  while (xfmpc_mpdclient_playlist_read (mpdclient, &id, NULL, NULL))
+  while (xfmpc_mpdclient_playlist_read (mpdclient, &id, NULL, NULL, NULL))
     {
       if (!xfmpc_mpdclient_queue_remove_id (mpdclient, id))
         return FALSE;
@@ -717,6 +717,7 @@
 gboolean
 xfmpc_mpdclient_playlist_read (XfmpcMpdclient *mpdclient,
                                gint *id,
+                               gchar **filename,
                                gchar **song,
                                gchar **length)
 {
@@ -730,6 +731,8 @@
 
   if (NULL != data)
     {
+      if (NULL != filename)
+        *filename = g_strdup (data->song->file);
       if (NULL != song)
         *song = _get_formatted_name (data->song);
       if (NULL != length)
@@ -751,7 +754,49 @@
   return TRUE;
 }
 
+gint
+xfmpc_mpdclient_playlist_get_length (XfmpcMpdclient *mpdclient)
+{
+  return mpd_playlist_get_playlist_length (mpdclient->priv->mi);
+}
+
+gint
+xfmpc_mpdclient_playlist_get_total_time (XfmpcMpdclient *mpdclient)
+{
+  XfmpcMpdclientPrivate *priv = mpdclient->priv;
+  MpdData               *data;
+  gint                   seconds;
+
+  for (seconds = 0, data = mpd_playlist_get_changes (priv->mi, -1);
+       data != NULL; data = mpd_data_get_next (data))
+    seconds += data->song->time;
+
+  return seconds;
+}
+
 gboolean
+xfmpc_mpdclient_playlist_has_filename (XfmpcMpdclient *mpdclient,
+                                       const gchar *filename)
+{
+  XfmpcMpdclientPrivate *priv = mpdclient->priv;
+  MpdData               *data;
+
+  mpd_playlist_search_start (priv->mi, TRUE);
+  mpd_playlist_search_add_constraint (priv->mi, MPD_TAG_ITEM_FILENAME, filename);
+  data = mpd_playlist_search_commit (priv->mi);
+
+  if (data != NULL)
+    {
+      mpd_data_free (data);
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+
+
+gboolean
 xfmpc_mpdclient_database_refresh (XfmpcMpdclient *mpdclient)
 {
   XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT (mpdclient)->priv;

Modified: xfmpc/trunk/src/mpdclient.h
===================================================================
--- xfmpc/trunk/src/mpdclient.h	2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/mpdclient.h	2009-02-16 08:56:24 UTC (rev 6696)
@@ -83,9 +83,14 @@
 
 gboolean                xfmpc_mpdclient_playlist_read           (XfmpcMpdclient *mpdclient,
                                                                  gint *id,
+                                                                 gchar **filename,
                                                                  gchar **song,
                                                                  gchar **length);
 gboolean                xfmpc_mpdclient_playlist_clear          (XfmpcMpdclient *mpdclient);
+gint                    xfmpc_mpdclient_playlist_get_length     (XfmpcMpdclient *mpdclient);
+gint                    xfmpc_mpdclient_playlist_get_total_time (XfmpcMpdclient *mpdclient);
+gboolean                xfmpc_mpdclient_playlist_has_filename   (XfmpcMpdclient *mpdclient,
+                                                                 const gchar *filename);
 
 gboolean                xfmpc_mpdclient_database_refresh        (XfmpcMpdclient *mpdclient);
 gboolean                xfmpc_mpdclient_database_read           (XfmpcMpdclient *mpdclient,

Modified: xfmpc/trunk/src/playlist.c
===================================================================
--- xfmpc/trunk/src/playlist.c	2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/playlist.c	2009-02-16 08:56:24 UTC (rev 6696)
@@ -66,6 +66,7 @@
 enum
 {
   COLUMN_ID,
+  COLUMN_FILENAME,
   COLUMN_SONG,
   COLUMN_LENGTH,
   COLUMN_WEIGHT,
@@ -165,6 +166,7 @@
                                     G_TYPE_INT,
                                     G_TYPE_STRING,
                                     G_TYPE_STRING,
+                                    G_TYPE_STRING,
                                     G_TYPE_INT);
 
   /* === Filter === */
@@ -283,6 +285,7 @@
 void
 xfmpc_playlist_append (XfmpcPlaylist *playlist,
                        gint id,
+                       gchar *filename,
                        gchar *song,
                        gchar *length)
 {
@@ -292,6 +295,7 @@
   gtk_list_store_append (priv->store, &iter);
   gtk_list_store_set (priv->store, &iter,
                       COLUMN_ID, id,
+                      COLUMN_FILENAME, filename,
                       COLUMN_SONG, song,
                       COLUMN_LENGTH, length,
                       COLUMN_WEIGHT, PANGO_WEIGHT_NORMAL,
@@ -389,15 +393,16 @@
 cb_playlist_changed (XfmpcPlaylist *playlist)
 {
   XfmpcPlaylistPrivate *priv = XFMPC_PLAYLIST (playlist)->priv;
-  gchar                *song, *length;
+  gchar                *filename, *song, *length;
   gint                  id, current;
 
   current = xfmpc_mpdclient_get_id (playlist->mpdclient);
 
   xfmpc_playlist_clear (playlist);
-  while (xfmpc_mpdclient_playlist_read (playlist->mpdclient, &id, &song, &length))
+  while (xfmpc_mpdclient_playlist_read (playlist->mpdclient, &id, &filename, &song, &length))
     {
-      xfmpc_playlist_append (playlist, id, song, length);
+      xfmpc_playlist_append (playlist, id, filename, song, length);
+      g_free (filename);
       g_free (song);
       g_free (length);
     }

Modified: xfmpc/trunk/src/playlist.h
===================================================================
--- xfmpc/trunk/src/playlist.h	2009-02-15 20:09:45 UTC (rev 6695)
+++ xfmpc/trunk/src/playlist.h	2009-02-16 08:56:24 UTC (rev 6696)
@@ -41,6 +41,7 @@
 
 void                    xfmpc_playlist_append                   (XfmpcPlaylist *playlist,
                                                                  gint id,
+                                                                 gchar *filename,
                                                                  gchar *song,
                                                                  gchar *length);
 void                    xfmpc_playlist_clear                    (XfmpcPlaylist *playlist);

Added: xfmpc/trunk/src/statusbar.c
===================================================================
--- xfmpc/trunk/src/statusbar.c	                        (rev 0)
+++ xfmpc/trunk/src/statusbar.c	2009-02-16 08:56:24 UTC (rev 6696)
@@ -0,0 +1,202 @@
+/*
+ *  Copyright (c) 2009 Vincent Legout <vincent at legout.info>
+ *  Copyright (c) 2009 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 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 "statusbar.h"
+#include "mpdclient.h"
+
+#define GET_PRIVATE(o) \
+    (G_TYPE_INSTANCE_GET_PRIVATE ((o), XFMPC_TYPE_STATUSBAR, XfmpcStatusbarPrivate))
+
+
+
+static void             xfmpc_statusbar_class_init             (XfmpcStatusbarClass *klass);
+static void             xfmpc_statusbar_init                   (XfmpcStatusbar *statusbar);
+static void             xfmpc_statusbar_finalize               (GObject *object);
+static void             xfmpc_statusbar_set_property           (GObject *object,
+                                                                guint prop_id,
+                                                                const GValue *value,
+                                                                GParamSpec *pspec);
+
+static void             cb_playlist_changed                    (XfmpcStatusbar *statusbar);
+
+
+
+enum
+{
+  TEXT = 1,
+};
+
+
+
+struct _XfmpcStatusbarClass
+{
+  GtkStatusbarClass         parent;
+};
+
+struct _XfmpcStatusbar
+{
+  GtkStatusbar              parent;
+  XfmpcMpdclient           *mpdclient;
+  /*<private>*/
+  XfmpcStatusbarPrivate    *priv;
+};
+
+struct _XfmpcStatusbarPrivate
+{
+  guint                     context_id;
+};
+
+
+
+static GObjectClass *parent_class = NULL;
+
+
+
+GType
+xfmpc_statusbar_get_type (void)
+{
+  static GType xfmpc_statusbar_type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (xfmpc_statusbar_type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo xfmpc_statusbar_info =
+      {
+        sizeof (XfmpcStatusbarClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) xfmpc_statusbar_class_init,
+        NULL,
+        NULL,
+        sizeof (XfmpcStatusbar),
+        0,
+        (GInstanceInitFunc) xfmpc_statusbar_init,
+        NULL,
+      };
+
+      xfmpc_statusbar_type = g_type_register_static (GTK_TYPE_STATUSBAR, "XfmpcStatusbar", &xfmpc_statusbar_info, 0);
+    }
+
+  return xfmpc_statusbar_type;
+}
+
+static void
+xfmpc_statusbar_class_init (XfmpcStatusbarClass *klass)
+{
+  GObjectClass *gobject_class;
+
+  g_type_class_add_private (klass, sizeof (XfmpcStatusbarPrivate));
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = xfmpc_statusbar_finalize;
+  gobject_class->set_property = xfmpc_statusbar_set_property;
+
+  g_object_class_install_property (gobject_class,
+                                   TEXT,
+                                   g_param_spec_string ("text",
+                                                        "Text",
+                                                        "Text in the statusbar",
+                                                        NULL,
+                                                        G_PARAM_WRITABLE));
+}
+
+static void
+xfmpc_statusbar_init (XfmpcStatusbar *statusbar)
+{
+  XfmpcStatusbarPrivate *priv = statusbar->priv = GET_PRIVATE (statusbar);
+
+  statusbar->mpdclient = xfmpc_mpdclient_get ();
+
+  priv->context_id = gtk_statusbar_get_context_id (GTK_STATUSBAR (statusbar), "Main text");
+  gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbar), FALSE);
+
+  /* === Signals === */
+  g_signal_connect_swapped (statusbar->mpdclient, "playlist-changed",
+                            G_CALLBACK (cb_playlist_changed), statusbar);
+}
+
+static void
+xfmpc_statusbar_finalize (GObject *object)
+{
+  XfmpcStatusbar *statusbar = XFMPC_STATUSBAR (object);
+  g_object_unref (statusbar->mpdclient);
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+xfmpc_statusbar_set_property (GObject *object,
+                              guint prop_id,
+                              const GValue *value,
+                              GParamSpec   *pspec)
+{
+  XfmpcStatusbar *statusbar = XFMPC_STATUSBAR (object);
+
+  switch (prop_id)
+    {
+    case TEXT:
+      xfmpc_statusbar_set_text (statusbar, g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+GtkWidget*
+xfmpc_statusbar_new (void)
+{
+  return g_object_new (XFMPC_TYPE_STATUSBAR, NULL);
+}
+
+void
+xfmpc_statusbar_set_text (XfmpcStatusbar *statusbar,
+                          const gchar *text)
+{
+  XfmpcStatusbarPrivate *priv = statusbar->priv = GET_PRIVATE (statusbar);
+
+  gtk_statusbar_pop (GTK_STATUSBAR (statusbar), priv->context_id);
+  gtk_statusbar_push (GTK_STATUSBAR (statusbar), priv->context_id, text);
+}
+
+static void
+cb_playlist_changed (XfmpcStatusbar *statusbar)
+{
+  gchar    *text;
+  gint      seconds, length;
+
+  length = xfmpc_mpdclient_playlist_get_length (statusbar->mpdclient);
+  seconds = xfmpc_mpdclient_playlist_get_total_time (statusbar->mpdclient);
+
+  if (seconds / 3600 > 0)
+    text = g_strdup_printf ("%d songs, %d hours and %d minutes", length, seconds / 3600, (seconds / 60) % 60);
+  else
+    text = g_strdup_printf ("%d songs, %d minutes", length, (seconds / 60) % 60);
+
+  xfmpc_statusbar_set_text (statusbar, text);
+  g_free (text);
+}
+

Added: xfmpc/trunk/src/statusbar.h
===================================================================
--- xfmpc/trunk/src/statusbar.h	                        (rev 0)
+++ xfmpc/trunk/src/statusbar.h	2009-02-16 08:56:24 UTC (rev 6696)
@@ -0,0 +1,46 @@
+/*
+ *  Copyright (c) 2009 Vincent Legout <vincent at legout.info>
+ *
+ *  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_STATUSBAR_H__
+#define __XFMPC_STATUSBAR_H__
+
+G_BEGIN_DECLS;
+
+#define XFMPC_TYPE_STATUSBAR               (xfmpc_statusbar_get_type ())
+
+#define XFMPC_STATUSBAR(obj)               (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFMPC_TYPE_STATUSBAR, XfmpcStatusbar))
+#define XFMPC_STATUSBAR_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST ((klass), XFMPC_TYPE_STATUSBAR, XfmpcStatusbarClass))
+#define XFMPC_IS_STATUSBAR(obj)            (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFMPC_TYPE_STATUSBAR))
+#define XFMPC_IS_STATUSBAR_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE ((klass), XFMPC_TYPE_STATUSBAR))
+#define XFMPC_STATUSBAR_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), XFMPC_TYPE_STATUSBAR, XfmpcStatusbarClass))
+
+typedef struct _XfmpcStatusbarClass        XfmpcStatusbarClass;
+typedef struct _XfmpcStatusbar             XfmpcStatusbar;
+typedef struct _XfmpcStatusbarPrivate      XfmpcStatusbarPrivate;
+
+GType          xfmpc_statusbar_get_type    (void) G_GNUC_CONST;
+
+GtkWidget*     xfmpc_statusbar_new         (void);
+
+void           xfmpc_statusbar_set_text    (XfmpcStatusbar *statusbar,
+                                            const gchar *text);
+
+G_END_DECLS;
+
+#endif
+




More information about the Goodies-commits mailing list