* Boston, MA 02111-1307, USA.
*/
-#include <config.h>
+#include "config.h"
+#include <string.h>
#include "gtkcontainer.h"
#include "gtkintl.h"
#include "gtkprivate.h"
#include "gtksizegroup.h"
+#include "gtkbuildable.h"
#include "gtkalias.h"
enum {
GSList **groups,
GSList **widgets);
+/* GtkBuildable */
+static void gtk_size_group_buildable_init (GtkBuildableIface *iface);
+static gboolean gtk_size_group_buildable_custom_tag_start (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ GMarkupParser *parser,
+ gpointer *data);
+static void gtk_size_group_buildable_custom_finished (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ gpointer user_data);
+
static GQuark size_groups_quark;
static const gchar size_groups_tag[] = "gtk-size-groups";
if (widget->parent)
_gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
- else if (GTK_WIDGET_TOPLEVEL (widget) && GTK_IS_CONTAINER (widget))
+ else if (gtk_widget_is_toplevel (widget) && GTK_IS_CONTAINER (widget))
_gtk_container_queue_resize (GTK_CONTAINER (widget));
}
if (widget == parent)
real_queue_resize (parent);
}
+ else if (tmp_list->data == widget)
+ {
+ g_warning ("A container and its child are part of this SizeGroup");
+ }
else
queue_resize_on_widget (tmp_list->data, FALSE);
if (widget == parent)
real_queue_resize (parent);
}
+ else if (tmp_list->data == widget)
+ {
+ g_warning ("A container and its child are part of this SizeGroup");
+ }
else
queue_resize_on_widget (tmp_list->data, FALSE);
queue_resize_on_widget (size_group->widgets->data, TRUE);
}
+static void
+initialize_size_group_quarks (void)
+{
+ if (!size_groups_quark)
+ {
+ size_groups_quark = g_quark_from_static_string (size_groups_tag);
+ visited_quark = g_quark_from_static_string (visited_tag);
+ }
+}
+
static void
gtk_size_group_class_init (GtkSizeGroupClass *klass)
{
/**
* GtkSizeGroup:ignore-hidden:
*
- * If %TRUE, hidden widgets are ignored when determining
+ * If %TRUE, unmapped widgets are ignored when determining
* the size of the group.
*
* Since: 2.8
PROP_IGNORE_HIDDEN,
g_param_spec_boolean ("ignore-hidden",
P_("Ignore hidden"),
- P_("If TRUE, hidden widgets are ignored "
+ P_("If TRUE, unmapped widgets are ignored "
"when determining the size of the group"),
FALSE,
GTK_PARAM_READWRITE));
-
- size_groups_quark = g_quark_from_static_string (size_groups_tag);
- visited_quark = g_quark_from_string (visited_tag);
+
+ initialize_size_group_quarks ();
}
static void
size_group->ignore_hidden = 0;
}
-G_DEFINE_TYPE (GtkSizeGroup, gtk_size_group, G_TYPE_OBJECT);
+static void
+gtk_size_group_buildable_init (GtkBuildableIface *iface)
+{
+ iface->custom_tag_start = gtk_size_group_buildable_custom_tag_start;
+ iface->custom_finished = gtk_size_group_buildable_custom_finished;
+}
+
+G_DEFINE_TYPE_WITH_CODE (GtkSizeGroup, gtk_size_group, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+ gtk_size_group_buildable_init))
static void
gtk_size_group_set_property (GObject *object,
* Return value: a newly created #GtkSizeGroup
**/
GtkSizeGroup *
-gtk_size_group_new (GtkSizeGroupMode mode)
+gtk_size_group_new (GtkSizeGroupMode mode)
{
GtkSizeGroup *size_group = g_object_new (GTK_TYPE_SIZE_GROUP, NULL);
/**
* gtk_size_group_set_ignore_hidden:
* @size_group: a #GtkSizeGroup
- * @ignore_hidden: whether hidden widgets should be ignored
+ * @ignore_hidden: whether unmapped widgets should be ignored
* when calculating the size
*
- * Sets whether invisible widgets should be ignored when
+ * Sets whether unmapped widgets should be ignored when
* calculating the size.
*
* Since: 2.8
* and the requisition of the other widgets in the size group.
* Whether this applies horizontally, vertically, or in both directions
* depends on the mode of the size group. See gtk_size_group_set_mode().
- **/
+ *
+ * When the widget is destroyed or no longer referenced elsewhere, it will
+ * be removed from the size group.
+ */
void
gtk_size_group_add_widget (GtkSizeGroup *size_group,
GtkWidget *widget)
* Removes a widget from a #GtkSizeGroup.
**/
void
-gtk_size_group_remove_widget (GtkSizeGroup *size_group,
- GtkWidget *widget)
+gtk_size_group_remove_widget (GtkSizeGroup *size_group,
+ GtkWidget *widget)
{
GSList *groups;
*
* Returns the list of widgets associated with @size_group.
*
- * Return value: a #GSList of widgets. The list is owned by GTK+
- * and should not be modified.
+ * Return value: (element-type GtkWidget) (transfer none): a #GSList of
+ * widgets. The list is owned by GTK+ and should not be modified.
*
* Since: 2.10
**/
GSList *
gtk_size_group_get_widgets (GtkSizeGroup *size_group)
{
- return size_group->widgets;
+ return size_group->widgets;
}
static gint
gtk_widget_ensure_style (widget);
GTK_PRIVATE_UNSET_FLAG (widget, GTK_REQUEST_NEEDED);
g_signal_emit_by_name (widget,
- "size_request",
+ "size-request",
&widget->requisition);
}
}
gint dimension = compute_base_dimension (tmp_widget, mode);
- if (GTK_WIDGET_VISIBLE (tmp_widget) || !group->ignore_hidden)
+ if (gtk_widget_get_mapped (tmp_widget) || !group->ignore_hidden)
{
if (dimension > result)
result = dimension;
_gtk_size_group_get_child_requisition (GtkWidget *widget,
GtkRequisition *requisition)
{
+ initialize_size_group_quarks ();
+
if (requisition)
{
if (get_size_groups (widget))
gint width;
gint height;
+ initialize_size_group_quarks ();
+
if (get_size_groups (widget))
{
/* Only do the full computation if we actually have size groups */
void
_gtk_size_group_queue_resize (GtkWidget *widget)
{
+ initialize_size_group_quarks ();
+
queue_resize_on_widget (widget, TRUE);
}
+typedef struct {
+ GObject *object;
+ GSList *items;
+} GSListSubParserData;
+
+static void
+size_group_start_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **names,
+ const gchar **values,
+ gpointer user_data,
+ GError **error)
+{
+ guint i;
+ GSListSubParserData *data = (GSListSubParserData*)user_data;
+
+ if (strcmp (element_name, "widget") == 0)
+ for (i = 0; names[i]; i++)
+ if (strcmp (names[i], "name") == 0)
+ data->items = g_slist_prepend (data->items, g_strdup (values[i]));
+ else if (strcmp (element_name, "widgets") == 0)
+ return;
+ else
+ g_warning ("Unsupported type tag for GtkSizeGroup: %s\n",
+ element_name);
+
+}
+
+static const GMarkupParser size_group_parser =
+ {
+ size_group_start_element
+ };
+
+static gboolean
+gtk_size_group_buildable_custom_tag_start (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ GMarkupParser *parser,
+ gpointer *data)
+{
+ GSListSubParserData *parser_data;
+
+ if (child)
+ return FALSE;
+
+ if (strcmp (tagname, "widgets") == 0)
+ {
+ parser_data = g_slice_new0 (GSListSubParserData);
+ parser_data->items = NULL;
+ parser_data->object = G_OBJECT (buildable);
+
+ *parser = size_group_parser;
+ *data = parser_data;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+gtk_size_group_buildable_custom_finished (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ gpointer user_data)
+{
+ GSList *l;
+ GSListSubParserData *data;
+ GObject *object;
+
+ if (strcmp (tagname, "widgets"))
+ return;
+
+ data = (GSListSubParserData*)user_data;
+ data->items = g_slist_reverse (data->items);
+
+ for (l = data->items; l; l = l->next)
+ {
+ object = gtk_builder_get_object (builder, l->data);
+ if (!object)
+ {
+ g_warning ("Unknown object %s specified in sizegroup %s",
+ (const gchar*)l->data,
+ gtk_buildable_get_name (GTK_BUILDABLE (data->object)));
+ continue;
+ }
+ gtk_size_group_add_widget (GTK_SIZE_GROUP (data->object),
+ GTK_WIDGET (object));
+ g_free (l->data);
+ }
+ g_slist_free (data->items);
+ g_slice_free (GSListSubParserData, data);
+}
+
+
#define __GTK_SIZE_GROUP_C__
#include "gtkaliasdef.c"