[glade] Ported GladePreferences to use a composite template.



commit f103d569723f64375647eee953415d0a720af0ad
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Thu Apr 11 20:41:41 2013 +0900

    Ported GladePreferences to use a composite template.

 po/POTFILES.in                    |    1 +
 src/Makefile.am                   |    2 +-
 src/glade-callbacks.h             |    1 +
 src/glade-preferences.c           |  245 ++++++++++++++++-------------
 src/glade-preferences.glade       |  313 +++++++++++++++++++++++++++++++++++++
 src/glade-preferences.h           |   50 ++++--
 src/glade-resources.gresource.xml |    1 +
 src/glade-window.c                |   13 ++-
 src/glade.glade                   |  311 +------------------------------------
 9 files changed, 501 insertions(+), 436 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 69dc485..d8d17b1 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -6,6 +6,7 @@
 data/glade.desktop.in.in
 src/glade-close-button.c
 [type: gettext/glade]src/glade.glade
+[type: gettext/glade]src/glade-preferences.glade
 src/glade-window.c
 src/main.c
 
diff --git a/src/Makefile.am b/src/Makefile.am
index 44d5d57..058a8e6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -60,6 +60,6 @@ endif
 glade-win32-res.o: glade.rc
        $(WINDRES) $< $@
 
-UI_FILES = glade.glade
+UI_FILES = glade.glade glade-preferences.glade
 
 EXTRA_DIST = glade.rc.in glade-resources.gresource.xml $(UI_FILES)
