From 2f6285597f8b5859a3f565f63a24bad59d261a55 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Tue, 30 Sep 2008 14:20:30 +0000 Subject: [PATCH] =?utf8?q?Bug=20553582=20=E2=80=93=20Add=20orientation=20A?= =?utf8?q?PI=20to=20GtkSeparator?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2008-09-30 Michael Natterer 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 --- ChangeLog | 14 +++ gtk/gtk.symbols | 1 + gtk/gtkhseparator.c | 77 ++-------------- gtk/gtkseparator.c | 216 +++++++++++++++++++++++++++++++++++++++++++- gtk/gtkseparator.h | 5 +- gtk/gtkvseparator.c | 78 ++-------------- 6 files changed, 243 insertions(+), 148 deletions(-) diff --git a/ChangeLog b/ChangeLog index 41b1a4532..a54e11809 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2008-09-30 Michael Natterer + + 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(). + 2008-09-30 Marek Kasik Bug 344522 – support non-local destination files (GtkPrint): diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index 681313326..483453aca 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -3506,6 +3506,7 @@ gtk_target_table_free #if IN_HEADER(__GTK_SEPARATOR_H__) #if IN_FILE(__GTK_SEPARATOR_C__) gtk_separator_get_type G_GNUC_CONST +gtk_separator_new #endif #endif diff --git a/gtk/gtkhseparator.c b/gtk/gtkhseparator.c index a660fad1f..91d437a1a 100644 --- a/gtk/gtkhseparator.c +++ b/gtk/gtkhseparator.c @@ -21,99 +21,34 @@ * 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 "gtkhseparator.h" -#include "gtkintl.h" +#include "gtkorientable.h" #include "gtkalias.h" - -static void gtk_hseparator_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static gint gtk_hseparator_expose (GtkWidget *widget, - GdkEventExpose *event); - G_DEFINE_TYPE (GtkHSeparator, gtk_hseparator, GTK_TYPE_SEPARATOR) static void gtk_hseparator_class_init (GtkHSeparatorClass *class) { - GtkWidgetClass *widget_class; - - widget_class = (GtkWidgetClass*) class; - - widget_class->size_request = gtk_hseparator_size_request; - widget_class->expose_event = gtk_hseparator_expose; } static void gtk_hseparator_init (GtkHSeparator *hseparator) { - GTK_WIDGET (hseparator)->requisition.width = 1; - GTK_WIDGET (hseparator)->requisition.height = GTK_WIDGET (hseparator)->style->ythickness; + gtk_orientable_set_orientation (GTK_ORIENTABLE (hseparator), + GTK_ORIENTATION_HORIZONTAL); } -GtkWidget* +GtkWidget * gtk_hseparator_new (void) { return g_object_new (GTK_TYPE_HSEPARATOR, NULL); } -static void -gtk_hseparator_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - gboolean wide_separators; - gint separator_height; - - gtk_widget_style_get (widget, - "wide-separators", &wide_separators, - "separator-height", &separator_height, - NULL); - - if (wide_separators) - requisition->height = separator_height; - else - requisition->height = widget->style->ythickness; -} - -static gint -gtk_hseparator_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - if (GTK_WIDGET_DRAWABLE (widget)) - { - gboolean wide_separators; - gint separator_height; - - gtk_widget_style_get (widget, - "wide-separators", &wide_separators, - "separator-height", &separator_height, - NULL); - - 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); - } - - return FALSE; -} - #define __GTK_HSEPARATOR_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtkseparator.c b/gtk/gtkseparator.c index 28808c15d..f713cfb17 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__ diff --git a/gtk/gtkseparator.h b/gtk/gtkseparator.h index b6400f9a4..ac0f9d894 100644 --- a/gtk/gtkseparator.h +++ b/gtk/gtkseparator.h @@ -46,7 +46,6 @@ G_BEGIN_DECLS #define GTK_SEPARATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_SEPARATOR, GtkSeparatorClass)) - typedef struct _GtkSeparator GtkSeparator; typedef struct _GtkSeparatorClass GtkSeparatorClass; @@ -61,8 +60,8 @@ struct _GtkSeparatorClass }; -GType gtk_separator_get_type (void) G_GNUC_CONST; - +GType gtk_separator_get_type (void) G_GNUC_CONST; +GtkWidget * gtk_separator_new (GtkOrientation orientation); G_END_DECLS diff --git a/gtk/gtkvseparator.c b/gtk/gtkvseparator.c index c199b29a9..855c1688c 100644 --- a/gtk/gtkvseparator.c +++ b/gtk/gtkvseparator.c @@ -21,100 +21,34 @@ * 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 "gtkvseparator.h" -#include "gtkintl.h" #include "gtkalias.h" - -static void gtk_vseparator_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static gint gtk_vseparator_expose (GtkWidget *widget, - GdkEventExpose *event); - - G_DEFINE_TYPE (GtkVSeparator, gtk_vseparator, GTK_TYPE_SEPARATOR) static void gtk_vseparator_class_init (GtkVSeparatorClass *klass) { - GtkWidgetClass *widget_class; - - widget_class = (GtkWidgetClass*) klass; - - widget_class->size_request = gtk_vseparator_size_request; - widget_class->expose_event = gtk_vseparator_expose; } static void gtk_vseparator_init (GtkVSeparator *vseparator) { - GTK_WIDGET (vseparator)->requisition.width = GTK_WIDGET (vseparator)->style->xthickness; - GTK_WIDGET (vseparator)->requisition.height = 1; + gtk_orientable_set_orientation (GTK_ORIENTABLE (vseparator), + GTK_ORIENTATION_VERTICAL); } -GtkWidget* +GtkWidget * gtk_vseparator_new (void) { return g_object_new (GTK_TYPE_VSEPARATOR, NULL); } -static void -gtk_vseparator_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - gboolean wide_separators; - gint separator_width; - - gtk_widget_style_get (widget, - "wide-separators", &wide_separators, - "separator-width", &separator_width, - NULL); - - if (wide_separators) - requisition->width = separator_width; - else - requisition->width = widget->style->xthickness; -} - -static gint -gtk_vseparator_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - if (GTK_WIDGET_DRAWABLE (widget)) - { - gboolean wide_separators; - gint separator_width; - - gtk_widget_style_get (widget, - "wide-separators", &wide_separators, - "separator-width", &separator_width, - NULL); - - 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; -} - #define __GTK_VSEPARATOR_C__ #include "gtkaliasdef.c" -- 2.43.2