summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--gladeui/glade-project.c20
-rw-r--r--gladeui/glade-widget-adaptor.c38
-rw-r--r--gladeui/glade-widget-adaptor.h22
-rw-r--r--gladeui/glade-xml-utils.h1
-rw-r--r--plugins/gtk+/glade-gtk.c22
-rw-r--r--plugins/gtk+/gtk+.xml.in2
7 files changed, 114 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index e70ea8d9..a357cd99 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,7 +7,13 @@
* src/glade-window.c: Update glade-app accel group.
- * gladeui/glade-project.[ch], gladeui/glade-app.c: Remove accel group notion from projects
+ * gladeui/glade-widget-adaptor.[ch], gladeui/glade-xml-utils.h: Added
+ new backend ->depends() vfunc to determine toplevel dependancies (for
+ glade file output ordering).
+
+ * gladeui/glade-project.[ch], gladeui/glade-app.c:
+ - Remove accel group notion from projects
+ - Sort dependancies using glade_widget_adaptor_depends()
* gladeui/glade-base-editor.c:
- Use global accel group (with keypress editor hijack in place)
@@ -23,7 +29,9 @@
- Added "widget" property
- added glade_editor_dialog_for_widget()
- * plugins/gtk+/gtk+.xml.in, plugins/gtk+/glade-gtk.c: Added "Edit Separately" action
+ * plugins/gtk+/gtk+.xml.in, plugins/gtk+/glade-gtk.c:
+ - Added "Edit Separately" action
+ - Added ->depends() func for GtkWidget and GtkSizeGroup
2008-11-12 Tristan Van Berkom <tvb@gnome.org>
diff --git a/gladeui/glade-project.c b/gladeui/glade-project.c
index 24d27221..b649d8a9 100644
--- a/gladeui/glade-project.c
+++ b/gladeui/glade-project.c
@@ -2302,7 +2302,21 @@ glade_project_set_widget_name (GladeProject *project,
g_free (new_name);
}
+static gint
+sort_project_dependancies (GObject *a, GObject *b)
+{
+ GladeWidget *ga, *gb;
+
+ ga = glade_widget_get_from_gobject (a);
+ gb = glade_widget_get_from_gobject (b);
+ if (glade_widget_adaptor_depends (ga->adaptor, ga, gb))
+ return 1;
+ else if (glade_widget_adaptor_depends (gb->adaptor, gb, ga))
+ return -1;
+ else
+ return 1;
+}
/**
* glade_project_add_object:
@@ -2376,7 +2390,11 @@ glade_project_add_object (GladeProject *project,
glade_widget_set_project (gwidget, (gpointer)project);
- project->priv->objects = g_list_append (project->priv->objects, g_object_ref (object));
+ if (!gwidget->parent)
+ project->priv->objects = g_list_insert_sorted (project->priv->objects, g_object_ref (object),
+ (GCompareFunc)sort_project_dependancies);
+ else
+ project->priv->objects = g_list_append (project->priv->objects, g_object_ref (object));
g_signal_emit (G_OBJECT (project),
glade_project_signals [ADD_WIDGET],
diff --git a/gladeui/glade-widget-adaptor.c b/gladeui/glade-widget-adaptor.c
index 5d0a833d..6e5fac92 100644
--- a/gladeui/glade-widget-adaptor.c
+++ b/gladeui/glade-widget-adaptor.c
@@ -845,6 +845,14 @@ glade_widget_adaptor_object_child_action_activate (GladeWidgetAdaptor *adaptor,
adaptor->name, action_id);
}
+static gboolean
+glade_widget_adaptor_object_depends (GladeWidgetAdaptor *adaptor,
+ GladeWidget *widget,
+ GladeWidget *another)
+{
+ return FALSE;
+}
+
static void
glade_widget_adaptor_object_read_widget (GladeWidgetAdaptor *adaptor,
GladeWidget *widget,
@@ -1179,6 +1187,7 @@ glade_widget_adaptor_class_init (GladeWidgetAdaptorClass *adaptor_class)
adaptor_class->action_activate = glade_widget_adaptor_object_action_activate;
adaptor_class->child_action_activate= glade_widget_adaptor_object_child_action_activate;
adaptor_class->action_submenu = NULL;
+ adaptor_class->depends = glade_widget_adaptor_object_depends;
adaptor_class->read_widget = glade_widget_adaptor_object_read_widget;
adaptor_class->write_widget = glade_widget_adaptor_object_write_widget;
adaptor_class->read_child = glade_widget_adaptor_object_read_child;
@@ -1436,6 +1445,11 @@ gwa_extend_with_node_load_sym (GladeWidgetAdaptorClass *klass,
GLADE_TAG_ACTION_SUBMENU_FUNCTION,
&symbol))
klass->action_submenu = symbol;
+
+ if (glade_xml_load_sym_from_node (node, module,
+ GLADE_TAG_DEPENDS_FUNCTION,
+ &symbol))
+ klass->depends = symbol;
if (glade_xml_load_sym_from_node (node, module,
GLADE_TAG_READ_WIDGET_FUNCTION,
@@ -3378,6 +3392,30 @@ glade_widget_adaptor_action_submenu (GladeWidgetAdaptor *adaptor,
}
/**
+ * glade_widget_adaptor_depends:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @widget: A #GladeWidget of the adaptor
+ * @another: another #GladeWidget
+ *
+ * Checks whether @widget depends on @another to be placed earlier in
+ * the glade file.
+ *
+ * Returns: whether @widget depends on @another being parsed first in
+ * the resulting glade file.
+ */
+gboolean
+glade_widget_adaptor_depends (GladeWidgetAdaptor *adaptor,
+ GladeWidget *widget,
+ GladeWidget *another)
+{
+ g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), FALSE);
+ g_return_val_if_fail (GLADE_IS_WIDGET (widget), FALSE);
+ g_return_val_if_fail (GLADE_IS_WIDGET (another), FALSE);
+
+ return GLADE_WIDGET_ADAPTOR_GET_CLASS (adaptor)->depends (adaptor, widget, another);
+}
+
+/**
* glade_widget_adaptor_read_widget:
* @adaptor: A #GladeWidgetAdaptor
* @widget: The #GladeWidget
diff --git a/gladeui/glade-widget-adaptor.h b/gladeui/glade-widget-adaptor.h
index 1cc67522..2fde45db 100644
--- a/gladeui/glade-widget-adaptor.h
+++ b/gladeui/glade-widget-adaptor.h
@@ -417,6 +417,22 @@ typedef GtkWidget *(* GladeActionSubmenuFunc) (GladeWidgetAdaptor *adaptor,
const gchar *action_path);
+/**
+ * GladeDependsFunc:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @widget: A #GladeWidget of the adaptor
+ * @another: another #GladeWidget
+ *
+ * Checks whether @widget depends on @another to be placed earlier in
+ * the glade file.
+ *
+ * Returns: whether @widget depends on @another being parsed first in
+ * the resulting glade file.
+ */
+typedef gboolean (* GladeDependsFunc) (GladeWidgetAdaptor *adaptor,
+ GladeWidget *widget,
+ GladeWidget *another);
+
/**
@@ -669,6 +685,8 @@ struct _GladeWidgetAdaptorClass
GladeActionSubmenuFunc action_submenu; /* Delagate function to create dynamic submenus */
/* in action menus. */
+
+ GladeDependsFunc depends; /* Periodically sort widgets in the project */
GladeReadWidgetFunc read_widget; /* Reads widget attributes from xml */
@@ -841,6 +859,10 @@ GtkWidget *glade_widget_adaptor_action_submenu (GladeWidgetAdap
GObject *object,
const gchar *action_path);
+gboolean glade_widget_adaptor_depends (GladeWidgetAdaptor *adaptor,
+ GladeWidget *widget,
+ GladeWidget *another);
+
void glade_widget_adaptor_read_widget (GladeWidgetAdaptor *adaptor,
GladeWidget *widget,
diff --git a/gladeui/glade-xml-utils.h b/gladeui/glade-xml-utils.h
index 8a72633e..e86b9cde 100644
--- a/gladeui/glade-xml-utils.h
+++ b/gladeui/glade-xml-utils.h
@@ -131,6 +131,7 @@ typedef enum {
#define GLADE_TAG_ACTION_ACTIVATE_FUNCTION "action-activate-function"
#define GLADE_TAG_CHILD_ACTION_ACTIVATE_FUNCTION "child-action-activate-function"
#define GLADE_TAG_ACTION_SUBMENU_FUNCTION "action-submenu-function"
+#define GLADE_TAG_DEPENDS_FUNCTION "depends-function"
#define GLADE_TAG_READ_WIDGET_FUNCTION "read-widget-function"
#define GLADE_TAG_WRITE_WIDGET_FUNCTION "write-widget-function"
#define GLADE_TAG_READ_CHILD_FUNCTION "read-child-function"
diff --git a/plugins/gtk+/glade-gtk.c b/plugins/gtk+/glade-gtk.c
index 35cdf821..f1cf10fc 100644
--- a/plugins/gtk+/glade-gtk.c
+++ b/plugins/gtk+/glade-gtk.c
@@ -224,6 +224,17 @@ glade_gtk_init (const gchar *name)
}
/* ----------------------------- GtkWidget ------------------------------ */
+gboolean
+glade_gtk_widget_depends (GladeWidgetAdaptor *adaptor,
+ GladeWidget *widget,
+ GladeWidget *another)
+{
+ if (GTK_IS_ICON_FACTORY (another->object))
+ return TRUE;
+
+ return GWA_GET_CLASS (G_TYPE_OBJECT)->depends (adaptor, widget, another);
+}
+
#define GLADE_TAG_ACCEL "accelerator"
#define GLADE_TAG_ACCEL_KEY "key"
#define GLADE_TAG_ACCEL_MODIFIERS "modifiers"
@@ -8628,6 +8639,17 @@ glade_gtk_message_dialog_get_property (GladeWidgetAdaptor *adaptor,
}
/*--------------------------- GtkSizeGroup ---------------------------------*/
+gboolean
+glade_gtk_size_group_depends (GladeWidgetAdaptor *adaptor,
+ GladeWidget *widget,
+ GladeWidget *another)
+{
+ if (GTK_IS_WIDGET (another->object))
+ return TRUE;
+
+ return GWA_GET_CLASS (G_TYPE_OBJECT)->depends (adaptor, widget, another);
+}
+
#define GLADE_TAG_SIZEGROUP_WIDGETS "widgets"
#define GLADE_TAG_SIZEGROUP_WIDGET "widget"
diff --git a/plugins/gtk+/gtk+.xml.in b/plugins/gtk+/gtk+.xml.in
index a14a3c6f..2cc349ca 100644
--- a/plugins/gtk+/gtk+.xml.in
+++ b/plugins/gtk+/gtk+.xml.in
@@ -16,6 +16,7 @@
<get-property-function>glade_gtk_widget_get_property</get-property-function>
<action-activate-function>glade_gtk_widget_action_activate</action-activate-function>
<action-submenu-function>glade_gtk_widget_action_submenu</action-submenu-function>
+ <depends-function>glade_gtk_widget_depends</depends-function>
<read-widget-function>glade_gtk_widget_read_widget</read-widget-function>
<write-widget-function>glade_gtk_widget_write_widget</write-widget-function>
<create-editor-property-function>glade_gtk_widget_create_eprop</create-editor-property-function>
@@ -1707,6 +1708,7 @@ embedded in another object</_tooltip>
<!-- Objects -->
<glade-widget-class name="GtkSizeGroup" generic-name="sizegroup" _title="Size Group" libglade-unsupported="True" toplevel="True">
+ <depends-function>glade_gtk_size_group_depends</depends-function>
<read-widget-function>glade_gtk_size_group_read_widget</read-widget-function>
<write-widget-function>glade_gtk_size_group_write_widget</write-widget-function>
<set-property-function>glade_gtk_size_group_set_property</set-property-function>