diff --git a/src/glade-callbacks.h b/src/glade-callbacks.h
index 0962b68..adf0a14 100644
--- a/src/glade-callbacks.h
+++ b/src/glade-callbacks.h
@@ -41,6 +41,7 @@ void on_redo_action_activate             (GtkAction *action, GladeWindow *window
 void on_quit_action_activate             (GtkAction *action, GladeWindow *window);
 void on_about_action_activate            (GtkAction *action, GladeWindow *window);
 void on_reference_action_activate        (GtkAction *action, GladeWindow *window);
+void on_preferences_action_activate      (GtkAction *action, GladeWindow *window);
 
 void on_open_recent_action_item_activated (GtkRecentChooser *chooser,
                                            GladeWindow *window);
diff --git a/src/glade-preferences.c b/src/glade-preferences.c
index 35865f1..d187b9e 100644
--- a/src/glade-preferences.c
+++ b/src/glade-preferences.c
@@ -22,9 +22,16 @@
 #include "glade-preferences.h"
 #include <gladeui/glade-catalog.h>
 
-struct _GladePreferences
+#define CONFIG_GROUP "Preferences"
+#define CONFIG_KEY_CATALOG_PATHS "catalog-paths"
+
+#define CONFIG_GROUP_LOAD_SAVE      "Load and Save"
+#define CONFIG_KEY_BACKUP           "backup"
+#define CONFIG_KEY_AUTOSAVE         "autosave"
+#define CONFIG_KEY_AUTOSAVE_SECONDS "autosave-seconds"
+
+struct _GladePreferencesPrivate
 {
-  GObject *toplevel;
   GtkComboBoxText *catalog_path_combo;
 
   GtkWidget *create_backups_toggle;
@@ -32,15 +39,84 @@ struct _GladePreferences
   GtkWidget *autosave_spin;
 };
 
-#define CONFIG_GROUP "Preferences"
-#define CONFIG_KEY_CATALOG_PATHS "catalog-paths"
 
-#define CONFIG_GROUP_LOAD_SAVE      "Load and Save"
-#define CONFIG_KEY_BACKUP           "backup"
-#define CONFIG_KEY_AUTOSAVE         "autosave"
-#define CONFIG_KEY_AUTOSAVE_SECONDS "autosave-seconds"
+G_DEFINE_TYPE (GladePreferences, glade_preferences, GTK_TYPE_DIALOG);
+
+/********************************************************
+ *                       CALLBACKS                      *
+ ********************************************************/
+static void
+autosave_toggled (GtkToggleButton  *button,
+                 GladePreferences *prefs)
+{
+  gtk_widget_set_sensitive (prefs->priv->autosave_spin,
+                           gtk_toggle_button_get_active (button));
+}
+
+static gboolean 
+find_row (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
+{
+  gchar **directory = data;
+  gchar *string;
+  
+  gtk_tree_model_get (model, iter, 1, &string, -1);
+
+  if (g_strcmp0 (string, *directory) == 0)
+    {
+      g_free (*directory);
+      *directory = NULL;
+      return TRUE;
+    }
+  
+  return FALSE;
+}
 
 static void
+on_preferences_filechooserdialog_response (GtkDialog *dialog,
+                                           gint response_id,
+                                           GtkComboBoxText *combo)
+{
+  gtk_widget_hide (GTK_WIDGET (dialog));
+
+  if (response_id == GTK_RESPONSE_ACCEPT)
+    {
+      gchar *directory = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+      GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
+      
+      gtk_tree_model_foreach (model, find_row, &directory);
+
+      if (directory)
+        {
+          glade_catalog_add_path (directory);
+          gtk_combo_box_text_append (combo, directory, directory);
+          gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
+          g_free (directory);
+        }
+    }
+}
+
+static void
+on_catalog_path_remove_button_clicked (GtkButton *button, GtkComboBoxText *combo)
+{
+  gint active = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
+
+  if (active >= 0)
+    {
+      gchar *directory = gtk_combo_box_text_get_active_text (combo);
+      glade_catalog_remove_path (directory);
+      g_free (directory);
+
+      gtk_combo_box_text_remove (combo, active);
+
+      if (--active < 0) active = 0;
+      gtk_combo_box_set_active (GTK_COMBO_BOX (combo), active);
+    }
+}
+
+/********************************************************
+ *                  Class/Instance Init                 *
+ ********************************************************/
+static void
 combo_box_text_init_cell (GtkCellLayout *cell)
 {
   GList *l, *cels = gtk_cell_layout_get_cells (cell);
@@ -59,44 +135,62 @@ combo_box_text_init_cell (GtkCellLayout *cell)
 }
 
 static void
-autosave_toggled (GtkToggleButton  *button,
-                 GladePreferences *prefs)
-{
-  gtk_widget_set_sensitive (prefs->autosave_spin,
-                           gtk_toggle_button_get_active (button));
-}
-
-GladePreferences *
-glade_preferences_new (GtkBuilder *builder)
+glade_preferences_init (GladePreferences *preferences)
 {
-  GladePreferences *prefs = g_new0 (GladePreferences, 1);
+  preferences->priv = G_TYPE_INSTANCE_GET_PRIVATE (preferences,
+                                                  GLADE_TYPE_PREFERENCES,
+                                                  GladePreferencesPrivate);
 
-  prefs->toplevel = gtk_builder_get_object (builder, "preferences_dialog");
-  prefs->catalog_path_combo = GTK_COMBO_BOX_TEXT (gtk_builder_get_object (builder, 
"catalog_path_comboboxtext"));
-  combo_box_text_init_cell (GTK_CELL_LAYOUT (prefs->catalog_path_combo));
+  gtk_widget_init_template (GTK_WIDGET (preferences));
 
-  prefs->create_backups_toggle = GTK_WIDGET (gtk_builder_get_object (builder, "create_backups_toggle"));
-  prefs->autosave_toggle = GTK_WIDGET (gtk_builder_get_object (builder, "autosave_toggle"));
-  prefs->autosave_spin = GTK_WIDGET (gtk_builder_get_object (builder, "autosave_spin"));
+  combo_box_text_init_cell (GTK_CELL_LAYOUT (preferences->priv->catalog_path_combo));
+}
 
-  g_signal_connect (G_OBJECT (prefs->autosave_toggle), "toggled",
-                   G_CALLBACK (autosave_toggled), prefs);
-  
-  return prefs;
+static void
+glade_preferences_class_init (GladePreferencesClass *klass)
+{
+  GObjectClass *gobject_class;
+  GtkWidgetClass *widget_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  widget_class  = GTK_WIDGET_CLASS (klass);
+
+  /* Setup the template GtkBuilder xml for this class
+   */
+  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/glade/glade-preferences.glade");
+
+  /* Define the relationship of the private entry and the entry defined in the xml
+   */
+  gtk_widget_class_bind_child (widget_class, GladePreferencesPrivate, catalog_path_combo);
+  gtk_widget_class_bind_child (widget_class, GladePreferencesPrivate, create_backups_toggle);
+  gtk_widget_class_bind_child (widget_class, GladePreferencesPrivate, autosave_toggle);
+  gtk_widget_class_bind_child (widget_class, GladePreferencesPrivate, autosave_spin);
+
+  /* Declare the callback ports that this widget class exposes, to bind with <signal>
+   * connections defined in the GtkBuilder xml
+   */
+  gtk_widget_class_bind_callback (widget_class, autosave_toggled);
+  gtk_widget_class_bind_callback (widget_class, on_preferences_filechooserdialog_response);
+  gtk_widget_class_bind_callback (widget_class, on_catalog_path_remove_button_clicked);
+
+  g_type_class_add_private (gobject_class, sizeof (GladePreferencesPrivate));
 }
 
-void
-glade_preferences_destroy (GladePreferences *prefs)
+/********************************************************
+ *                         API                          *
+ ********************************************************/
+GtkWidget *
+glade_preferences_new (void)
 {
-  g_object_unref (prefs->toplevel);
-  g_free (prefs);
+  return g_object_new (GLADE_TYPE_PREFERENCES, NULL);
 }
 
 void
-glade_preferences_config_save (GladePreferences *prefs, GKeyFile *config)
+glade_preferences_save (GladePreferences *prefs,
+                       GKeyFile         *config)
 {
-  GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (prefs->catalog_path_combo));
-  gint column = gtk_combo_box_get_entry_text_column (GTK_COMBO_BOX (prefs->catalog_path_combo));
+  GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (prefs->priv->catalog_path_combo));
+  gint column = gtk_combo_box_get_entry_text_column (GTK_COMBO_BOX (prefs->priv->catalog_path_combo));
   GString *string = g_string_new ("");
   GtkTreeIter iter;
   gboolean valid;
@@ -128,7 +222,8 @@ glade_preferences_config_save (GladePreferences *prefs, GKeyFile *config)
 }
 
 void
