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

Mike Massonnet mmassonnet at xfce.org
Tue Feb 24 22:08:21 CET 2009


Author: mmassonnet
Date: 2009-02-24 21:08:21 +0000 (Tue, 24 Feb 2009)
New Revision: 6775

Added:
   xfmpc/trunk/src/preferences-dialog.c
   xfmpc/trunk/src/preferences-dialog.h
Modified:
   xfmpc/trunk/ChangeLog
   xfmpc/trunk/src/Makefile.am
   xfmpc/trunk/src/dbbrowser.c
   xfmpc/trunk/src/extended-interface.c
   xfmpc/trunk/src/main.c
   xfmpc/trunk/src/mpdclient.c
   xfmpc/trunk/src/mpdclient.h
   xfmpc/trunk/src/preferences.c
   xfmpc/trunk/src/statusbar.c
   xfmpc/trunk/src/statusbar.h
Log:
Preferences dialog and enhancements

Modified: xfmpc/trunk/ChangeLog
===================================================================
--- xfmpc/trunk/ChangeLog	2009-02-24 18:47:06 UTC (rev 6774)
+++ xfmpc/trunk/ChangeLog	2009-02-24 21:08:21 UTC (rev 6775)
@@ -1,3 +1,29 @@
+2009-02-24	Mike Massonnet <mmassonnet at gmail.com>
+
+Preferences dialog and enhancements by Vincent Legout
+	* src/preferences.c:
+	  - New option ShowStatusbar
+	* src/preferences-dialog., src/preferences-dialog.h:
+	  - New preferences dialog
+	* src/extended-interface.c, src/main.c:
+	  - Move statusbar fom main.c to XfmpcExtendedInterface
+	  - Use a GtkActionGroup to update the visibility of the status bar WRT
+	  the corresponding option in XfmpcPreferences
+	  - Update the statusbar text WRT to playlist changes
+	  - Remove code for the mpd settings, use the new XfmpcPreferencesDialog
+	* src/statusbar.c:
+	  - Don't get a pointer on the mpdclient object and don't update the
+	  statusbar from within the object
+	* src/mpdclient.c(xfmpc_mpdclient_playlist_has_filename),
+	  src/mpdclient.h:
+	  - New argument gboolean is_dir to make a one level recursive
+	  verification inside the directory to know if a song from the
+	  directory is in the playlist
+	* src/dbbrowser.c:
+	  - Use updated function xfmpc_mpdclient_playlist_has_filename thus
+	  setting the listed directories in bold if they contain songs in the
+	  playlist
+
 2009-02-16	Mike Massonnet <mmassonnet at gmail.com>
 
 Fix song changes

Modified: xfmpc/trunk/src/Makefile.am
===================================================================
--- xfmpc/trunk/src/Makefile.am	2009-02-24 18:47:06 UTC (rev 6774)
+++ xfmpc/trunk/src/Makefile.am	2009-02-24 21:08:21 UTC (rev 6775)
@@ -16,6 +16,8 @@
 	statusbar.h							\
 	preferences.c							\
 	preferences.h							\
+	preferences-dialog.c						\
+	preferences-dialog.h						\
 	mpdclient.c							\
 	mpdclient.h							\
 	xfce-arrow-button.c						\

Modified: xfmpc/trunk/src/dbbrowser.c
===================================================================
--- xfmpc/trunk/src/dbbrowser.c	2009-02-24 18:47:06 UTC (rev 6774)
+++ xfmpc/trunk/src/dbbrowser.c	2009-02-24 21:08:21 UTC (rev 6775)
@@ -395,7 +395,7 @@
   while (xfmpc_mpdclient_database_read (dbbrowser->mpdclient, priv->wdir,
                                         &filename, &basename, &is_dir))
     {
-      is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename);
+      is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename, is_dir);
       xfmpc_dbbrowser_append (dbbrowser, filename, basename, is_dir, is_bold);
 
       if (i >= 0)
@@ -438,7 +438,7 @@
 
   while (xfmpc_mpdclient_database_search (dbbrowser->mpdclient, query, &filename, &basename))
     {
-      is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename);
+      is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename, 0);
       xfmpc_dbbrowser_append (dbbrowser, filename, basename, FALSE, is_bold);
       g_free (filename);
       g_free (basename);
@@ -750,6 +750,7 @@
   GtkTreeIter           iter;
   gchar                *filename;
   gboolean              is_bold;
+  gboolean              is_dir;
 
   if (!gtk_tree_model_get_iter_first (store, &iter))
     return;
@@ -758,9 +759,10 @@
     {
       gtk_tree_model_get (store, &iter,
                           COLUMN_FILENAME, &filename,
+                          COLUMN_IS_DIR, &is_dir,
                           -1);
 
-      is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename);
+      is_bold = xfmpc_mpdclient_playlist_has_filename (dbbrowser->mpdclient, filename, is_dir);
       gtk_list_store_set (GTK_LIST_STORE (store), &iter,
                           COLUMN_WEIGHT, is_bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
                           -1);

