[gtk+/native-layout] Implement GtkExtendedLayout on Alignment
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/native-layout] Implement GtkExtendedLayout on Alignment
- Date: Wed, 7 Apr 2010 00:49:32 +0000 (UTC)
commit 85a55b2921ab7621d839c5391c1a489f572362f9
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date: Tue Apr 6 20:47:15 2010 -0400
Implement GtkExtendedLayout on Alignment
GtkAlignment is already using the height for width api to align
the child in the cases where space is available, but also needed
to implement the extended layout in order to reflect natural sizes
to parent widgets.
gtk/gtkalignment.c | 82 +++++++++++++++++++++++++++++++--------------------
1 files changed, 50 insertions(+), 32 deletions(-)
---
diff --git a/gtk/gtkalignment.c b/gtk/gtkalignment.c
index 3accb4d..55a210d 100644
--- a/gtk/gtkalignment.c
+++ b/gtk/gtkalignment.c
@@ -55,8 +55,6 @@ struct _GtkAlignmentPrivate
guint padding_right;
};
-static void gtk_alignment_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
static void gtk_alignment_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
static void gtk_alignment_set_property (GObject *object,
@@ -68,7 +66,14 @@ static void gtk_alignment_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
-G_DEFINE_TYPE (GtkAlignment, gtk_alignment, GTK_TYPE_BIN)
+static void gtk_alignment_extended_layout_init (GtkExtendedLayoutIface *iface);
+static void gtk_alignment_get_desired_size (GtkExtendedLayout *layout,
+ GtkRequisition *minimum_size,
+ GtkRequisition *natural_size);
+
+G_DEFINE_TYPE_WITH_CODE (GtkAlignment, gtk_alignment, GTK_TYPE_BIN,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_EXTENDED_LAYOUT,
+ gtk_alignment_extended_layout_init))
static void
gtk_alignment_class_init (GtkAlignmentClass *class)
@@ -82,7 +87,6 @@ gtk_alignment_class_init (GtkAlignmentClass *class)
gobject_class->set_property = gtk_alignment_set_property;
gobject_class->get_property = gtk_alignment_get_property;
- widget_class->size_request = gtk_alignment_size_request;
widget_class->size_allocate = gtk_alignment_size_allocate;
g_object_class_install_property (gobject_class,
@@ -410,34 +414,6 @@ gtk_alignment_set (GtkAlignment *alignment,
static void
-gtk_alignment_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- GtkBin *bin;
- GtkAlignmentPrivate *priv;
-
- bin = GTK_BIN (widget);
- priv = GTK_ALIGNMENT_GET_PRIVATE (widget);
-
- requisition->width = GTK_CONTAINER (widget)->border_width * 2;
- requisition->height = GTK_CONTAINER (widget)->border_width * 2;
-
- if (bin->child && gtk_widget_get_visible (bin->child))
- {
- GtkRequisition child_requisition;
-
- gtk_widget_size_request (bin->child, &child_requisition);
-
- requisition->width += child_requisition.width;
- requisition->height += child_requisition.height;
-
- /* Request extra space for the padding: */
- requisition->width += (priv->padding_left + priv->padding_right);
- requisition->height += (priv->padding_top + priv->padding_bottom);
- }
-}
-
-static void
gtk_alignment_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
@@ -504,6 +480,48 @@ gtk_alignment_size_allocate (GtkWidget *widget,
}
}
+
+static void
+gtk_alignment_extended_layout_init (GtkExtendedLayoutIface *iface)
+{
+ iface->get_desired_size = gtk_alignment_get_desired_size;
+}
+
+static void
+gtk_alignment_get_desired_size (GtkExtendedLayout *layout,
+ GtkRequisition *minimum_size,
+ GtkRequisition *natural_size)
+{
+ GtkWidget *child;
+ GtkAlignmentPrivate *priv;
+
+ priv = GTK_ALIGNMENT_GET_PRIVATE (layout);
+
+ minimum_size->width = GTK_CONTAINER (layout)->border_width * 2;
+ minimum_size->height = GTK_CONTAINER (layout)->border_width * 2;
+
+ *natural_size = *minimum_size;
+
+ if ((child = gtk_bin_get_child (GTK_BIN (layout))) && gtk_widget_get_visible (child))
+ {
+ GtkRequisition child_min, child_nat;
+
+ /* Request extra space for the padding: */
+ minimum_size->width += (priv->padding_left + priv->padding_right);
+ minimum_size->height += (priv->padding_top + priv->padding_bottom);
+
+ *natural_size = *minimum_size;
+
+ gtk_extended_layout_get_desired_size (GTK_EXTENDED_LAYOUT (child),
+ &child_min, &child_nat);
+
+ minimum_size->width += child_min.width;
+ minimum_size->height += child_min.height;
+ natural_size->width += child_nat.width;
+ natural_size->height += child_nat.height;
+ }
+}
+
/**
* gtk_alignment_set_padding:
* @alignment: a #GtkAlignment
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]