-glade_preferences_config_load (GladePreferences *prefs, GKeyFile *config)
+glade_preferences_load (GladePreferences *prefs,
+                       GKeyFile         *config)
 {
   gchar *string;
   gboolean backups = TRUE;
@@ -139,7 +234,7 @@ glade_preferences_config_load (GladePreferences *prefs, GKeyFile *config)
 
   if (string && g_strcmp0 (string, ""))
     {
-      GtkComboBoxText *combo = prefs->catalog_path_combo;
+      GtkComboBoxText *combo = prefs->priv->catalog_path_combo;
       gchar **paths, **path;
 
       gtk_combo_box_text_remove_all (combo);
@@ -167,10 +262,10 @@ glade_preferences_config_load (GladePreferences *prefs, GKeyFile *config)
   if (g_key_file_has_key (config, CONFIG_GROUP_LOAD_SAVE, CONFIG_KEY_AUTOSAVE_SECONDS, NULL))
     autosave_seconds = g_key_file_get_integer (config, CONFIG_GROUP_LOAD_SAVE, CONFIG_KEY_AUTOSAVE_SECONDS, 
NULL);
 
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->create_backups_toggle), backups);
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->autosave_toggle), autosave);
-  gtk_spin_button_set_value (GTK_SPIN_BUTTON (prefs->autosave_spin), autosave_seconds);
-  gtk_widget_set_sensitive (prefs->autosave_spin, autosave);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->priv->create_backups_toggle), backups);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->priv->autosave_toggle), autosave);
+  gtk_spin_button_set_value (GTK_SPIN_BUTTON (prefs->priv->autosave_spin), autosave_seconds);
+  gtk_widget_set_sensitive (prefs->priv->autosave_spin, autosave);
 
   g_free (string);
 }