Modified: xfmpc/trunk/src/extended-interface.c
===================================================================
--- xfmpc/trunk/src/extended-interface.c	2009-02-24 18:47:06 UTC (rev 6774)
+++ xfmpc/trunk/src/extended-interface.c	2009-02-24 21:08:21 UTC (rev 6775)
@@ -28,7 +28,9 @@
 #include "mpdclient.h"
 #include "playlist.h"
 #include "dbbrowser.h"
+#include "statusbar.h"
 #include "xfce-arrow-button.h"
+#include "preferences-dialog.h"
 #include "preferences.h"
 
 #define BORDER 4
@@ -48,35 +50,48 @@
 
 
 
-static void             xfmpc_extended_interface_class_init (XfmpcExtendedInterfaceClass *klass);
-static void             xfmpc_extended_interface_init       (XfmpcExtendedInterface *extended_interface);
-static void             xfmpc_extended_interface_dispose    (GObject *object);
-static void             xfmpc_extended_interface_finalize   (GObject *object);
+static void xfmpc_extended_interface_class_init               (XfmpcExtendedInterfaceClass *klass);
+static void xfmpc_extended_interface_init                     (XfmpcExtendedInterface *extended_interface);
+static void xfmpc_extended_interface_dispose                  (GObject *object);
+static void xfmpc_extended_interface_finalize                 (GObject *object);
 
-static void             xfmpc_extended_interface_context_menu_new
-                                                            (XfmpcExtendedInterface *extended_interface,
-                                                             GtkWidget *attach_widget);
-static void             xfmpc_server_dialog_show            (XfmpcExtendedInterface *extended_interface);
+static void xfmpc_extended_interface_context_menu_new         (XfmpcExtendedInterface *extended_interface,
+                                                               GtkWidget *attach_widget);
+static void xfmpc_preferences_dialog_show                     (XfmpcExtendedInterface *extended_interface);
 
-static void             cb_interface_changed                (GtkComboBox *widget,
-                                                             XfmpcExtendedInterface *extended_interface);
-static void             cb_repeat_switch                    (XfmpcExtendedInterface *extended_interface);
-static void             cb_random_switch                    (XfmpcExtendedInterface *extended_interface);
-static void             cb_context_menu_clicked             (GtkToggleButton *button,
-                                                             XfmpcExtendedInterface *extended_interface);
-static void             cb_context_menu_deactivate          (GtkMenuShell *menu,
-                                                             GtkWidget *attach_widget);
-static void             popup_context_menu                  (XfmpcExtendedInterface *extended_interface);
-static void             position_context_menu               (GtkMenu *menu,
-                                                             gint *x,
-                                                             gint *y,
-                                                             gboolean *push_in,
-                                                             GtkWidget *widget);
-static void             cb_use_defaults_toggled             (GtkToggleButton *button,
-                                                             GtkWidget *widget);
+static void cb_interface_changed                              (GtkComboBox *widget,
+                                                               XfmpcExtendedInterface *extended_interface);
+static void cb_repeat_switch                                  (XfmpcExtendedInterface *extended_interface);
+static void cb_random_switch                                  (XfmpcExtendedInterface *extended_interface);
+static void cb_context_menu_clicked                           (GtkToggleButton *button,
+                                                               XfmpcExtendedInterface *extended_interface);
+static void cb_context_menu_deactivate                        (GtkMenuShell *menu,
+                                                               GtkWidget *attach_widget);
+static void popup_context_menu                                (XfmpcExtendedInterface *extended_interface);
+static void position_context_menu                             (GtkMenu *menu,
+                                                               gint *x,
+                                                               gint *y,
+                                                               gboolean *push_in,
+                                                               GtkWidget *widget);
 
+static void xfmpc_extended_interface_action_statusbar_changed (GtkToggleAction *action,
+                                                               XfmpcExtendedInterface *extended_interface);
 
+static void xfmpc_extended_interface_update_statusbar         (XfmpcExtendedInterface *extended_interface);
 
