summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/gtk+/glade-gtk-header-bar.c144
1 files changed, 75 insertions, 69 deletions
diff --git a/plugins/gtk+/glade-gtk-header-bar.c b/plugins/gtk+/glade-gtk-header-bar.c
index a7bf6c37..eee8e29e 100644
--- a/plugins/gtk+/glade-gtk-header-bar.c
+++ b/plugins/gtk+/glade-gtk-header-bar.c
@@ -7,6 +7,10 @@
#define TITLE_DISABLED_MESSAGE _("This property does not apply when a custom title is set")
+/* Uncomment to enable debug tracing of add/remove/replace children */
+//#define d(x) x
+#define d(x)
+
static gint
glade_gtk_header_bar_get_num_children (GObject *hb, GtkPackType type)
{
@@ -67,62 +71,6 @@ glade_gtk_header_bar_post_create (GladeWidgetAdaptor *adaptor,
}
void
-glade_gtk_header_bar_add_child (GladeWidgetAdaptor *adaptor,
- GObject *parent,
- GObject *child)
-{
- GladeWidget *gbox, *gchild;
- GtkPackType pack_type;
- gint num_children;
- gchar *special_child_type;
-
- gchild = glade_widget_get_from_gobject (child);
- if (gchild)
- glade_widget_set_pack_action_visible (gchild, "remove_slot", FALSE);
-
- special_child_type = g_object_get_data (child, "special-child-type");
- if (special_child_type && !strcmp (special_child_type, "title"))
- {
- gtk_header_bar_set_custom_title (GTK_HEADER_BAR (parent), GTK_WIDGET (child));
- return;
- }
-
- // check if its a placeholder being added, and add it to the end if anything is at the start
- if (GLADE_IS_PLACEHOLDER (child))
- {
- GList *list = gtk_container_get_children (GTK_CONTAINER (parent));
- GList *l;
- if (list)
- {
- for (l = list; l; l = l->next)
- {
- GObject *c = l->data;
- GtkPackType t;
- gtk_container_child_get (GTK_CONTAINER (parent), GTK_WIDGET (c), "pack-type", &t, NULL);
- if (t == GTK_PACK_START)
- {
- gtk_header_bar_pack_end (GTK_HEADER_BAR (parent), GTK_WIDGET (child) );
- g_list_free (list);
- return;
- }
- }
- g_list_free (list);
- }
- }
-
- GWA_GET_CLASS (GTK_TYPE_CONTAINER)->add (adaptor, parent, child);
-
- gbox = glade_widget_get_from_gobject (parent);
-
- gtk_container_child_get (GTK_CONTAINER (parent), GTK_WIDGET (child), "pack-type", &pack_type, NULL);
- num_children = glade_gtk_header_bar_get_num_children (parent, pack_type);
- if (pack_type == GTK_PACK_START)
- glade_widget_property_set (gbox, "start-size", num_children);
- else
- glade_widget_property_set (gbox, "end-size", num_children);
-}
-
-void
glade_gtk_header_bar_action_activate (GladeWidgetAdaptor *adaptor,
GObject * object,
const gchar *action_path)
@@ -232,6 +180,10 @@ glade_gtk_header_bar_set_size (GObject * object,
g_return_if_fail (GTK_IS_HEADER_BAR (object));
+ d(g_message ("Setting %s size to %d",
+ type == GTK_PACK_START ? "start" : "end",
+ g_value_get_int (value)));
+
if (glade_util_object_is_loading (object))
return;
@@ -272,9 +224,10 @@ glade_gtk_header_bar_set_size (GObject * object,
if (!g_object_get_data (G_OBJECT (child), "remove-this"))
continue;
- g_object_ref (G_OBJECT (child));
+ g_object_set_data (G_OBJECT (child), "remove-this", GINT_TO_POINTER (0));
+
gtk_container_remove (GTK_CONTAINER (object), child);
- gtk_widget_destroy (child);
+
old_size--;
}
for (l = g_list_last (children); l && old_size > new_size; l = l->prev)
@@ -284,9 +237,8 @@ glade_gtk_header_bar_set_size (GObject * object,
!GLADE_IS_PLACEHOLDER (child))
continue;
- g_object_ref (G_OBJECT (child));
gtk_container_remove (GTK_CONTAINER (object), child);
- gtk_widget_destroy (child);
+
old_size--;
}
@@ -372,32 +324,80 @@ glade_gtk_header_bar_set_property (GladeWidgetAdaptor * adaptor,
}
void
+glade_gtk_header_bar_add_child (GladeWidgetAdaptor *adaptor,
+ GObject *parent,
+ GObject *child)
+{
+ GladeWidget *gbox, *gchild;
+ gint size;
+ gchar *special_child_type;
+
+ gchild = glade_widget_get_from_gobject (child);
+ if (gchild)
+ glade_widget_set_pack_action_visible (gchild, "remove_slot", FALSE);
+
+ special_child_type = g_object_get_data (child, "special-child-type");
+
+ d(g_message ("Add %s %p (special: %s)",
+ GLADE_IS_PLACEHOLDER (child) ? "placeholder" : "child",
+ child, special_child_type));
+
+ if (special_child_type && !strcmp (special_child_type, "title"))
+ {
+ gtk_header_bar_set_custom_title (GTK_HEADER_BAR (parent), GTK_WIDGET (child));
+ return;
+ }
+
+ GWA_GET_CLASS (GTK_TYPE_CONTAINER)->add (adaptor, parent, child);
+
+ gbox = glade_widget_get_from_gobject (parent);
+ if (!glade_widget_superuser ())
+ {
+ glade_widget_property_get (gbox, "start-size", &size);
+ glade_widget_property_set (gbox, "start-size", size);
+
+ glade_widget_property_get (gbox, "end-size", &size);
+ glade_widget_property_set (gbox, "end-size", size);
+ }
+}
+
+void
glade_gtk_header_bar_remove_child (GladeWidgetAdaptor * adaptor,
GObject * object,
GObject * child)
{
GladeWidget *gbox;
- gint num_children;
- GtkPackType pack_type;
+ gint size;
gchar *special_child_type;
special_child_type = g_object_get_data (child, "special-child-type");
+
+ d(g_message ("Remove %s %p (special: %s)",
+ GLADE_IS_PLACEHOLDER (child) ? "placeholder" : "child",
+ child, special_child_type));
+
if (special_child_type && !strcmp (special_child_type, "title"))
{
- gtk_header_bar_set_custom_title (GTK_HEADER_BAR (object), glade_placeholder_new ());
+ GtkWidget *replacement = glade_placeholder_new ();
+
+ g_object_set_data (G_OBJECT (replacement), "special-child-type", "title");
+ gtk_header_bar_set_custom_title (GTK_HEADER_BAR (object), replacement);
return;
}
- gbox = glade_widget_get_from_gobject (object);
-
- gtk_container_child_get (GTK_CONTAINER (object), GTK_WIDGET (child), "pack-type", &pack_type, NULL);
-
gtk_container_remove (GTK_CONTAINER (object), GTK_WIDGET (child));
+ /* Synchronize number of placeholders, this should trigger the set_property method with the
+ * correct value (not the arbitrary number of children currently in the headerbar)
+ */
+ gbox = glade_widget_get_from_gobject (object);
if (!glade_widget_superuser ())
{
- num_children = glade_gtk_header_bar_get_num_children (object, pack_type);
- glade_widget_property_set (gbox, "start-size", num_children);
+ glade_widget_property_get (gbox, "start-size", &size);
+ glade_widget_property_set (gbox, "start-size", size);
+
+ glade_widget_property_get (gbox, "end-size", &size);
+ glade_widget_property_set (gbox, "end-size", size);
}
}
@@ -412,6 +412,12 @@ glade_gtk_header_bar_replace_child (GladeWidgetAdaptor * adaptor,
special_child_type =
g_object_get_data (G_OBJECT (current), "special-child-type");
+ d(g_message ("Replace %s %p (special: %s) with %s %p",
+ GLADE_IS_PLACEHOLDER (current) ? "placeholder" : "child",
+ current, special_child_type,
+ GLADE_IS_PLACEHOLDER (new_widget) ? "placeholder" : "child",
+ new_widget));
+
if (special_child_type && !strcmp (special_child_type, "title"))
{
g_object_set_data (G_OBJECT (new_widget), "special-child-type", "title");