@@ -178,79 +273,17 @@ glade_preferences_config_load (GladePreferences *prefs, GKeyFile *config)
 gboolean
 glade_preferences_backup (GladePreferences *prefs)
 {
-  return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->create_backups_toggle));
+  return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->create_backups_toggle));
 }
 
 gboolean
 glade_preferences_autosave (GladePreferences *prefs)
 {
-  return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->autosave_toggle));
+  return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->autosave_toggle));
 }
 
 gint
 glade_preferences_autosave_seconds (GladePreferences *prefs)
 {
-  return (gint)gtk_spin_button_get_value (GTK_SPIN_BUTTON (prefs->autosave_spin));
-}
-
-/* Callbacks */
-
-static gboolean 
-find_row (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
-  gchar **directory = data;
-  gchar *string;
-  
-  gtk_tree_model_get (model, iter, 1, &string, -1);
-
-  if (g_strcmp0 (string, *directory) == 0)
-    {
-      g_free (*directory);
-      *directory = NULL;
-      return TRUE;
-    }
-  
-  return FALSE;
-}
-
-void
-on_preferences_filechooserdialog_response (GtkDialog *dialog,
-                                           gint response_id,
-                                           GtkComboBoxText *combo)
-{
-  gtk_widget_hide (GTK_WIDGET (dialog));
-
-  if (response_id == GTK_RESPONSE_ACCEPT)
-    {
-      gchar *directory = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
-      GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
-      
-      gtk_tree_model_foreach (model, find_row, &directory);
-
-      if (directory)
-        {
-          glade_catalog_add_path (directory);
-          gtk_combo_box_text_append (combo, directory, directory);
-          gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
-          g_free (directory);
-        }
-    }
-}
-
-void
-on_catalog_path_remove_button_clicked (GtkButton *button, GtkComboBoxText *combo)
-{
-  gint active = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
-
-  if (active >= 0)
-    {
-      gchar *directory = gtk_combo_box_text_get_active_text (combo);
-      glade_catalog_remove_path (directory);
-      g_free (directory);
-
-      gtk_combo_box_text_remove (combo, active);
-
-      if (--active < 0) active = 0;
-      gtk_combo_box_set_active (GTK_COMBO_BOX (combo), active);
-    }
+  return (gint)gtk_spin_button_get_value (GTK_SPIN_BUTTON (prefs->priv->autosave_spin));
 }