+static void cb_playlist_changed                               (XfmpcExtendedInterface *extended_interface);
+static void cb_show_statusbar_changed                         (XfmpcExtendedInterface *extended_interface,
+                                                               GParamSpec *pspec);
+
+
+
+static const GtkToggleActionEntry toggle_action_entries[] =
+{
+  { "view-statusbar", NULL, "Statusbar", NULL, "Change the visibility of the statusbar", G_CALLBACK (xfmpc_extended_interface_action_statusbar_changed), FALSE, },
+};
+
+
+
 struct _XfmpcExtendedInterfaceClass
 {
   GtkVBoxClass                      parent_class;
@@ -86,17 +101,20 @@
 {
   GtkVBox                           parent;
   XfmpcMpdclient                   *mpdclient;
+  XfmpcPreferences                 *preferences;
   /*<private>*/
   XfmpcExtendedInterfacePrivate    *priv;
 };
 
 struct _XfmpcExtendedInterfacePrivate
 {
+  GtkActionGroup                   *action_group;
   GtkListStore                     *list_store;
   GtkWidget                        *combobox;
   GtkWidget                        *notebook;
   GtkWidget                        *context_button;
   GtkWidget                        *context_menu;
+  GtkWidget                        *statusbar;
 };
 
 
@@ -151,8 +169,11 @@
 xfmpc_extended_interface_init (XfmpcExtendedInterface *extended_interface)
 {
   XfmpcExtendedInterfacePrivate *priv = extended_interface->priv = GET_PRIVATE (extended_interface);
+  GtkAction *action;
+  gboolean active;
 
   extended_interface->mpdclient = xfmpc_mpdclient_get ();
+  extended_interface->preferences = xfmpc_preferences_get ();
 
   /* Hbox  */
   GtkWidget *hbox = gtk_hbox_new (FALSE, 2);
@@ -215,6 +236,23 @@
 
   child = xfmpc_dbbrowser_new ();
   xfmpc_extended_interface_append_child (extended_interface, child, _("Browse database"));
+
+  /* Action Group */
+  priv->action_group = gtk_action_group_new ("XfmpxExtendedInterface");
+  gtk_action_group_add_toggle_actions (priv->action_group, toggle_action_entries,
+                                       G_N_ELEMENTS (toggle_action_entries), GTK_WIDGET (extended_interface));
+
+  /* show-statusbar action */
+  action = gtk_action_group_get_action (priv->action_group, "view-statusbar");
+  g_object_get (G_OBJECT (extended_interface->preferences), "show-statusbar", &active, NULL);
+  gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active);
+
+  /* === Signals === */
+  g_signal_connect_swapped (extended_interface->mpdclient, "playlist-changed",
+                            G_CALLBACK (cb_playlist_changed), extended_interface);
+
+  g_signal_connect_swapped (extended_interface->preferences, "notify::show-statusbar",
+                            G_CALLBACK (cb_show_statusbar_changed), extended_interface);
 }
 
 static void
@@ -304,119 +342,20 @@
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
 
   GtkWidget *image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);
-  mi = gtk_image_menu_item_new_with_label (_("MPD Settings"));
+  mi = gtk_image_menu_item_new_with_label (_("Preferences"));
   gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
   g_signal_connect_swapped (mi, "activate",
-                            G_CALLBACK (xfmpc_server_dialog_show), extended_interface);
+                            G_CALLBACK (xfmpc_preferences_dialog_show), extended_interface);
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
 
   gtk_widget_show_all (menu);
 }
 
 static void
