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

Reply via email to