diff --git a/src/glade-preferences.glade b/src/glade-preferences.glade
new file mode 100644
index 0000000..3638f1c
--- /dev/null
+++ b/src/glade-preferences.glade
@@ -0,0 +1,313 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.8 -->
+  <template class="GladePreferences" parent="GtkDialog">
+    <property name="width_request">320</property>
+    <property name="height_request">200</property>
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Glade Preferences</property>
+    <property name="type_hint">dialog</property>
+    <signal name="delete-event" handler="gtk_true" swapped="no"/>
+    <signal name="delete-event" handler="gtk_widget_hide" swapped="no"/>
+    <signal name="response" handler="gtk_widget_hide" swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="preferences_close_button">
+                <property name="label">gtk-close</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkBox" id="box1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="border_width">3</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkFrame" id="frame2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label_xalign">0</property>
+                <property name="label_yalign">0</property>
+                <property name="shadow_type">none</property>
+                <child>
+                  <object class="GtkGrid" id="grid2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="margin_left">12</property>
+                    <property name="margin_top">6</property>
+                    <property name="row_spacing">6</property>
+                    <property name="column_spacing">6</property>
+                    <child>
+                      <object class="GtkCheckButton" id="create_backups_toggle">
+                        <property name="label" translatable="yes">Create Backups</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Create a backup of the last version 
of the project every time the project is saved</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">0</property>
+                        <property name="width">2</property>
+                        <property name="height">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkSpinButton" id="autosave_spin">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="invisible_char">•</property>
+                        <property name="numeric">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">1</property>
+                        <property name="width">1</property>
+                        <property name="height">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="autosave_toggle">
+                        <property name="label" translatable="yes">Autosave after timeout:</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Automatically save the project 
after the specified timeout passes
+whenever the project is modified</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                        <signal name="toggled" handler="autosave_toggled" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">1</property>
+                        <property name="width">1</property>
+                        <property name="height">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+                <child type="label">
+                  <object class="GtkLabel" id="label3">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Load and Save</property>
+                    <attributes>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkFrame" id="frame1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label_xalign">0</property>
+                <property name="label_yalign">0</property>
+                <property name="shadow_type">none</property>
+                <child>
+                  <object class="GtkGrid" id="grid1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="margin_left">12</property>
+                    <property name="margin_top">6</property>
+                    <property name="row_spacing">6</property>
+                    <property name="column_spacing">6</property>
+                    <child>
+                      <object class="GtkButton" id="catalog_path_remove_button">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Removes the selected catalog 
path</property>
+                        <property name="margin_top">2</property>
+                        <property name="margin_bottom">2</property>
+                        <signal name="clicked" handler="on_catalog_path_remove_button_clicked" 
object="catalog_path_combo" swapped="no"/>
+                        <child>
+                          <object class="GtkImage" id="image1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="icon_name">list-remove-symbolic</property>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="top_attach">0</property>
+                        <property name="width">1</property>
+                        <property name="height">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkComboBoxText" id="catalog_path_combo">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="hexpand">True</property>
+                        <property name="entry_text_column">0</property>
+                        <property name="id_column">1</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">0</property>
+                        <property name="width">1</property>
+                        <property name="height">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="catalog_path_add_button">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Add a new catalog path</property>
+                        <property name="margin_top">2</property>
+                        <property name="margin_bottom">2</property>
+                        <signal name="clicked" handler="gtk_widget_show" 
object="preferences_filechooserdialog" swapped="yes"/>
+                        <child>
+                          <object class="GtkImage" id="image2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="icon_name">list-add-symbolic</property>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">0</property>
+                        <property name="width">1</property>
+                        <property name="height">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+                <child type="label">
+                  <object class="GtkLabel" id="label2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Extra catalog paths</property>
+                    <attributes>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-7">preferences_close_button</action-widget>
+    </action-widgets>
+  </template>
+  <object class="GtkFileChooserDialog" id="preferences_filechooserdialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Select a catalog search path</property>
+    <property name="modal">True</property>
+    <property name="type_hint">dialog</property>
+    <property name="transient_for">GladePreferences</property>
+    <property name="action">select-folder</property>
+    <signal name="delete-event" handler="gtk_true" swapped="no"/>
+    <signal name="delete-event" handler="gtk_widget_hide" swapped="no"/>
+    <signal name="response" handler="on_preferences_filechooserdialog_response" object="catalog_path_combo" 
swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="filechooserdialog-vbox1">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="filechooserdialog-action_area1">
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="button3">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button4">
+                <property name="label">gtk-open</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-6">button3</action-widget>
+      <action-widget response="-3">button4</action-widget>
+    </action-widgets>
+  </object>
+</interface>
diff --git a/src/glade-preferences.h b/src/glade-preferences.h
index cb47b5b..3d88d45 100644
--- a/src/glade-preferences.h
+++ b/src/glade-preferences.h
@@ -17,6 +17,7 @@
  *
  * Authors:
  *   Juan Pablo Ugarte <juanpablougarte gmail com>
+ *   Tristan Van Berkom <tristan van berkom gmail com>
  */
 
 #ifndef __GLADE_PREFERENCES_H__
@@ -24,27 +25,44 @@
 
 #include <gtk/gtk.h>
 
-typedef struct _GladePreferences GladePreferences;
+G_BEGIN_DECLS
 
-GladePreferences *glade_preferences_new     (GtkBuilder *builder);
-void              glade_preferences_destroy (GladePreferences *prefs);
+#define GLADE_TYPE_PREFERENCES                 (glade_preferences_get_type ())
+#define GLADE_PREFERENCES(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_PREFERENCES, 
GladePreferences))
+#define GLADE_PREFERENCES_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_PREFERENCES, 
GladePreferencesClass))
+#define GLADE_IS_PREFERENCES(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_PREFERENCES))
+#define GLADE_IS_PREFERENCES_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_PREFERENCES))
+#define GLADE_PREFERENCES_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_TYPE_PREFERENCES, 
GladePreferencesClass))
 
