Re: Padding API
- From: Gregory Merchan <merchan phys lsu edu>
- To: Havoc Pennington <hp redhat com>
- Cc: murrayc usa net, Calum Benson <calum benson sun com>, "usability gnome org" <usability gnome org>, gtk-devel-list gnome org
- Subject: Re: Padding API
- Date: Mon, 16 Dec 2002 15:49:57 -0600
Attached is a patch against gtk+ HEAD to add padding to GtkAlignment.
I have not tested it. Instead of using the deprecated GtkSideType,
I've used GtkPositionType.
I'm pretty sure this breaks the ABI. I'll look fixing that as Havoc
recommended (using object data) if no one beats me to it.
Cheers,
Greg Merchan
Index: gtk/gtkalignment.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkalignment.c,v
retrieving revision 1.26
diff -u -r1.26 gtkalignment.c
--- gtk/gtkalignment.c 9 Oct 2002 22:25:17 -0000 1.26
+++ gtk/gtkalignment.c 16 Dec 2002 21:29:45 -0000
@@ -34,7 +34,9 @@
PROP_YALIGN,
PROP_XSCALE,
PROP_YSCALE,
-
+ PROP_PAD_POS,
+ PROP_PADDING,
+
PROP_LAST
};
@@ -133,6 +135,23 @@
1.0,
1.0,
G_PARAM_READABLE | G_PARAM_WRITABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_PAD_POS,
+ g_param_spec_enum("pad_pos",
+ _("Pad Position"),
+ _("Which side of the alignment to pad."),
+ GTK_TYPE_POSITION,,
+ GTK_POS_TOP,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class,
+ PROP_PADDING,
+ g_param_spec_uint ("padding",
+ _("Padding"),
+ _("The amount of padding to the side of the alignment."),
+ 0,
+ G_MAXINT,
+ 0,
+ G_PARAM_READWRITE));
}
static void
@@ -145,6 +164,8 @@
alignment->yalign = 0.5;
alignment->xscale = 1.0;
alignment->yscale = 1.0;
+ alignment->pad_pos = GTK_POS_TOP;
+ alignment->padding = 0;
}
GtkWidget*
@@ -165,6 +186,21 @@
return GTK_WIDGET (alignment);
}
+GtkWidget*
+gtk_alignment_new_padding (gfloat xalign,
+ gfloat yalign,
+ gfloat xscale,
+ gfloat yscale,
+ GtkSideType side,
+ guint padding)
+{
+ GtkWidget *alignment;
+ alignment = g_alignment_new (xalign, yalign, xscale, yscale);
+ gtk_alignment_set_padding (GTK_ALIGNMENT (alignment),
+ pad_pos, padding);
+ return alignment;
+}
+
static void
gtk_alignment_set_property (GObject *object,
guint prop_id,
@@ -205,6 +241,16 @@
alignment->xscale,
g_value_get_float (value));
break;
+ case PROP_PAD_POS:
+ gtk_alignment_set_padding (alignment,
+ g_value_get_enum (value),
+ alignment->padding);
+ break;
+ case PROP_PADDING:
+ gtk_alignment_set_padding (alignment,
+ alignment->pad_pos,
+ g_value_get_uint (valu));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -235,6 +281,12 @@
case PROP_YSCALE:
g_value_set_float(value, alignment->yscale);
break;
+ case PROP_PAD_POS:
+ g_value_set_enum (value, alignment->pad_pos);
+ break;
+ case PROP_PADDING:
+ g_value_set_uint (value, alignment->padding);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -289,6 +341,34 @@
}
}
+void
+gtk_alignment_set_padding (GtkAlignment *alignment,
+ GtkPositionType pad_pos,
+ guint padding)
+{
+ g_return_if_fail (GTK_IS_ALIGNMENT (alignment));
+
+ if ( (alignment->pad_pos != pad_pos)
+ || (alignment->padding != padding))
+ {
+ g_object_freeze_notify (G_OBJECT (alignment));
+ if (alignment->pad_pos != pad_pos)
+ {
+ alignment->pad_pos = pad_pos;
+ g_object_notify (G_OBJECT (alignment), "pad_pos");
+ }
+ if (alignment->padding != padding)
+ {
+ alignment->padding = padding;
+ g_object_notify (G_OBJECT (alignment), "padding");
+ }
+ g_object_thaw_notify (G_OBJECT (alignment));
+
+ if (GTK_BIN (alignment)->child)
+ gtk_widget_queue_resize (GTK_BIN (alignment)->child);
+ gtk_widget_queue_draw (GTK_WIDGET (alignment));
+ }
+}
static void
gtk_alignment_size_request (GtkWidget *widget,
@@ -303,6 +383,17 @@
requisition->width = GTK_CONTAINER (widget)->border_width * 2;
requisition->height = GTK_CONTAINER (widget)->border_width * 2;
+ if ( (alignment->pad_pos == GTK_POS_LEFT)
+ || (alignment->pad_pos == GTK_POS_RIGHT))
+ {
+ requisition->width += alignment->padding;
+ }
+ else if ( (alignment->pad_pos == GTK_POS_TOP)
+ || (alignment->pad_pos == GTK_POS_BOTTOM))
+ {
+ requisition->height += alignment->padding;
+ }
+
if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
{
GtkRequisition child_requisition;
@@ -332,11 +423,24 @@
if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
{
gtk_widget_get_child_requisition (bin->child, &child_requisition);
+
x = GTK_CONTAINER (alignment)->border_width;
y = GTK_CONTAINER (alignment)->border_width;
- width = MAX (allocation->width - 2 * x, 0);
- height = MAX (allocation->height - 2 * y, 0);
+
+ switch (alignment->pad_pos)
+ {
+ case GTK_POS_LEFT:
+ case GTK_POS_RIGHT:
+ width = MAX (allocation->width - 2 * x - alignment->padding, 0);
+ height = MAX (allocation->height - 2 * y, 0);
+ break;
+ case GTK_POS_TOP:
+ case GTK_POS_BOTTOM:
+ width = MAX (allocation->width - 2 * x, 0);
+ height = MAX (allocation->height - 2 * y - alignment->padding, 0);
+ break;
+ }
if (width > child_requisition.width)
child_allocation.width = (child_requisition.width *
@@ -352,8 +456,25 @@
else
child_allocation.height = height;
- child_allocation.x = alignment->xalign * (width - child_allocation.width) + allocation->x + x;
- child_allocation.y = alignment->yalign * (height - child_allocation.height) + allocation->y + y;
+ switch (alignment->pad_pos)
+ {
+ case GTK_POS_LEFT:
+ child_allocation.x = alignment->xalign * (width - child_allocation.width) + allocation->x + x + alignment->padding;
+ child_allocation.y = alignment->yalign * (height - child_allocation.height) + allocation->y + y;
+ break;
+ case GTK_POS_RIGHT:
+ child_allocation.x = alignment->xalign * (width - child_allocation.width) + allocation->x + x;
+ child_allocation.y = alignment->yalign * (height - child_allocation.height) + allocation->y + y;
+ break;
+ case GTK_POS_TOP:
+ child_allocation.x = alignment->xalign * (width - child_allocation.width) + allocation->x + x;
+ child_allocation.y = alignment->yalign * (height - child_allocation.height) + allocation->y + y + alignment->padding;
+ break;
+ case GTK_POS_BOTTOM:
+ child_allocation.x = alignment->xalign * (width - child_allocation.width) + allocation->x + x;
+ child_allocation.y = alignment->yalign * (height - child_allocation.height) + allocation->y + y;
+ break;
+ }
gtk_widget_size_allocate (bin->child, &child_allocation);
}
Index: gtk/gtkalignment.h
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkalignment.h,v
retrieving revision 1.10
diff -u -r1.10 gtkalignment.h
--- gtk/gtkalignment.h 9 Oct 2002 22:25:17 -0000 1.10
+++ gtk/gtkalignment.h 16 Dec 2002 21:29:45 -0000
@@ -56,6 +56,9 @@
gfloat yalign;
gfloat xscale;
gfloat yscale;
+
+ GtkPositionType pad_pos;
+ guint padding;
};
struct _GtkAlignmentClass
@@ -64,16 +67,25 @@
};
-GType gtk_alignment_get_type (void) G_GNUC_CONST;
-GtkWidget* gtk_alignment_new (gfloat xalign,
- gfloat yalign,
- gfloat xscale,
- gfloat yscale);
-void gtk_alignment_set (GtkAlignment *alignment,
- gfloat xalign,
- gfloat yalign,
- gfloat xscale,
- gfloat yscale);
+GType gtk_alignment_get_type (void) G_GNUC_CONST;
+GtkWidget* gtk_alignment_new (gfloat xalign,
+ gfloat yalign,
+ gfloat xscale,
+ gfloat yscale);
+GtkWidget* gtk_alignment_new_padding (gfloat xalign,
+ gfloat yalign,
+ gfloat xscale,
+ gfloat yscale,
+ GtkPositionType pad_pos,
+ guint padding);
+void gtk_alignment_set (GtkAlignment *alignment,
+ gfloat xalign,
+ gfloat yalign,
+ gfloat xscale,
+ gfloat yscale);
+void gtk_alignment_set_padding (GtkAlignment *alignment,
+ GtkPositionType pad_pos,
+ guint padding);
#ifdef __cplusplus
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]