X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkseparator.c;h=0ed0bee310e318e0a87fdd322a86c35b0a94b1a6;hb=cf216d780cb2c889a3bcb5faa825fc1b21af8896;hp=b382c7d0508f80d3bf7a8f80bcbe4377477afbf0;hpb=32b9aeaadd6dbd084344d97c573b0289c1584923;p=~andy%2Fgtk diff --git a/gtk/gtkseparator.c b/gtk/gtkseparator.c index b382c7d05..0ed0bee31 100644 --- a/gtk/gtkseparator.c +++ b/gtk/gtkseparator.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ /* @@ -26,28 +24,33 @@ #include "config.h" -#include "gtkorientable.h" +#include "gtkorientableprivate.h" #include "gtkseparator.h" #include "gtkprivate.h" #include "gtkintl.h" -#include "gtkalias.h" - - -enum { - PROP_0, - PROP_ORIENTATION -}; +/** + * SECTION:gtkseparator + * @Short_description: A separator widget + * @Title: GtkSeparator + * + * GtkSeparator is a horizontal or vertical separator widget, depending on the + * value of the #GtkOrientable:orientation property, used to group the widgets within a + * window. It displays a line with a shadow to make it appear sunken into the + * interface. + */ -typedef struct _GtkSeparatorPrivate GtkSeparatorPrivate; struct _GtkSeparatorPrivate { GtkOrientation orientation; }; -#define GTK_SEPARATOR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_SEPARATOR, GtkSeparatorPrivate)) +enum { + PROP_0, + PROP_ORIENTATION +}; static void gtk_separator_set_property (GObject *object, guint prop_id, @@ -57,16 +60,21 @@ 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); +static void gtk_separator_get_preferred_width + (GtkWidget *widget, + gint *minimum, + gint *natural); +static void gtk_separator_get_preferred_height + (GtkWidget *widget, + gint *minimum, + gint *natural); +static gboolean gtk_separator_draw (GtkWidget *widget, + cairo_t *cr); -G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GtkSeparator, gtk_separator, GTK_TYPE_WIDGET, - G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, - NULL)) +G_DEFINE_TYPE_WITH_CODE (GtkSeparator, gtk_separator, GTK_TYPE_WIDGET, + G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, + NULL)) static void @@ -78,12 +86,14 @@ gtk_separator_class_init (GtkSeparatorClass *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; + widget_class->get_preferred_width = gtk_separator_get_preferred_width; + widget_class->get_preferred_height = gtk_separator_get_preferred_height; - g_object_class_override_property (object_class, - PROP_ORIENTATION, - "orientation"); + widget_class->draw = gtk_separator_draw; + + gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_SEPARATOR); + + g_object_class_override_property (object_class, PROP_ORIENTATION, "orientation"); g_type_class_add_private (object_class, sizeof (GtkSeparatorPrivate)); } @@ -91,15 +101,20 @@ gtk_separator_class_init (GtkSeparatorClass *class) static void gtk_separator_init (GtkSeparator *separator) { - GtkWidget *widget = GTK_WIDGET (separator); - GtkSeparatorPrivate *private = GTK_SEPARATOR_GET_PRIVATE (separator); + GtkSeparatorPrivate *private; + GtkStyleContext *context; + + separator->priv = G_TYPE_INSTANCE_GET_PRIVATE (separator, + GTK_TYPE_SEPARATOR, + GtkSeparatorPrivate); + private = separator->priv; gtk_widget_set_has_window (GTK_WIDGET (separator), FALSE); private->orientation = GTK_ORIENTATION_HORIZONTAL; - widget->requisition.width = 1; - widget->requisition.height = widget->style->ythickness; + context = gtk_widget_get_style_context (GTK_WIDGET (separator)); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_SEPARATOR); } static void @@ -108,12 +123,14 @@ gtk_separator_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { - GtkSeparatorPrivate *private = GTK_SEPARATOR_GET_PRIVATE (object); + GtkSeparator *separator = GTK_SEPARATOR (object); + GtkSeparatorPrivate *private = separator->priv; switch (prop_id) { case PROP_ORIENTATION: private->orientation = g_value_get_enum (value); + _gtk_orientable_set_style_classes (GTK_ORIENTABLE (object)); gtk_widget_queue_resize (GTK_WIDGET (object)); break; default: @@ -128,7 +145,8 @@ gtk_separator_get_property (GObject *object, GValue *value, GParamSpec *pspec) { - GtkSeparatorPrivate *private = GTK_SEPARATOR_GET_PRIVATE (object); + GtkSeparator *separator = GTK_SEPARATOR (object); + GtkSeparatorPrivate *private = separator->priv; switch (prop_id) { @@ -142,102 +160,113 @@ gtk_separator_get_property (GObject *object, } static void -gtk_separator_size_request (GtkWidget *widget, - GtkRequisition *requisition) +gtk_separator_get_preferred_size (GtkWidget *widget, + GtkOrientation orientation, + gint *minimum, + gint *natural) { - GtkSeparatorPrivate *private = GTK_SEPARATOR_GET_PRIVATE (widget); - gboolean wide_separators; - gint separator_width; - gint separator_height; + GtkSeparator *separator = GTK_SEPARATOR (widget); + GtkSeparatorPrivate *private = separator->priv; + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder border; + gboolean wide_sep; + gint sep_width; + gint sep_height; + + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + gtk_style_context_get_border (context, state, &border); gtk_widget_style_get (widget, - "wide-separators", &wide_separators, - "separator-width", &separator_width, - "separator-height", &separator_height, + "wide-separators", &wide_sep, + "separator-width", &sep_width, + "separator-height", &sep_height, NULL); - requisition->width = 1; - requisition->height = 1; - - if (private->orientation == GTK_ORIENTATION_HORIZONTAL) + if (orientation == private->orientation) { - if (wide_separators) - requisition->height = separator_height; - else - requisition->height = widget->style->ythickness; + *minimum = *natural = 1; + } + else if (orientation == GTK_ORIENTATION_VERTICAL) + { + *minimum = *natural = wide_sep ? sep_height : border.top; } else { - if (wide_separators) - requisition->width = separator_width; - else - requisition->width = widget->style->xthickness; + *minimum = *natural = wide_sep ? sep_width : border.left; } } +static void +gtk_separator_get_preferred_width (GtkWidget *widget, + gint *minimum, + gint *natural) +{ + gtk_separator_get_preferred_size (widget, GTK_ORIENTATION_HORIZONTAL, minimum, natural); +} + +static void +gtk_separator_get_preferred_height (GtkWidget *widget, + gint *minimum, + gint *natural) +{ + gtk_separator_get_preferred_size (widget, GTK_ORIENTATION_VERTICAL, minimum, natural); +} + static gboolean -gtk_separator_expose (GtkWidget *widget, - GdkEventExpose *event) +gtk_separator_draw (GtkWidget *widget, + cairo_t *cr) { - GtkSeparatorPrivate *private = GTK_SEPARATOR_GET_PRIVATE (widget); + GtkSeparator *separator = GTK_SEPARATOR (widget); + GtkSeparatorPrivate *private = separator->priv; + GtkStateFlags state; + GtkStyleContext *context; + GtkBorder padding; gboolean wide_separators; - gint separator_width; - gint separator_height; - - if (!gtk_widget_is_drawable (widget)) - return FALSE; + gint separator_width; + gint separator_height; + int width, height; + context = gtk_widget_get_style_context (widget); gtk_widget_style_get (widget, "wide-separators", &wide_separators, "separator-width", &separator_width, "separator-height", &separator_height, NULL); + state = gtk_widget_get_state_flags (widget); + width = gtk_widget_get_allocated_width (widget); + height = gtk_widget_get_allocated_height (widget); + + gtk_style_context_get_padding (context, state, &padding); + if (private->orientation == GTK_ORIENTATION_HORIZONTAL) { if (wide_separators) - gtk_paint_box (widget->style, widget->window, - gtk_widget_get_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); + gtk_render_frame (context, cr, + 0, (height - separator_height) / 2, + width, separator_height); else - gtk_paint_hline (widget->style, widget->window, - gtk_widget_get_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); + gtk_render_line (context, cr, + 0, (height - padding.top) / 2, + width - 1, (height - padding.top) / 2); } else { if (wide_separators) - gtk_paint_box (widget->style, widget->window, - gtk_widget_get_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); + gtk_render_frame (context, cr, + (width - separator_width) / 2, 0, + separator_width, height); else - gtk_paint_vline (widget->style, widget->window, - gtk_widget_get_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); + gtk_render_line (context, cr, + (width - padding.left) / 2, 0, + (width - padding.left) / 2, height - 1); } return FALSE; } -#if 0 /** * gtk_separator_new: * @orientation: the separator's orientation. @@ -246,8 +275,8 @@ gtk_separator_expose (GtkWidget *widget, * * Return value: a new #GtkSeparator. * - * Since: 2.16 - **/ + * Since: 3.0 + */ GtkWidget * gtk_separator_new (GtkOrientation orientation) { @@ -255,8 +284,3 @@ gtk_separator_new (GtkOrientation orientation) "orientation", orientation, NULL); } -#endif - - -#define __GTK_SEPARATOR_C__ -#include "gtkaliasdef.c"