-void glade_preferences_config_save (GladePreferences *prefs,
-                                    GKeyFile *config);
-void glade_preferences_config_load (GladePreferences *prefs,
-                                    GKeyFile *config);
+typedef struct _GladePreferences             GladePreferences;
+typedef struct _GladePreferencesClass        GladePreferencesClass;
+typedef struct _GladePreferencesPrivate      GladePreferencesPrivate;
 
-gboolean glade_preferences_backup   (GladePreferences *prefs);
-gboolean glade_preferences_autosave (GladePreferences *prefs);
-gint     glade_preferences_autosave_seconds (GladePreferences *prefs);
+struct _GladePreferences
+{
+  /*< private >*/
+  GtkDialog dialog;
 
-/* Callbacks */
+  GladePreferencesPrivate *priv;
+};
 
-void on_preferences_filechooserdialog_response (GtkDialog *dialog,
-                                                gint response_id,
-                                                GtkComboBoxText *combo);
-void on_catalog_path_remove_button_clicked     (GtkButton *button,
-                                                GtkComboBoxText *combo);
+struct _GladePreferencesClass
+{
+  GtkDialogClass parent_class;
+};
 
+GType             glade_preferences_get_type         (void) G_GNUC_CONST;
+GtkWidget        *glade_preferences_new              (void);
+
+void              glade_preferences_save             (GladePreferences *prefs,
+                                                     GKeyFile         *config);
+void              glade_preferences_load             (GladePreferences *prefs,
+                                                     GKeyFile         *config);
+
+gboolean          glade_preferences_backup           (GladePreferences *prefs);
+gboolean          glade_preferences_autosave         (GladePreferences *prefs);
+gint              glade_preferences_autosave_seconds (GladePreferences *prefs);
+
+G_END_DECLS
 
 #endif /* __GLADE_PREFERENCES_H__ */
diff --git a/src/glade-resources.gresource.xml b/src/glade-resources.gresource.xml
index de8f5cc..24462f3 100644
--- a/src/glade-resources.gresource.xml
+++ b/src/glade-resources.gresource.xml
@@ -2,5 +2,6 @@
 <gresources>
   <gresource prefix="/org/gnome/glade">
     <file compressed="true" preprocess="xml-stripblanks">glade.glade</file>
+    <file compressed="true" preprocess="xml-stripblanks">glade-preferences.glade</file>
   </gresource>
 </gresources>
diff --git a/src/glade-window.c b/src/glade-window.c
index fb6c4de..7a84b49 100644
--- a/src/glade-window.c
+++ b/src/glade-window.c
@@ -2131,6 +2131,13 @@ on_reference_action_activate (GtkAction *action, GladeWindow *window)
 }
 
 void
+on_preferences_action_activate (GtkAction   *action,
+                               GladeWindow *window)
+{
+  gtk_widget_show (GTK_WIDGET (window->priv->preferences));
+}
+
+void
 on_about_action_activate (GtkAction *action, GladeWindow *window)
 {
   GladeWindowPrivate *priv = GLADE_WINDOW_GET_PRIVATE (window);
@@ -2813,7 +2820,7 @@ glade_window_config_save (GladeWindow * window)
   save_paned_position (config, window->priv->left_pane, "left_pane");
   save_paned_position (config, window->priv->right_pane, "right_pane");
 
-  glade_preferences_config_save (window->priv->preferences, config);
+  glade_preferences_save (window->priv->preferences, config);
 
   glade_app_config_save ();
 }
@@ -3012,7 +3019,7 @@ glade_window_config_load (GladeWindow *window)
   load_paned_position (config, window->priv->center_pane, "center_pane", 400);
   load_paned_position (config, window->priv->right_pane, "right_pane", 220);
 
