static gboolean glade_property_set_value_impl (GladeProperty * property, const GValue * value) { GladeProject *project = property->priv->widget ? glade_widget_get_project (property->priv->widget) : NULL; gboolean changed = FALSE; GValue old_value = { 0, }; gboolean warn_before, warn_after; #ifdef GLADE_ENABLE_DEBUG if (glade_get_debug_flags () & GLADE_DEBUG_PROPERTIES) { g_print ("PROPERTY: Setting %s property %s on %s ", glade_property_class_get_is_packing (property->priv->klass) ? "packing" : "normal", glade_property_class_id (property->priv->klass), property->priv->widget ? glade_widget_get_name (property->priv->widget) : "unknown"); gchar *str1 = glade_widget_adaptor_string_from_value (glade_property_class_get_adaptor (property->priv->klass), property->priv->klass, property->priv->value); gchar *str2 = glade_widget_adaptor_string_from_value (glade_property_class_get_adaptor (property->priv->klass), property->priv->klass, value); g_print ("from %s to %s\n", str1, str2); g_free (str1); g_free (str2); } #endif /* GLADE_ENABLE_DEBUG */ if (!g_value_type_compatible (G_VALUE_TYPE (property->priv->value), G_VALUE_TYPE (value))) { g_warning ("Trying to assign an incompatible value to property %s\n", glade_property_class_id (property->priv->klass)); return FALSE; } /* Check if the backend doesnt give us permission to * set this value. */ if (glade_property_superuser () == FALSE && property->priv->widget && project && glade_project_is_loading (project) == FALSE && glade_property_verify (property, value) == FALSE) { return FALSE; } /* save "changed" state. */ changed = !glade_property_equals_value (property, value); /* Add/Remove references from widget ref stacks here * (before assigning the value) */ if (property->priv->widget && changed && glade_property_class_is_object (property->priv->klass)) glade_property_update_prop_refs (property, property->priv->value, value); /* Check pre-changed warning state */ warn_before = glade_property_warn_usage (property); /* Make a copy of the old value */ g_value_init (&old_value, G_VALUE_TYPE (property->priv->value)); g_value_copy (property->priv->value, &old_value); /* Assign property first so that; if the object need be * rebuilt, it will reflect the new value */ g_value_reset (property->priv->value); g_value_copy (value, property->priv->value); GLADE_PROPERTY_GET_KLASS (property)->sync (property); glade_property_fix_state (property); if (changed && property->priv->widget) { g_signal_emit (G_OBJECT (property), glade_property_signals[VALUE_CHANGED], 0, &old_value, property->priv->value); glade_project_verify_property (property); /* Check post change warning state */ warn_after = glade_property_warn_usage (property); /* Update owning widget's warning state if need be */ if (property->priv->widget != NULL && warn_before != warn_after) glade_widget_verify (property->priv->widget); } /* Special case parentless widget properties */ if (glade_property_class_parentless_widget (property->priv->klass)) { GladeWidget *gobj; GObject *obj; if ((obj = g_value_get_object (&old_value)) && (gobj = glade_widget_get_from_gobject (obj))) glade_widget_show (gobj); if ((obj = g_value_get_object (value)) && (gobj = glade_widget_get_from_gobject (obj))) glade_widget_hide (gobj); } g_value_unset (&old_value); return TRUE; }
void glade_gtk_box_set_child_property (GladeWidgetAdaptor * adaptor, GObject * container, GObject * child, const gchar * property_name, GValue * value) { GladeWidget *gbox, *gchild, *gchild_iter; GList *children, *list; gboolean is_position; gint old_position, iter_position, new_position; static gboolean recursion = FALSE; g_return_if_fail (GTK_IS_BOX (container)); g_return_if_fail (GTK_IS_WIDGET (child)); g_return_if_fail (property_name != NULL || value != NULL); gbox = glade_widget_get_from_gobject (container); gchild = glade_widget_get_from_gobject (child); g_return_if_fail (GLADE_IS_WIDGET (gbox)); if (gtk_widget_get_parent (GTK_WIDGET (child)) != GTK_WIDGET (container)) return; /* Get old position */ if ((is_position = (strcmp (property_name, "position") == 0)) != FALSE) { gtk_container_child_get (GTK_CONTAINER (container), GTK_WIDGET (child), property_name, &old_position, NULL); /* Get the real value */ new_position = g_value_get_int (value); } if (is_position && recursion == FALSE) { children = glade_widget_get_children (gbox); children = g_list_sort (children, (GCompareFunc) sort_box_children); for (list = children; list; list = list->next) { gchild_iter = glade_widget_get_from_gobject (list->data); if (gchild_iter == gchild) { gtk_box_reorder_child (GTK_BOX (container), GTK_WIDGET (child), new_position); continue; } /* Get the old value from glade */ glade_widget_pack_property_get (gchild_iter, "position", &iter_position); /* Search for the child at the old position and update it */ if (iter_position == new_position && glade_property_superuser () == FALSE) { /* Update glade with the real value */ recursion = TRUE; glade_widget_pack_property_set (gchild_iter, "position", old_position); recursion = FALSE; continue; } else { gtk_box_reorder_child (GTK_BOX (container), GTK_WIDGET (list->data), iter_position); } } for (list = children; list; list = list->next) { gchild_iter = glade_widget_get_from_gobject (list->data); /* Refresh values yet again */ glade_widget_pack_property_get (gchild_iter, "position", &iter_position); gtk_box_reorder_child (GTK_BOX (container), GTK_WIDGET (list->data), iter_position); } if (children) g_list_free (children); } /* Chain Up */ if (!is_position) GWA_GET_CLASS (GTK_TYPE_CONTAINER)->child_set_property (adaptor, container, child, property_name, value); gtk_container_check_resize (GTK_CONTAINER (container)); }