commit a68cfee12a1123092865e3f2b5155c5d76eb1404 Author: phantomjinx <p.g.richard...@phantomjinx.co.uk> Date: Sat Jan 21 19:08:32 2012 +0000
Get the preference window to appear correctly * Window available as separate dialog from sj edit menu or from the gtkpod preference window. plugins/sjcd/plugin.c | 43 ++++++++++- plugins/sjcd/plugin.h | 9 ++ plugins/sjcd/sj-prefs.c | 187 ++++++++++++++++++++++++++--------------------- plugins/sjcd/sj-prefs.h | 4 +- 4 files changed, 157 insertions(+), 86 deletions(-) --- diff --git a/plugins/sjcd/plugin.c b/plugins/sjcd/plugin.c index 08bfaf3..e1972cf 100644 --- a/plugins/sjcd/plugin.c +++ b/plugins/sjcd/plugin.c @@ -31,10 +31,17 @@ #endif #include <glib.h> +#include <libanjuta/interfaces/ianjuta-preferences.h> #include "libgtkpod/gtkpod_app_iface.h" +#include "libgtkpod/stock_icons.h" #include "libgtkpod/directories.h" #include "plugin.h" #include "sj-main.h" +#include "sj-prefs.h" + +#define PREFERENCE_ICON "sjcd-playlist-category" +#define PREFERENCE_ICON_STOCK_ID "sjcd-preference-icon" +#define TAB_NAME N_("Sound Juicer") /* Parent class. Part of standard class definition */ static gpointer parent_class; @@ -47,8 +54,8 @@ static gboolean activate_plugin(AnjutaPlugin *plugin) { GtkActionGroup* action_group; /* Prepare the icons for the playlist */ -// register_icon_path(get_plugin_dir(), "sjcd"); -// register_stock_icon(PREFERENCE_ICON, PREFERENCE_ICON_STOCK_ID); + register_icon_path(get_plugin_dir(), "sjcd"); + register_stock_icon(PREFERENCE_ICON, PREFERENCE_ICON_STOCK_ID); sjcd_plugin = (SJCDPlugin*) plugin; ui = anjuta_shell_get_ui(plugin->shell, NULL); @@ -102,7 +109,39 @@ static void sjcd_plugin_class_init(GObjectClass *klass) { plugin_class->deactivate = deactivate_plugin; } +static void ipreferences_merge(IAnjutaPreferences* ipref, AnjutaPreferences* prefs, GError** e) { + GdkPixbuf *pixbuf; + GError *error = NULL; + + SJCDPlugin* plugin = SJCD_PLUGIN(ipref); + plugin->prefs = init_sjcd_preferences(); + if (plugin->prefs == NULL) + return; + + pixbuf = gtk_icon_theme_load_icon(gtk_icon_theme_get_default(), PREFERENCE_ICON, 48, 0, &error); + + if (!pixbuf) { + g_warning (N_("Couldn't load icon: %s"), error->message); + g_error_free(error); + } + + anjuta_preferences_dialog_add_page(ANJUTA_PREFERENCES_DIALOG (anjuta_preferences_get_dialog (prefs)), "gtkpod-track-display-settings", _(TAB_NAME), pixbuf, plugin->prefs); + g_object_unref(pixbuf); +} + +static void ipreferences_unmerge(IAnjutaPreferences* ipref, AnjutaPreferences* prefs, GError** e) { + anjuta_preferences_remove_page(prefs, TAB_NAME); + SJCDPlugin* plugin = SJCD_PLUGIN(ipref); + gtk_widget_destroy(plugin->prefs); +} + +static void ipreferences_iface_init(IAnjutaPreferencesIface* iface) { + iface->merge = ipreferences_merge; + iface->unmerge = ipreferences_unmerge; +} + ANJUTA_PLUGIN_BEGIN (SJCDPlugin, sjcd_plugin); +ANJUTA_PLUGIN_ADD_INTERFACE(ipreferences, IANJUTA_TYPE_PREFERENCES); ANJUTA_PLUGIN_END; ANJUTA_SIMPLE_PLUGIN (SJCDPlugin, sjcd_plugin) diff --git a/plugins/sjcd/plugin.h b/plugins/sjcd/plugin.h index 6e85e0b..978b150 100644 --- a/plugins/sjcd/plugin.h +++ b/plugins/sjcd/plugin.h @@ -36,6 +36,14 @@ #include <libanjuta/anjuta-plugin.h> +extern GType sjcd_plugin_get_type (GTypeModule *module); +#define SJCD_TYPE_PLUGIN (sjcd_plugin_get_type (NULL)) +#define SJCD_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SJCD_TYPE_PLUGIN, SJCDPlugin)) +#define SJCD_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SJCD_TYPE_PLUGIN, SJCDPluginClass)) +#define SJCD_IS_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SJCD_TYPE_PLUGIN)) +#define SJCD_IS_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SJCD_TYPE_PLUGIN)) +#define SJCD_PLUGIN_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), SJCD_TYPE_PLUGIN, SJCDPluginClass)) + typedef struct _SJCDPlugin SJCDPlugin; typedef struct _SJCDPluginClass SJCDPluginClass; @@ -44,6 +52,7 @@ struct _SJCDPlugin { gint uiid; GtkWidget *sj_view; GtkActionGroup *action_group; + GtkWidget *prefs; }; struct _SJCDPluginClass { diff --git a/plugins/sjcd/sj-prefs.c b/plugins/sjcd/sj-prefs.c index 726c5c5..296392f 100644 --- a/plugins/sjcd/sj-prefs.c +++ b/plugins/sjcd/sj-prefs.c @@ -39,8 +39,6 @@ #include "sj-extracting.h" #include "sj-prefs.h" -extern GtkBuilder *builder; - static GtkWidget *audio_profile; static GtkWidget *cd_option, *path_option, *file_option, *basepath_fcb, *check_strip, *check_eject, *check_open; static GtkWidget *path_example_label; @@ -87,6 +85,7 @@ void prefs_profile_changed (GtkWidget *widget, gpointer user_data) char *media_type; gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, 0, &media_type, -1); + g_settings_set_string (sj_settings, SJ_SETTINGS_AUDIO_PROFILE, media_type); g_free (media_type); } @@ -444,98 +443,120 @@ static GtkWidget *sj_audio_profile_chooser_new(void) return GTK_WIDGET (combo_box); } +static GtkWidget *create_preferences_dialog() { + GtkWidget *prefs_dialog; + const char *labels[] = { "cd_label", "path_label", "folder_label", "file_label", "profile_label" }; + guint i; + GtkSizeGroup *group; + GtkWidget *box; + + prefs_dialog = GET_WIDGET ("prefs_dialog"); + box = GET_WIDGET ("hack_hbox"); + g_assert (prefs_dialog != NULL); + g_object_add_weak_pointer (G_OBJECT (prefs_dialog), (gpointer)&prefs_dialog); + + gtk_window_set_transient_for (GTK_WINDOW (prefs_dialog), GTK_WINDOW (gtkpod_app)); + + group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + for (i = 0; i < G_N_ELEMENTS (labels); i++) { + GtkWidget *widget; + widget = GET_WIDGET (labels[i]); + if (widget) { + gtk_size_group_add_widget (group, widget); + } else { + g_warning ("Widget %s not found", labels[i]); + } + } + g_object_unref (group); + + cd_option = GET_WIDGET ("cd_option"); + basepath_fcb = GET_WIDGET ("path_chooser"); + path_option = GET_WIDGET ("path_option"); + file_option = GET_WIDGET ("file_option"); + #if 0 + /* FIXME: This cannot be currently used, because aufio profile selector + * from gnome-media-profiles package is not fully qualified widget. + * Once gnome-media package is updated, this widget can be created + * using GtkBuilder. */ + audio_profile = GET_WIDGET ("audio_profile"); + #else + audio_profile = sj_audio_profile_chooser_new(); + g_signal_connect (G_OBJECT (audio_profile), "changed", + G_CALLBACK (prefs_profile_changed), NULL); + gtk_box_pack_start (GTK_BOX (box), audio_profile, TRUE, TRUE, 0); + gtk_widget_show (audio_profile); + #endif + check_strip = GET_WIDGET ("check_strip"); + check_eject = GET_WIDGET ("check_eject"); + check_open = GET_WIDGET ("check_open"); + path_example_label = GET_WIDGET ("path_example_label"); + + sj_add_default_dirs (GTK_FILE_CHOOSER (basepath_fcb)); + populate_pattern_combo (GTK_COMBO_BOX (path_option), path_patterns); + g_signal_connect (path_option, "changed", G_CALLBACK (prefs_path_option_changed), NULL); + populate_pattern_combo (GTK_COMBO_BOX (file_option), file_patterns); + g_signal_connect (file_option, "changed", G_CALLBACK (prefs_file_option_changed), NULL); + + g_signal_connect (cd_option, "drive-changed", G_CALLBACK (prefs_drive_changed), NULL); + + /* Connect to GSettings to update the UI */ + g_settings_bind (sj_settings, SJ_SETTINGS_EJECT, G_OBJECT (check_eject), "active", G_SETTINGS_BIND_DEFAULT); + g_settings_bind (sj_settings, SJ_SETTINGS_OPEN, G_OBJECT (check_open), "active", G_SETTINGS_BIND_DEFAULT); + g_settings_bind (sj_settings, SJ_SETTINGS_STRIP, G_OBJECT (check_strip), "active", G_SETTINGS_BIND_DEFAULT); + g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_DEVICE, + (GCallback)device_changed_cb, NULL); + g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_BASEURI, + (GCallback)baseuri_changed_cb, NULL); + g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_AUDIO_PROFILE, + (GCallback)audio_profile_changed_cb, NULL); + g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_PATH_PATTERN, + (GCallback)path_pattern_changed_cb, NULL); + g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_FILE_PATTERN, + (GCallback)file_pattern_changed_cb, NULL); + g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_STRIP, + (GCallback)strip_changed_cb, NULL); + + g_signal_connect (extractor, "notify::profile", pattern_label_update, NULL); + + baseuri_changed_cb (sj_settings, SJ_SETTINGS_BASEURI, NULL); + audio_profile_changed_cb (sj_settings, SJ_SETTINGS_AUDIO_PROFILE, NULL); + file_pattern_changed_cb (sj_settings, SJ_SETTINGS_FILE_PATTERN, NULL); + path_pattern_changed_cb (sj_settings, SJ_SETTINGS_PATH_PATTERN, NULL); + device_changed_cb (sj_settings, SJ_SETTINGS_DEVICE, NULL); + + return prefs_dialog; +} + /** * Clicked on Preferences in the UI */ G_MODULE_EXPORT void on_edit_preferences_cb (GtkMenuItem *item, gpointer user_data) { static GtkWidget *prefs_dialog = NULL; - if (prefs_dialog) { gtk_window_present (GTK_WINDOW (prefs_dialog)); } else { - const char *labels[] = { "cd_label", "path_label", "folder_label", "file_label", "profile_label" }; - guint i; - GtkSizeGroup *group; - GtkWidget *box; - - prefs_dialog = GET_WIDGET ("prefs_dialog"); - box = GET_WIDGET ("hack_hbox"); - g_assert (prefs_dialog != NULL); - g_object_add_weak_pointer (G_OBJECT (prefs_dialog), (gpointer)&prefs_dialog); - - gtk_window_set_transient_for (GTK_WINDOW (prefs_dialog), GTK_WINDOW (gtkpod_app)); - - group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - for (i = 0; i < G_N_ELEMENTS (labels); i++) { - GtkWidget *widget; - widget = GET_WIDGET (labels[i]); - if (widget) { - gtk_size_group_add_widget (group, widget); - } else { - g_warning ("Widget %s not found", labels[i]); - } - } - g_object_unref (group); - - cd_option = GET_WIDGET ("cd_option"); - basepath_fcb = GET_WIDGET ("path_chooser"); - path_option = GET_WIDGET ("path_option"); - file_option = GET_WIDGET ("file_option"); -#if 0 - /* FIXME: This cannot be currently used, because aufio profile selector - * from gnome-media-profiles package is not fully qualified widget. - * Once gnome-media package is updated, this widget can be created - * using GtkBuilder. */ - audio_profile = GET_WIDGET ("audio_profile"); -#else - audio_profile = sj_audio_profile_chooser_new(); - g_signal_connect (G_OBJECT (audio_profile), "changed", - G_CALLBACK (prefs_profile_changed), NULL); - gtk_box_pack_start (GTK_BOX (box), audio_profile, TRUE, TRUE, 0); - gtk_widget_show (audio_profile); -#endif - check_strip = GET_WIDGET ("check_strip"); - check_eject = GET_WIDGET ("check_eject"); - check_open = GET_WIDGET ("check_open"); - path_example_label = GET_WIDGET ("path_example_label"); - - sj_add_default_dirs (GTK_FILE_CHOOSER (basepath_fcb)); - populate_pattern_combo (GTK_COMBO_BOX (path_option), path_patterns); - g_signal_connect (path_option, "changed", G_CALLBACK (prefs_path_option_changed), NULL); - populate_pattern_combo (GTK_COMBO_BOX (file_option), file_patterns); - g_signal_connect (file_option, "changed", G_CALLBACK (prefs_file_option_changed), NULL); - - g_signal_connect (cd_option, "drive-changed", G_CALLBACK (prefs_drive_changed), NULL); - - /* Connect to GSettings to update the UI */ - g_settings_bind (sj_settings, SJ_SETTINGS_EJECT, G_OBJECT (check_eject), "active", G_SETTINGS_BIND_DEFAULT); - g_settings_bind (sj_settings, SJ_SETTINGS_OPEN, G_OBJECT (check_open), "active", G_SETTINGS_BIND_DEFAULT); - g_settings_bind (sj_settings, SJ_SETTINGS_STRIP, G_OBJECT (check_strip), "active", G_SETTINGS_BIND_DEFAULT); - g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_DEVICE, - (GCallback)device_changed_cb, NULL); - g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_BASEURI, - (GCallback)baseuri_changed_cb, NULL); - g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_AUDIO_PROFILE, - (GCallback)audio_profile_changed_cb, NULL); - g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_PATH_PATTERN, - (GCallback)path_pattern_changed_cb, NULL); - g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_FILE_PATTERN, - (GCallback)file_pattern_changed_cb, NULL); - g_signal_connect (G_OBJECT (sj_settings), "changed::"SJ_SETTINGS_STRIP, - (GCallback)strip_changed_cb, NULL); - - g_signal_connect (extractor, "notify::profile", pattern_label_update, NULL); - - baseuri_changed_cb (sj_settings, SJ_SETTINGS_BASEURI, NULL); - audio_profile_changed_cb (sj_settings, SJ_SETTINGS_AUDIO_PROFILE, NULL); - file_pattern_changed_cb (sj_settings, SJ_SETTINGS_FILE_PATTERN, NULL); - path_pattern_changed_cb (sj_settings, SJ_SETTINGS_PATH_PATTERN, NULL); - device_changed_cb (sj_settings, SJ_SETTINGS_DEVICE, NULL); - + prefs_dialog = create_preferences_dialog(); g_signal_connect (GTK_DIALOG (prefs_dialog), "response", G_CALLBACK (on_response), NULL); - gtk_widget_show_all (prefs_dialog); } } +GtkWidget *init_sjcd_preferences() +{ + GtkWidget *prefs_dialog; + GtkWidget *container; + GtkWidget *vbox; + GList *children = NULL; + + prefs_dialog = create_preferences_dialog(); + container = gtk_dialog_get_content_area(GTK_DIALOG(prefs_dialog)); + children = gtk_container_get_children(GTK_CONTAINER(container)); + g_return_val_if_fail(children, NULL); + + vbox = GTK_WIDGET(children->data); + g_object_ref(vbox); + gtk_container_remove(GTK_CONTAINER(container), vbox); + + return vbox; +} diff --git a/plugins/sjcd/sj-prefs.h b/plugins/sjcd/sj-prefs.h index fe8cc1a..7aaa97d 100644 --- a/plugins/sjcd/sj-prefs.h +++ b/plugins/sjcd/sj-prefs.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2003 Ross Burton <r...@burtonini.com> * * Sound Juicer - sj-prefs.h @@ -23,6 +23,8 @@ #ifndef SJ_PREFS_H #define SJ_PREFS_H +GtkWidget *init_sjcd_preferences(); + extern const char* prefs_get_default_device (); void on_edit_preferences_cb (GtkMenuItem *item, gpointer user_data); gboolean cd_drive_exists (const char *device); ------------------------------------------------------------------------------ Virtualization & Cloud Management Using Capacity Planning Cloud computing makes use of virtualization - but cloud computing also focuses on allowing computing to be delivered as a service. http://www.accelacomm.com/jaw/sfnl/114/51521223/ _______________________________________________ gtkpod-cvs2 mailing list gtkpod-cvs2@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2