-xfmpc_server_dialog_show (XfmpcExtendedInterface *extended_interface)
+xfmpc_preferences_dialog_show (XfmpcExtendedInterface *extended_interface)
 {
-  XfmpcPreferences *preferences;
-  GtkWidget *dialog;
-  GtkWidget *frame;
-  GtkWidget *alignment;
-  GtkWidget *vbox, *vbox2;
-  GtkWidget *hbox;
-  GtkWidget *label;
-  GtkWidget *entry_use_defaults;
-  GtkWidget *entry_host;
-  GtkWidget *entry_port;
-  GtkWidget *entry_passwd;
-  gchar *host, *passwd;
-  guint port;
-  gboolean use_defaults;
-  gint res;
-
-  preferences = xfmpc_preferences_get ();
-  g_object_get (preferences,
-                "mpd-hostname", &host,
-                "mpd-port", &port,
-                "mpd-password", &passwd,
-                "mpd-use-defaults", &use_defaults,
-                NULL);
-
-  dialog = gtk_dialog_new_with_buttons (_("MPD Settings"),
-    GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (extended_interface))),
-    GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_NO_SEPARATOR,
-    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-    GTK_STOCK_OK, GTK_RESPONSE_OK,
-    NULL);
-  gtk_window_set_icon_name (GTK_WINDOW (dialog), "stock_volume");
-  gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
-
-  frame = xfce_create_framebox (_("MPD Settings"), &alignment);
-  gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), frame);
-
-  vbox = gtk_vbox_new (FALSE, 6);
-  gtk_container_add (GTK_CONTAINER (alignment), vbox);
-
-  vbox2 = gtk_vbox_new (FALSE, 6);
-
-  hbox = gtk_hbox_new (FALSE, 2);
-  gtk_container_add (GTK_CONTAINER (vbox), hbox);
-  entry_use_defaults = gtk_check_button_new_with_label (_("Use default system settings"));
-  gtk_widget_set_tooltip_text (entry_use_defaults,
-                               _("If checked, Xfmpc will try to read the environment "
-                                 "variables MPD_HOST and MPD_PORT otherwise it will "
-                                 "use localhost"));
-  g_signal_connect (entry_use_defaults, "toggled",
-                    G_CALLBACK (cb_use_defaults_toggled), vbox2);
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_use_defaults), use_defaults);
-  gtk_box_pack_start (GTK_BOX (hbox), entry_use_defaults, TRUE, TRUE, 0);
-
-  gtk_container_add (GTK_CONTAINER (vbox), vbox2);
-
-  hbox = gtk_hbox_new (FALSE, 2);
-  gtk_container_add (GTK_CONTAINER (vbox2), hbox);
-  label = gtk_label_new (_("Hostname:"));
-  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-  entry_host = gtk_entry_new ();
-  gtk_entry_set_width_chars (GTK_ENTRY (entry_host), 15);
-  gtk_entry_set_text (GTK_ENTRY (entry_host), host);
-  gtk_box_pack_start (GTK_BOX (hbox), entry_host, TRUE, TRUE, 0);
-
-  label = gtk_label_new (_("Port:"));
-  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-  entry_port = gtk_spin_button_new_with_range (0, 65536, 1);
-  gtk_spin_button_set_digits (GTK_SPIN_BUTTON (entry_port), 0);
-  gtk_spin_button_set_value (GTK_SPIN_BUTTON (entry_port), port);
-  gtk_box_pack_start (GTK_BOX (hbox), entry_port, FALSE, FALSE, 0);
-
-  hbox = gtk_hbox_new (FALSE, 2);
-  gtk_container_add (GTK_CONTAINER (vbox2), hbox);
-  label = gtk_label_new (_("Password:"));
-  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-  entry_passwd = gtk_entry_new ();
-  gtk_entry_set_visibility (GTK_ENTRY (entry_passwd), FALSE);
-  if (passwd != NULL)
-    gtk_entry_set_text (GTK_ENTRY (entry_passwd), passwd);
-  gtk_box_pack_start (GTK_BOX (hbox), entry_passwd, TRUE, TRUE, 0);
-
-  gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);
-  res = gtk_dialog_run (GTK_DIALOG (dialog));
-
-  if (res == GTK_RESPONSE_OK)
-    {
-      g_object_set (G_OBJECT (preferences),
-                    "mpd-hostname", gtk_entry_get_text (GTK_ENTRY (entry_host)),
-                    "mpd-port", gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (entry_port)),
-                    "mpd-password", gtk_entry_get_text (GTK_ENTRY (entry_passwd)),
-                    "mpd-use-defaults", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_use_defaults)),
-                    NULL);
-
-      xfmpc_mpdclient_disconnect (extended_interface->mpdclient);
-      xfmpc_mpdclient_connect (extended_interface->mpdclient);
-    }
-
-  gtk_widget_destroy (dialog);
-  g_object_unref (preferences);
-  g_free (host);
-  g_free (passwd);
+  GtkWidget *dialog = xfmpc_preferences_dialog_new (NULL);
+  gtk_widget_show (dialog);
 }
 
 
@@ -517,9 +456,73 @@
 }
 
 static void
-cb_use_defaults_toggled (GtkToggleButton *button,
-                         GtkWidget *widget)
+xfmpc_extended_interface_action_statusbar_changed (GtkToggleAction *action,
+                                                   XfmpcExtendedInterface *extended_interface)
 {
-  gtk_widget_set_sensitive (widget, !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)));
+  XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE (extended_interface)->priv;
+
+  gboolean active;
+
+  active = gtk_toggle_action_get_active (action);
+  
+  if (!active && priv->statusbar != NULL)
+    {
+      gtk_widget_destroy (priv->statusbar);
+      priv->statusbar = NULL;
+    }
+  else if (active && priv->statusbar == NULL)
+    {
+      priv->statusbar = xfmpc_statusbar_new ();
+      gtk_widget_show (priv->statusbar);
+      gtk_box_pack_start (GTK_BOX (extended_interface), priv->statusbar, FALSE, FALSE, 2);
+    }
 }
 
+static void
+cb_playlist_changed (XfmpcExtendedInterface *extended_interface)
+{
+  XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE (extended_interface)->priv;
+
+  if (priv->statusbar == NULL)
+    return;
+
+  xfmpc_extended_interface_update_statusbar (extended_interface);
+}
+
+static void
+xfmpc_extended_interface_update_statusbar (XfmpcExtendedInterface *extended_interface)
+{
+  XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE (extended_interface)->priv;
+  gchar    *text;
+  gint      seconds, length;
+
+  if (priv->statusbar == NULL)
+    return;
+
+  length = xfmpc_mpdclient_playlist_get_length (extended_interface->mpdclient);
+  seconds = xfmpc_mpdclient_playlist_get_total_time (extended_interface->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);
+
+  g_object_set (G_OBJECT (priv->statusbar), "text", text, NULL);
+  g_free (text);
+}
+
+static void
+cb_show_statusbar_changed (XfmpcExtendedInterface *extended_interface,
+                           GParamSpec *pspec)
+{
+  XfmpcExtendedInterfacePrivate *priv = extended_interface->priv;
+  gboolean active;
+  GtkAction *action;
+
+  action = gtk_action_group_get_action (priv->action_group, "view-statusbar");
+  g_object_get (extended_interface->preferences, "show-statusbar", &active, NULL);
+
+  gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active);
+  xfmpc_extended_interface_update_statusbar (extended_interface);
+}
+