-  glade_preferences_config_load (window->priv->preferences, config);
+  glade_preferences_load (window->priv->preferences, config);
 }
 
 static void
@@ -3161,7 +3168,7 @@ glade_window_constructed (GObject *object)
     }
 
   /* Init preferences */
-  priv->preferences = glade_preferences_new (builder);
+  priv->preferences = (GladePreferences *)glade_preferences_new ();
   
   /* Fetch pointers */
   vbox = GET_OBJECT (builder, GTK_WIDGET, "main_box");
diff --git a/src/glade.glade b/src/glade.glade
index d378484..07b611f 100644
--- a/src/glade.glade
+++ b/src/glade.glade
@@ -240,7 +240,7 @@
         <property name="label" translatable="yes">Preferences</property>
         <property name="tooltip" translatable="yes">Edit Glade preferences</property>
         <property name="stock_id">gtk-preferences</property>
-        <signal name="activate" handler="gtk_widget_show" object="preferences_dialog" swapped="yes"/>
+        <signal name="activate" handler="on_preferences_action_activate" swapped="no"/>
       </object>
     </child>
   </object>
@@ -1130,313 +1130,4 @@ Andreas Nilsson &lt;andreas andreasn se&gt;</property>
       </packing>
     </child>
   </object>
-  <object class="GtkDialog" id="preferences_dialog">
-    <property name="width_request">320</property>
-    <property name="height_request">200</property>
-    <property name="can_focus">False</property>
-    <property name="border_width">5</property>
-    <property name="title" translatable="yes">Glade Preferences</property>
-    <property name="type_hint">dialog</property>
-    <signal name="delete-event" handler="gtk_true" swapped="no"/>
-    <signal name="delete-event" handler="gtk_widget_hide" swapped="no"/>
-    <signal name="response" handler="gtk_widget_hide" swapped="no"/>
-    <child internal-child="vbox">
-      <object class="GtkBox" id="dialog-vbox1">
-        <property name="can_focus">False</property>
-        <property name="orientation">vertical</property>
-        <property name="spacing">2</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area1">
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkButton" id="preferences_close_button">
-                <property name="label">gtk-close</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_stock">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkBox" id="box1">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="border_width">3</property>
-            <property name="orientation">vertical</property>
-            <child>
-              <object class="GtkFrame" id="frame2">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label_xalign">0</property>
-                <property name="label_yalign">0</property>
-                <property name="shadow_type">none</property>
-                <child>
-                  <object class="GtkGrid" id="grid2">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="margin_left">12</property>
-                    <property name="margin_top">6</property>
-                    <property name="row_spacing">6</property>
-                    <property name="column_spacing">6</property>
-                    <child>
-                      <object class="GtkCheckButton" id="create_backups_toggle">
-                        <property name="label" translatable="yes">Create Backups</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">False</property>
-                        <property name="tooltip_text" translatable="yes">Create a backup of the last version 
of the project every time the project is saved</property>
-                        <property name="xalign">0</property>
-                        <property name="draw_indicator">True</property>
-                      </object>
-                      <packing>
-                        <property name="left_attach">0</property>
-                        <property name="top_attach">0</property>
-                        <property name="width">2</property>
-                        <property name="height">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkSpinButton" id="autosave_spin">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="invisible_char">•</property>
-                        <property name="adjustment">autosave_seconds_adjustment</property>
-                        <property name="numeric">True</property>
-                      </object>
-                      <packing>
-                        <property name="left_attach">1</property>
-                        <property name="top_attach">1</property>
-                        <property name="width">1</property>
-                        <property name="height">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkCheckButton" id="autosave_toggle">
-                        <property name="label" translatable="yes">Autosave after timeout:</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">False</property>
-                        <property name="tooltip_text" translatable="yes">Automatically save the project 
after the specified timeout passes
-whenever the project is modified</property>
-                        <property name="xalign">0</property>
-                        <property name="draw_indicator">True</property>
-                      </object>
-                      <packing>
-                        <property name="left_attach">0</property>
-                        <property name="top_attach">1</property>
-                        <property name="width">1</property>
-                        <property name="height">1</property>
-                      </packing>
-                    </child>
-                  </object>
-                </child>
-                <child type="label">
-                  <object class="GtkLabel" id="label3">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Load and Save</property>
-                    <attributes>
-                      <attribute name="weight" value="bold"/>
-                    </attributes>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkFrame" id="frame1">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label_xalign">0</property>
-                <property name="label_yalign">0</property>
-                <property name="shadow_type">none</property>
-                <child>
-                  <object class="GtkGrid" id="grid1">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="margin_left">12</property>
-                    <property name="margin_top">6</property>
-                    <property name="row_spacing">6</property>
-                    <property name="column_spacing">6</property>
-                    <child>
-                      <object class="GtkButton" id="catalog_path_remove_button">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="tooltip_text" translatable="yes">Removes the selected catalog 
path</property>
-                        <property name="margin_top">2</property>
-                        <property name="margin_bottom">2</property>
-                        <signal name="clicked" handler="on_catalog_path_remove_button_clicked" 
object="catalog_path_comboboxtext" swapped="no"/>
-                        <child>
-                          <object class="GtkImage" id="image1">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="icon_name">list-remove-symbolic</property>
-                          </object>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="left_attach">2</property>
-                        <property name="top_attach">0</property>
-                        <property name="width">1</property>
-                        <property name="height">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkComboBoxText" id="catalog_path_comboboxtext">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="hexpand">True</property>
-                        <property name="entry_text_column">0</property>
-                        <property name="id_column">1</property>
-                      </object>
-                      <packing>
-                        <property name="left_attach">0</property>
-                        <property name="top_attach">0</property>
-                        <property name="width">1</property>
-                        <property name="height">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="catalog_path_add_button">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="tooltip_text" translatable="yes">Add a new catalog path</property>
-                        <property name="margin_top">2</property>
-                        <property name="margin_bottom">2</property>
-                        <signal name="clicked" handler="gtk_widget_show" 
object="preferences_filechooserdialog" swapped="yes"/>
-                        <child>
-                          <object class="GtkImage" id="image2">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="icon_name">list-add-symbolic</property>
-                          </object>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="left_attach">1</property>
-                        <property name="top_attach">0</property>
-                        <property name="width">1</property>
-                        <property name="height">1</property>
-                      </packing>
-                    </child>
-                  </object>
-                </child>
-                <child type="label">
-                  <object class="GtkLabel" id="label2">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Extra catalog paths</property>
-                    <attributes>
-                      <attribute name="weight" value="bold"/>
-                    </attributes>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-    <action-widgets>
-      <action-widget response="-7">preferences_close_button</action-widget>
-    </action-widgets>
-  </object>
-  <object class="GtkFileChooserDialog" id="preferences_filechooserdialog">
-    <property name="can_focus">False</property>
-    <property name="border_width">5</property>
-    <property name="title" translatable="yes">Select a catalog search path</property>
-    <property name="modal">True</property>
-    <property name="type_hint">dialog</property>
-    <property name="transient_for">preferences_dialog</property>
-    <property name="action">select-folder</property>
-    <signal name="delete-event" handler="gtk_true" swapped="no"/>
-    <signal name="delete-event" handler="gtk_widget_hide" swapped="no"/>
-    <signal name="response" handler="on_preferences_filechooserdialog_response" 
object="catalog_path_comboboxtext" swapped="no"/>
-    <child internal-child="vbox">
-      <object class="GtkBox" id="filechooserdialog-vbox1">
-        <property name="can_focus">False</property>
-        <property name="orientation">vertical</property>
-        <property name="spacing">2</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="filechooserdialog-action_area1">
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkButton" id="button3">
-                <property name="label">gtk-cancel</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_stock">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="button4">
-                <property name="label">gtk-open</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="has_default">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_stock">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <placeholder/>
-        </child>
-      </object>
-    </child>
-    <action-widgets>
-      <action-widget response="-6">button3</action-widget>
-      <action-widget response="-3">button4</action-widget>
-    </action-widgets>
-  </object>
 </interface>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]