diff options
author | Michael Natterer <mitch@imendio.com> | 2008-09-30 14:20:30 +0000 |
---|---|---|
committer | Michael Natterer <mitch@src.gnome.org> | 2008-09-30 14:20:30 +0000 |
commit | 2f6285597f8b5859a3f565f63a24bad59d261a55 (patch) | |
tree | 35f70a0c4d18cb2e136cb501e3afabc3e6cba60a /gtk/gtkseparator.c | |
parent | 1d7c1e13e86001104ffddd0b750247dc4dfc4e46 (diff) | |
download | gtk+-2f6285597f8b5859a3f565f63a24bad59d261a55.tar.gz |
Bug 553582 – Add orientation API to GtkSeparator
2008-09-30 Michael Natterer <mitch@imendio.com>
Bug 553582 – Add orientation API to GtkSeparator
* gtk/gtkseparator.[ch]: implement the GtkOrientable interface and
swallow all code from GtkHSeparator and GtkVSeparator. Add
gtk_separator_new() which takes a GtkOrientation argument.
* gtk/gtkhseparator.c
* gtk/gtkvseparator.c: remove all code except the constructor and
call gtk_orientable_set_orientation() in init().
* gtk/gtk.symbols: add gtk_separator_new().
svn path=/trunk/; revision=21553
Diffstat (limited to 'gtk/gtkseparator.c')
-rw-r--r-- | gtk/gtkseparator.c | 216 |
1 files changed, 214 insertions, 2 deletions
diff --git a/gtk/gtkseparator.c b/gtk/gtkseparator.c index 28808c15d0..f713cfb179 100644 --- a/gtk/gtkseparator.c +++ b/gtk/gtkseparator.c @@ -21,26 +21,238 @@ * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ #include "config.h" + +#include "gtkorientable.h" #include "gtkseparator.h" +#include "gtkprivate.h" #include "gtkintl.h" #include "gtkalias.h" -G_DEFINE_ABSTRACT_TYPE (GtkSeparator, gtk_separator, GTK_TYPE_WIDGET) +enum { + PROP_0, + PROP_ORIENTATION +}; + + +typedef struct _GtkSeparatorPrivate GtkSeparatorPrivate; + +struct _GtkSeparatorPrivate +{ + GtkOrientation orientation; +}; + +#define GTK_SEPARATOR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_SEPARATOR, GtkSeparatorPrivate)) + + +static void gtk_separator_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void gtk_separator_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +static void gtk_separator_size_request (GtkWidget *widget, + GtkRequisition *requisition); +static gboolean gtk_separator_expose (GtkWidget *widget, + GdkEventExpose *event); + + +G_DEFINE_TYPE_WITH_CODE (GtkSeparator, gtk_separator, GTK_TYPE_WIDGET, + G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, + NULL)) + static void gtk_separator_class_init (GtkSeparatorClass *class) { + GObjectClass *object_class = G_OBJECT_CLASS (class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); + + object_class->set_property = gtk_separator_set_property; + object_class->get_property = gtk_separator_get_property; + + widget_class->size_request = gtk_separator_size_request; + widget_class->expose_event = gtk_separator_expose; + + g_object_class_override_property (object_class, + PROP_ORIENTATION, + "orientation"); + + g_type_class_add_private (object_class, sizeof (GtkSeparatorPrivate)); } static void gtk_separator_init (GtkSeparator *separator) { + GtkWidget *widget = GTK_WIDGET (separator); + GtkSeparatorPrivate *private = GTK_SEPARATOR_GET_PRIVATE (separator); + GTK_WIDGET_SET_FLAGS (separator, GTK_NO_WINDOW); + + private->orientation = GTK_ORIENTATION_HORIZONTAL; + + widget->requisition.width = 1; + widget->requisition.height = widget->style->ythickness; +} + +static void +gtk_separator_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GtkSeparatorPrivate *private = GTK_SEPARATOR_GET_PRIVATE (object); + + switch (prop_id) + { + case PROP_ORIENTATION: + private->orientation = g_value_get_enum (value); + gtk_widget_queue_resize (GTK_WIDGET (object)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gtk_separator_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GtkSeparatorPrivate *private = GTK_SEPARATOR_GET_PRIVATE (object); + + switch (prop_id) + { + case PROP_ORIENTATION: + g_value_set_enum (value, private->orientation); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gtk_separator_size_request (GtkWidget *widget, + GtkRequisition *requisition) +{ + GtkSeparatorPrivate *private = GTK_SEPARATOR_GET_PRIVATE (widget); + gboolean wide_separators; + gint separator_width; + gint separator_height; + + gtk_widget_style_get (widget, + "wide-separators", &wide_separators, + "separator-width", &separator_width, + "separator-height", &separator_height, + NULL); + + requisition->width = 1; + requisition->height = 1; + + if (private->orientation == GTK_ORIENTATION_HORIZONTAL) + { + if (wide_separators) + requisition->height = separator_height; + else + requisition->height = widget->style->ythickness; + } + else + { + if (wide_separators) + requisition->width = separator_width; + else + requisition->width = widget->style->xthickness; + } +} + +static gboolean +gtk_separator_expose (GtkWidget *widget, + GdkEventExpose *event) +{ + GtkSeparatorPrivate *private = GTK_SEPARATOR_GET_PRIVATE (widget); + gboolean wide_separators; + gint separator_width; + gint separator_height; + + if (!GTK_WIDGET_DRAWABLE (widget)) + return FALSE; + + gtk_widget_style_get (widget, + "wide-separators", &wide_separators, + "separator-width", &separator_width, + "separator-height", &separator_height, + NULL); + + if (private->orientation == GTK_ORIENTATION_HORIZONTAL) + { + if (wide_separators) + gtk_paint_box (widget->style, widget->window, + GTK_WIDGET_STATE (widget), GTK_SHADOW_ETCHED_OUT, + &event->area, widget, "hseparator", + widget->allocation.x, + widget->allocation.y + (widget->allocation.height - + separator_height) / 2, + widget->allocation.width, + separator_height); + else + gtk_paint_hline (widget->style, widget->window, + GTK_WIDGET_STATE (widget), + &event->area, widget, "hseparator", + widget->allocation.x, + widget->allocation.x + widget->allocation.width - 1, + widget->allocation.y + (widget->allocation.height - + widget->style->ythickness) / 2); + } + else + { + if (wide_separators) + gtk_paint_box (widget->style, widget->window, + GTK_WIDGET_STATE (widget), GTK_SHADOW_ETCHED_OUT, + &event->area, widget, "vseparator", + widget->allocation.x + (widget->allocation.width - + separator_width) / 2, + widget->allocation.y, + separator_width, + widget->allocation.height); + else + gtk_paint_vline (widget->style, widget->window, + GTK_WIDGET_STATE (widget), + &event->area, widget, "vseparator", + widget->allocation.y, + widget->allocation.y + widget->allocation.height - 1, + widget->allocation.x + (widget->allocation.width - + widget->style->xthickness) / 2); + } + + return FALSE; +} + +/** + * gtk_separator_new: + * @orientation: the separator's orientation. + * + * Creates a new #GtkSeparator with the given orientation. + * + * Return value: a new #GtkSeparator. + * + * Since: 2.16 + **/ +GtkWidget * +gtk_separator_new (GtkOrientation orientation) +{ + return g_object_new (GTK_TYPE_SEPARATOR, + "orientation", orientation, + NULL); } #define __GTK_SEPARATOR_C__ |