Modified: xfmpc/trunk/src/main.c
===================================================================
--- xfmpc/trunk/src/main.c	2009-02-24 18:47:06 UTC (rev 6774)
+++ xfmpc/trunk/src/main.c	2009-02-24 21:08:21 UTC (rev 6775)
@@ -37,7 +37,6 @@
 #include "main-ui.h"
 #include "interface.h"
 #include "extended-interface.h"
-#include "statusbar.h"
 
 #define BORDER 4
 
@@ -150,10 +149,6 @@
   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-24 18:47:06 UTC (rev 6774)
+++ xfmpc/trunk/src/mpdclient.c	2009-02-24 21:08:21 UTC (rev 6775)
@@ -776,19 +776,39 @@
 
 gboolean
 xfmpc_mpdclient_playlist_has_filename (XfmpcMpdclient *mpdclient,
-                                       const gchar *filename)
+                                       const gchar *filename,
+                                       gboolean is_dir)
 {
   XfmpcMpdclientPrivate *priv = mpdclient->priv;
   MpdData               *data;
+  gchar                 *basename;
+  gint                   id;
+  gboolean               found = FALSE;
 
-  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 (is_dir && strcmp (filename, ""))
+    {
+      while (xfmpc_mpdclient_playlist_read (mpdclient, &id, &basename, NULL, NULL))
+        {
+          if (g_str_has_prefix (basename, filename))
+            found = TRUE;
 
-  if (data != NULL)
+          g_free (basename);
+        }
+
+        if (found)
+          return TRUE;
+    }
+  else
     {
-      mpd_data_free (data);
-      return TRUE;
+      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;

Modified: xfmpc/trunk/src/mpdclient.h
===================================================================
--- xfmpc/trunk/src/mpdclient.h	2009-02-24 18:47:06 UTC (rev 6774)
+++ xfmpc/trunk/src/mpdclient.h	2009-02-24 21:08:21 UTC (rev 6775)
@@ -90,7 +90,8 @@
 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);
+                                                                 const gchar *filename,
+                                                                 gboolean is_dir);
 
 gboolean                xfmpc_mpdclient_database_refresh        (XfmpcMpdclient *mpdclient);
 gboolean                xfmpc_mpdclient_database_read           (XfmpcMpdclient *mpdclient,

Added: xfmpc/trunk/src/preferences-dialog.c
===================================================================
--- xfmpc/trunk/src/preferences-dialog.c	                        (rev 0)
+++ xfmpc/trunk/src/preferences-dialog.c	2009-02-24 21:08:21 UTC (rev 6775)
@@ -0,0 +1,318 @@
+/*
+ *  Copyright (c) 2009 Vincent Legout <vincent at legout.info>
+ *  Copyright (c) 2009 Mike Massonnet <mmassonnet at xfce.org>
+ *
+ *  Based on ThunarPreferencesDialog:
+ *  Copyright (c) 2005-2007 Benedikt Meurer <benny 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 "mpdclient.h"
+#include "preferences-dialog.h"
+#include "preferences.h"
+#include "statusbar.h"
+
+#define GET_PRIVATE(o) \
+    (G_TYPE_INSTANCE_GET_PRIVATE ((o), XFMPC_TYPE_PREFERENCES_DIALOG, XfmpcPreferencesDialogPrivate))
+
+
+
+static void               xfmpc_preferences_dialog_class_init (XfmpcPreferencesDialogClass *klass);
+static void               xfmpc_preferences_dialog_init       (XfmpcPreferencesDialog *dialog);
+static void               xfmpc_preferences_dialog_finalize   (GObject *object);
+
+static void               xfmpc_preferences_dialog_response   (GtkDialog *dialog,
+                                                               gint response);
+static void               cb_use_defaults_toggled             (GtkToggleButton *button,
+                                                               GtkWidget *widget);
+static void               cb_update_mpd                       (GtkButton *button,
+                                                               XfmpcPreferencesDialog *dialog);
+static void               cb_show_statusbar_toggled           (GtkToggleButton *button,
+                                                               XfmpcPreferencesDialog *dialog);
+
+
+
+struct _XfmpcPreferencesDialogClass
+{
+  XfceTitledDialogClass             parent_class;
+};
+
+struct _XfmpcPreferencesDialog
+{
+  XfceTitledDialog                  parent;
+  XfmpcPreferences                 *preferences;
+  /*<private>*/
+  XfmpcPreferencesDialogPrivate    *priv;
+};
+
+struct _XfmpcPreferencesDialogPrivate
+{
+  GtkWidget *entry_use_defaults;
+  GtkWidget *entry_host;
+  GtkWidget *entry_port;
+  GtkWidget *entry_passwd;
+  GtkWidget *statusbar_button;
+};
+
+
+
+static GObjectClass *parent_class = NULL;
+
+
+
+GType
+xfmpc_preferences_dialog_get_type (void)
+{
+  static GType xfmpc_preferences_dialog_type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (xfmpc_preferences_dialog_type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo xfmpc_preferences_dialog_info =
+      {
+        sizeof (XfmpcPreferencesDialogClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) xfmpc_preferences_dialog_class_init,
+        NULL,
+        NULL,
+        sizeof (XfmpcPreferencesDialog),
+        0,
+        (GInstanceInitFunc) xfmpc_preferences_dialog_init,
+        NULL,
+      };
+
+      xfmpc_preferences_dialog_type = g_type_register_static (XFCE_TYPE_TITLED_DIALOG, "XfmpcPreferencesDialog", &xfmpc_preferences_dialog_info, 0);
+    }
+
+  return xfmpc_preferences_dialog_type;
+}
+
+
+
+static void
+xfmpc_preferences_dialog_class_init (XfmpcPreferencesDialogClass *klass)
+{
+  GtkDialogClass *gtkdialog_class;
+  GObjectClass   *gobject_class;
+
+  g_type_class_add_private (klass, sizeof (XfmpcPreferencesDialogPrivate));
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = xfmpc_preferences_dialog_finalize;
+
+  gtkdialog_class = GTK_DIALOG_CLASS (klass);
+  gtkdialog_class->response = xfmpc_preferences_dialog_response;
+}
+
+static void
+xfmpc_preferences_dialog_init (XfmpcPreferencesDialog *dialog)
+{
+  XfmpcPreferencesDialogPrivate *priv = dialog->priv = GET_PRIVATE (dialog);
+
+  GtkWidget *notebook;
+  GtkWidget *vbox, *vbox2, *hbox;
+  GtkWidget *mpd_vbox;
+  GtkWidget *frame;
+  GtkWidget *label;
+  GtkWidget *button;
+
+  gchar *host, *passwd;
+  guint port;
+  gboolean use_defaults;
+  gboolean statusbar;
+
+  dialog->preferences = xfmpc_preferences_get ();
+
+  g_object_get (dialog->preferences,
+                "mpd-hostname", &host,
+                "mpd-port", &port,
+                "mpd-password", &passwd,
+                "mpd-use-defaults", &use_defaults,
+                "show-statusbar", &statusbar,
+                NULL);
+
+  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 Preferences"));
+
+  gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+                          GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
+                          NULL);
+
+  notebook = gtk_notebook_new ();
+  gtk_container_set_border_width (GTK_CONTAINER (notebook), 6);
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook, TRUE, TRUE, 0);
+  gtk_widget_show (notebook);
+
+  /*
+    MPD settings
+   */
+  vbox = gtk_vbox_new (FALSE, 6);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
+  label = gtk_label_new (_("MPD"));
+  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
+
+  vbox2 = gtk_vbox_new (FALSE, 6);
+  frame = xfce_create_framebox_with_content (_("Connection"), vbox2);
+  gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+
+  priv->entry_use_defaults = gtk_check_button_new_with_mnemonic (_("Use _default system settings"));
+  gtk_widget_set_tooltip_text (priv->entry_use_defaults,
+                               _("If checked, Xfmpc will try to read the environment "
+                                 "variables MPD_HOST and MPD_PORT otherwise it will "
+                                 "use localhost"));
+  gtk_container_add (GTK_CONTAINER (vbox2), priv->entry_use_defaults);
+
+  mpd_vbox = gtk_vbox_new (FALSE, 6);
+  gtk_container_add (GTK_CONTAINER (vbox2), mpd_vbox);
+
+  g_signal_connect (priv->entry_use_defaults, "toggled",
+                    G_CALLBACK (cb_use_defaults_toggled), mpd_vbox);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->entry_use_defaults), use_defaults);
+
+  hbox = gtk_hbox_new (FALSE, 2);
+  gtk_container_add (GTK_CONTAINER (mpd_vbox), hbox);
+
+  label = gtk_label_new (_("Hostname:"));
+  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+  priv->entry_host = gtk_entry_new ();
+  gtk_entry_set_width_chars (GTK_ENTRY (priv->entry_host), 15);
+  gtk_entry_set_text (GTK_ENTRY (priv->entry_host), host);
+  gtk_box_pack_start (GTK_BOX (hbox), priv->entry_host, TRUE, TRUE, 0);
+
+  label = gtk_label_new (_("Port:"));
+  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+  priv->entry_port = gtk_spin_button_new_with_range (0, 65536, 1);
+  gtk_spin_button_set_digits (GTK_SPIN_BUTTON (priv->entry_port), 0);
+  gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->entry_port), port);
+  gtk_box_pack_start (GTK_BOX (hbox), priv->entry_port, FALSE, FALSE, 0);
+
+  hbox = gtk_hbox_new (FALSE, 2);
+  gtk_container_add (GTK_CONTAINER (mpd_vbox), hbox);
+
+  label = gtk_label_new (_("Password:"));
+  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+  priv->entry_passwd = gtk_entry_new ();
+  gtk_entry_set_visibility (GTK_ENTRY (priv->entry_passwd), FALSE);
+  if (passwd != NULL)
+    gtk_entry_set_text (GTK_ENTRY (priv->entry_passwd), passwd);
+  gtk_box_pack_start (GTK_BOX (hbox), priv->entry_passwd, TRUE, TRUE, 0);
+
+  button = gtk_button_new_from_stock (GTK_STOCK_APPLY);
+  g_signal_connect (button, "clicked",
+                    G_CALLBACK (cb_update_mpd), dialog);
+  gtk_container_add (GTK_CONTAINER (mpd_vbox), button);
+
+  /*
+    Display
+   */
+  vbox = gtk_vbox_new (FALSE, 6);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
+  label = gtk_label_new (_("Appearance"));
+  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
+
+  vbox2 = gtk_vbox_new (FALSE, 6);
+  frame = xfce_create_framebox_with_content (_("Statusbar"), vbox2);
+  gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+
+  priv->statusbar_button = gtk_check_button_new_with_mnemonic (_("Show _statusbar"));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->statusbar_button), statusbar);
+  g_signal_connect (priv->statusbar_button, "toggled",
+                    G_CALLBACK (cb_show_statusbar_toggled), dialog);
+  gtk_container_add (GTK_CONTAINER (vbox2), priv->statusbar_button);
+
+  gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);
+
+  g_free (host);
+  g_free (passwd);
+}
+
+static void
+xfmpc_preferences_dialog_finalize (GObject *object)
+{
+  XfmpcPreferencesDialog *dialog = XFMPC_PREFERENCES_DIALOG (object);
+  g_object_unref (G_OBJECT (dialog->preferences));
+  (*G_OBJECT_CLASS (parent_class)->finalize) (object);
+}
+
+
+
+static void
+xfmpc_preferences_dialog_response (GtkDialog *dialog,
+                                   gint       response)
+{
+  gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+
+
+GtkWidget*
+xfmpc_preferences_dialog_new ()
+{
+  return g_object_new (XFMPC_TYPE_PREFERENCES_DIALOG, NULL);
+}
+
+static void
+cb_use_defaults_toggled (GtkToggleButton *button,
+                         GtkWidget *widget)
+{
+  gboolean sensitive;
+  sensitive = gtk_toggle_button_get_active (button);
+  gtk_widget_set_sensitive (widget, !sensitive);
+}
+
+static void
+cb_update_mpd (GtkButton *button,
+               XfmpcPreferencesDialog *dialog)
+{
+  XfmpcPreferencesDialogPrivate *priv = dialog->priv;
+  XfmpcMpdclient *mpdclient = xfmpc_mpdclient_get ();
+
+  g_object_set (G_OBJECT (dialog->preferences),
+                "mpd-hostname", gtk_entry_get_text (GTK_ENTRY (priv->entry_host)),
+                "mpd-port", gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (priv->entry_port)),
+                "mpd-password", gtk_entry_get_text (GTK_ENTRY (priv->entry_passwd)),
+                "mpd-use-defaults", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->entry_use_defaults)),
+                NULL);
+
+  xfmpc_mpdclient_disconnect (mpdclient);
+  xfmpc_mpdclient_connect (mpdclient);
+}
+
+static void
+cb_show_statusbar_toggled (GtkToggleButton *button,
+                           XfmpcPreferencesDialog *dialog)
+{
+  XfmpcPreferencesDialogPrivate *priv = dialog->priv;
+
+  g_object_set (G_OBJECT (dialog->preferences),
+                "show-statusbar", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->statusbar_button)),
+                NULL);
+}
+

