[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