diff options
author | Michael Natterer <mitch@imendio.com> | 2008-11-11 17:47:13 +0000 |
---|---|---|
committer | Michael Natterer <mitch@src.gnome.org> | 2008-11-11 17:47:13 +0000 |
commit | 0498dca831099c1fac3c0d0a38b0bb08c4bd96de (patch) | |
tree | 684058a5c5624ce509bff9b297d9bd1e6f17206b /gtk/gtkvscale.c | |
parent | 4d8f9d2ef380f9158e0611df6f791042d0ebae76 (diff) | |
download | gtk+-0498dca831099c1fac3c0d0a38b0bb08c4bd96de.tar.gz |
Bug 553765 – Add orientation API to GtkRange
2008-11-11 Michael Natterer <mitch@imendio.com>
Bug 553765 – Add orientation API to GtkRange
* gtk/gtkrange.[ch]: implement the GtkOrientable interface. Add
evil code that makes sure that the stepper_detail and slider_detail
set in GtkRangeClass continue to work with the hacked subclasses
below.
* gtk/gtkscale.[ch]: swallow all code from GtkHScale and GtkVScale
and add gtk_scale_new() and gtk_scale_new_with_range() which take
a GtkOrientation argument. Set slider_detail to "Xscale" so above
evil code works.
* gtk/gtkscrollbar.[ch]: add gtk_scrollbar_new() which takes a
GtkOrientation argument. Set stepper_detail to "Xscrollbar" so
above evil code works.
* gtk/gtkhscale.c
* gtk/gtkvscale.c
* gtk/gtkhscrollbar.c
* gtk/gtkvscrollbar.c: remove all code except the constructor and
call gtk_orientable_set_orientation() in init().
* gtk/gtk.symbols: changed accordingly.
svn path=/trunk/; revision=21779
Diffstat (limited to 'gtk/gtkvscale.c')
-rw-r--r-- | gtk/gtkvscale.c | 180 |
1 files changed, 32 insertions, 148 deletions
diff --git a/gtk/gtkvscale.c b/gtk/gtkvscale.c index 3961ee074c..20d39bcb3b 100644 --- a/gtk/gtkvscale.c +++ b/gtk/gtkvscale.c @@ -21,81 +21,65 @@ * 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 <math.h> -#include <stdio.h> #include <stdlib.h> + #include "gtkvscale.h" -#include "gtkintl.h" +#include "gtkorientable.h" #include "gtkalias.h" -#define VALUE_SPACING 2 - -static gboolean gtk_vscale_expose (GtkWidget *widget, - GdkEventExpose *event); - -static void gtk_vscale_get_layout_offsets (GtkScale *scale, - gint *x, - gint *y); G_DEFINE_TYPE (GtkVScale, gtk_vscale, GTK_TYPE_SCALE) static void gtk_vscale_class_init (GtkVScaleClass *class) { - GtkWidgetClass *widget_class; - GtkRangeClass *range_class; - GtkScaleClass *scale_class; - - widget_class = GTK_WIDGET_CLASS (class); - range_class = GTK_RANGE_CLASS (class); - scale_class = GTK_SCALE_CLASS (class); + GtkRangeClass *range_class = GTK_RANGE_CLASS (class); range_class->slider_detail = "vscale"; - - scale_class->get_layout_offsets = gtk_vscale_get_layout_offsets; - - widget_class->expose_event = gtk_vscale_expose; } static void gtk_vscale_init (GtkVScale *vscale) { - GtkRange *range; - - range = GTK_RANGE (vscale); - - range->orientation = GTK_ORIENTATION_VERTICAL; + gtk_orientable_set_orientation (GTK_ORIENTABLE (vscale), + GTK_ORIENTATION_VERTICAL); } -GtkWidget* +GtkWidget * gtk_vscale_new (GtkAdjustment *adjustment) { - return g_object_new (GTK_TYPE_VSCALE, "adjustment", adjustment, NULL); -} + g_return_val_if_fail (adjustment == NULL || GTK_IS_ADJUSTMENT (adjustment), + NULL); + return g_object_new (GTK_TYPE_VSCALE, + "adjustment", adjustment, + NULL); +} /** * gtk_vscale_new_with_range: * @min: minimum value * @max: maximum value * @step: step increment (tick size) used with keyboard shortcuts - * + * * Creates a new vertical scale widget that lets the user input a * number between @min and @max (including @min and @max) with the * increment @step. @step must be nonzero; it's the distance the * slider moves when using the arrow keys to adjust the scale value. - * - * Note that the way in which the precision is derived works best if @step - * is a power of ten. If the resulting precision is not suitable for your - * needs, use gtk_scale_set_digits() to correct it. - * + * + * Note that the way in which the precision is derived works best if @step + * is a power of ten. If the resulting precision is not suitable for your + * needs, use gtk_scale_set_digits() to correct it. + * * Return value: a new #GtkVScale **/ -GtkWidget* +GtkWidget * gtk_vscale_new_with_range (gdouble min, gdouble max, gdouble step) @@ -108,124 +92,24 @@ gtk_vscale_new_with_range (gdouble min, g_return_val_if_fail (step != 0.0, NULL); adj = gtk_adjustment_new (min, min, max, step, 10 * step, 0); - - if (fabs (step) >= 1.0 || step == 0.0) - digits = 0; - else { - digits = abs ((gint) floor (log10 (fabs (step)))); - if (digits > 5) - digits = 5; - } - scale = g_object_new (GTK_TYPE_VSCALE, - "adjustment", adj, - "digits", digits, - NULL); - - return GTK_WIDGET (scale); -} - -static gboolean -gtk_vscale_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - GtkScale *scale; - - scale = GTK_SCALE (widget); - - /* We need to chain up _first_ so the various geometry members of - * GtkRange struct are updated. - */ - if (GTK_WIDGET_CLASS (gtk_vscale_parent_class)->expose_event) - GTK_WIDGET_CLASS (gtk_vscale_parent_class)->expose_event (widget, event); - - if (scale->draw_value) + if (fabs (step) >= 1.0 || step == 0.0) { - PangoLayout *layout; - gint x, y; - GtkStateType state_type; - - layout = gtk_scale_get_layout (scale); - gtk_scale_get_layout_offsets (scale, &x, &y); - - state_type = GTK_STATE_NORMAL; - if (!GTK_WIDGET_IS_SENSITIVE (scale)) - state_type = GTK_STATE_INSENSITIVE; - - gtk_paint_layout (widget->style, - widget->window, - state_type, - FALSE, - NULL, - widget, - "vscale", - x, y, - layout); + digits = 0; } - - return FALSE; - -} - -static void -gtk_vscale_get_layout_offsets (GtkScale *scale, - gint *x, - gint *y) -{ - GtkWidget *widget; - GtkRange *range; - PangoLayout *layout; - PangoRectangle logical_rect; - gint value_spacing; - - widget = GTK_WIDGET (scale); - layout = gtk_scale_get_layout (scale); - - if (!layout) + else { - *x = 0; - *y = 0; - - return; + digits = abs ((gint) floor (log10 (fabs (step)))); + if (digits > 5) + digits = 5; } - range = GTK_RANGE (widget); - scale = GTK_SCALE (widget); - - gtk_widget_style_get (widget, "value-spacing", &value_spacing, NULL); - - pango_layout_get_pixel_extents (layout, NULL, &logical_rect); - - switch (scale->value_pos) - { - case GTK_POS_LEFT: - *x = range->range_rect.x - logical_rect.width - value_spacing; - *y = range->slider_start + (range->slider_end - range->slider_start - logical_rect.height) / 2; - *y = CLAMP (*y, 0, widget->allocation.height - logical_rect.height); - break; - - case GTK_POS_RIGHT: - *x = range->range_rect.x + range->range_rect.width + value_spacing; - *y = range->slider_start + (range->slider_end - range->slider_start - logical_rect.height) / 2; - *y = CLAMP (*y, 0, widget->allocation.height - logical_rect.height); - break; - - case GTK_POS_TOP: - *x = range->range_rect.x + (range->range_rect.width - logical_rect.width) / 2; - *y = range->range_rect.y - logical_rect.height - value_spacing; - break; - - case GTK_POS_BOTTOM: - *x = range->range_rect.x + (range->range_rect.width - logical_rect.width) / 2; - *y = range->range_rect.y + range->range_rect.height + value_spacing; - break; - - default: - g_return_if_reached (); - } + scale = g_object_new (GTK_TYPE_VSCALE, + "adjustment", adj, + "digits", digits, + NULL); - *x += widget->allocation.x; - *y += widget->allocation.y; + return GTK_WIDGET (scale); } #define __GTK_VSCALE_C__ |