Added: xfmpc/trunk/src/preferences-dialog.h
===================================================================
--- xfmpc/trunk/src/preferences-dialog.h	                        (rev 0)
+++ xfmpc/trunk/src/preferences-dialog.h	2009-02-24 21:08:21 UTC (rev 6775)
@@ -0,0 +1,50 @@
+/*
+ *  Copyright (c) 2009 Vincent Legout <vincent at legout.info>
+ *  Copyright (c) 2009 Mike Massonnet <mmassonnet at xfce.org>
+ *
+ *  Based on ThunarPreferencesDialog:
+ *  Copyright (c) 2005-2007 Benedikt Meurer <benny 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_PREFERENCES_DIALOG_H__
+#define __XFMPC_PREFERENCES_DIALOG_H__
+
+G_BEGIN_DECLS;
+
+#define XFMPC_TYPE_PREFERENCES_DIALOG            (xfmpc_preferences_dialog_get_type ())
+
+#define XFMPC_PREFERENCES_DIALOG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFMPC_TYPE_PREFERENCES_DIALOG, XfmpcPreferencesDialog))
+#define XFMPC_PREFERENCES_DIALOG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), XFMPC_TYPE_PREFERENCES_DIALOG, XfmpcPreferencesDialogClass))
+
+#define XFMPC_IS_PREFERENCES_DIALOG(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFMPC_TYPE_PREFERENCES_DIALOG))
+#define XFMPC_IS_PREFERENCES_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XFMPC_TYPE_PREFERENCES_DIALOG))
+
+#define XFMPC_PREFERENCES_DIALOG_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), XFMPC_TYPE_PREFERENCES_DIALOG, XfmpcPreferencesDialogClass))
+
+typedef struct _XfmpcPreferencesDialogClass      XfmpcPreferencesDialogClass;
+typedef struct _XfmpcPreferencesDialog           XfmpcPreferencesDialog;
+typedef struct _XfmpcPreferencesDialogPrivate    XfmpcPreferencesDialogPrivate;
+
+GType        xfmpc_preferences_dialog_get_type   () G_GNUC_CONST;
+
+GtkWidget *  xfmpc_preferences_dialog_new        ();
+
+
+G_END_DECLS;
+
+#endif
+

Modified: xfmpc/trunk/src/preferences.c
===================================================================
--- xfmpc/trunk/src/preferences.c	2009-02-24 18:47:06 UTC (rev 6774)
+++ xfmpc/trunk/src/preferences.c	2009-02-24 21:08:21 UTC (rev 6775)
@@ -45,6 +45,7 @@
   PROP_MPD_PORT,
   PROP_MPD_PASSWORD,
   PROP_MPD_USE_DEFAULTS,
+  PROP_SHOW_STATUSBAR,
   N_PROPERTIES,
 };
 
@@ -214,6 +215,14 @@
                                                          "Use default system settings for the MPD server (MPD_HOST/PORT environment variables)",
                                                          TRUE,
                                                          G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_SHOW_STATUSBAR,
+                                   g_param_spec_boolean ("show-statusbar",
+                                                         "ShowStatusbar",
+                                                         "Show the statusbar",
+                                                         TRUE,
+                                                         G_PARAM_READWRITE));
 }
 
 static void

Modified: xfmpc/trunk/src/statusbar.c
===================================================================
--- xfmpc/trunk/src/statusbar.c	2009-02-24 18:47:06 UTC (rev 6774)
+++ xfmpc/trunk/src/statusbar.c	2009-02-24 21:08:21 UTC (rev 6775)
@@ -2,6 +2,9 @@
  *  Copyright (c) 2009 Vincent Legout <vincent at legout.info>
  *  Copyright (c) 2009 Mike Massonnet <mmassonnet at xfce.org>
  *
+ *  Based on ThunarStatus:
+ *  Copyright (c) 2005-2006 Benedikt Meurer <benny 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
@@ -24,7 +27,6 @@
 #include <gtk/gtk.h>
 
 #include "statusbar.h"
-#include "mpdclient.h"
 
 #define GET_PRIVATE(o) \
     (G_TYPE_INSTANCE_GET_PRIVATE ((o), XFMPC_TYPE_STATUSBAR, XfmpcStatusbarPrivate))
@@ -39,10 +41,8 @@
                                                                 const GValue *value,
                                                                 GParamSpec *pspec);
 
-static void             cb_playlist_changed                    (XfmpcStatusbar *statusbar);
 
 
-
 enum
 {
   TEXT = 1,
@@ -58,7 +58,6 @@
 struct _XfmpcStatusbar
 {
   GtkStatusbar              parent;
-  XfmpcMpdclient           *mpdclient;
   /*<private>*/
   XfmpcStatusbarPrivate    *priv;
 };
@@ -128,21 +127,13 @@
 {
   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);
 }
 
@@ -182,21 +173,3 @@
   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);
-}
-

Modified: xfmpc/trunk/src/statusbar.h
===================================================================
--- xfmpc/trunk/src/statusbar.h	2009-02-24 18:47:06 UTC (rev 6774)
+++ xfmpc/trunk/src/statusbar.h	2009-02-24 21:08:21 UTC (rev 6775)
@@ -1,6 +1,9 @@
 /*
  *  Copyright (c) 2009 Vincent Legout <vincent at legout.info>
  *
+ *  Based on ThunarStatus:
+ *  Copyright (c) 2005-2006 Benedikt Meurer <benny 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




More information about the Goodies-commits mailing list