]> Pileus Git - ~andy/gtk/blob - gtk/gtkscale.c
changed scrolled window inheritance, it inherits from GtkBin now.
[~andy/gtk] / gtk / gtkscale.c
1 /* GTK - The GIMP Toolkit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19 #include <math.h>
20 #include "gtkcontainer.h"
21 #include "gtkscale.h"
22
23
24 #define SCALE_CLASS(w)  GTK_SCALE_CLASS (GTK_OBJECT (w)->klass)
25
26
27 static void gtk_scale_class_init      (GtkScaleClass *klass);
28 static void gtk_scale_init            (GtkScale      *scale);
29 static void gtk_scale_map             (GtkWidget     *widget);
30 static void gtk_scale_unmap           (GtkWidget     *widget);
31
32 static void gtk_scale_draw_background (GtkRange      *range);
33
34
35 static GtkRangeClass *parent_class = NULL;
36
37
38 GtkType
39 gtk_scale_get_type (void)
40 {
41   static GtkType scale_type = 0;
42
43   if (!scale_type)
44     {
45       GtkTypeInfo scale_info =
46       {
47         "GtkScale",
48         sizeof (GtkScale),
49         sizeof (GtkScaleClass),
50         (GtkClassInitFunc) gtk_scale_class_init,
51         (GtkObjectInitFunc) gtk_scale_init,
52         /* reserved_1 */ NULL,
53         /* reserved_2 */ NULL,
54         (GtkClassInitFunc) NULL,
55       };
56
57       scale_type = gtk_type_unique (GTK_TYPE_RANGE, &scale_info);
58     }
59
60   return scale_type;
61 }
62
63 static void
64 gtk_scale_class_init (GtkScaleClass *class)
65 {
66   GtkObjectClass *object_class;
67   GtkWidgetClass *widget_class;
68   GtkRangeClass *range_class;
69
70   object_class = (GtkObjectClass*) class;
71   range_class = (GtkRangeClass*) class;
72   widget_class = (GtkWidgetClass*) class;
73
74   parent_class = gtk_type_class (GTK_TYPE_RANGE);
75
76   widget_class->map = gtk_scale_map;
77   widget_class->unmap = gtk_scale_unmap;
78
79   range_class->draw_background = gtk_scale_draw_background;
80
81   class->slider_length = 31;
82   class->value_spacing = 2;
83   class->draw_value = NULL;
84 }
85
86 static void
87 gtk_scale_init (GtkScale *scale)
88 {
89   GTK_WIDGET_SET_FLAGS (scale, GTK_CAN_FOCUS);
90   GTK_WIDGET_SET_FLAGS (scale, GTK_NO_WINDOW);
91   GTK_RANGE (scale)->digits = 1;
92   scale->draw_value = TRUE;
93   scale->value_pos = GTK_POS_TOP;
94 }
95
96 static void
97 gtk_scale_map (GtkWidget *widget)
98 {
99   GtkRange *range;
100
101   g_return_if_fail (widget != NULL);
102   g_return_if_fail (GTK_IS_SCALE (widget));
103
104   GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
105   range = GTK_RANGE (widget);
106
107   if (GTK_WIDGET_NO_WINDOW (widget))
108     gtk_widget_queue_draw (widget);
109
110   gdk_window_show (range->trough);
111 }
112
113 static void
114 gtk_scale_unmap (GtkWidget *widget)
115 {
116   GtkRange *range;
117
118   g_return_if_fail (widget != NULL);
119   g_return_if_fail (GTK_IS_SCALE (widget));
120
121   GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
122   range = GTK_RANGE (widget);
123
124   if (GTK_WIDGET_NO_WINDOW (widget))
125      gtk_widget_queue_clear (widget);
126
127   gdk_window_hide (range->trough);
128 }
129
130 void
131 gtk_scale_set_digits (GtkScale *scale,
132                       gint      digits)
133 {
134   g_return_if_fail (scale != NULL);
135   g_return_if_fail (GTK_IS_SCALE (scale));
136
137   if (GTK_RANGE (scale)->digits != digits)
138     {
139       GTK_RANGE (scale)->digits = digits;
140
141       if (GTK_WIDGET_VISIBLE (scale) && GTK_WIDGET_MAPPED (scale))
142         gtk_widget_queue_resize (GTK_WIDGET (scale));
143     }
144 }
145
146 void
147 gtk_scale_set_draw_value (GtkScale *scale,
148                           gint      draw_value)
149 {
150   g_return_if_fail (scale != NULL);
151   g_return_if_fail (GTK_IS_SCALE (scale));
152
153   if (scale->draw_value != draw_value)
154     {
155       scale->draw_value = (draw_value != 0);
156
157       if (GTK_WIDGET_VISIBLE (scale) && GTK_WIDGET_MAPPED (scale))
158         gtk_widget_queue_resize (GTK_WIDGET (scale));
159     }
160 }
161
162 void
163 gtk_scale_set_value_pos (GtkScale        *scale,
164                          GtkPositionType  pos)
165 {
166   g_return_if_fail (scale != NULL);
167   g_return_if_fail (GTK_IS_SCALE (scale));
168
169   if (scale->value_pos != pos)
170     {
171       scale->value_pos = pos;
172
173       if (GTK_WIDGET_VISIBLE (scale) && GTK_WIDGET_MAPPED (scale))
174         gtk_widget_queue_resize (GTK_WIDGET (scale));
175     }
176 }
177
178 gint
179 gtk_scale_get_value_width (GtkScale *scale)
180 {
181   GtkRange *range;
182   gchar buffer[128];
183   gfloat value;
184   gint temp;
185   gint return_val;
186   gint digits;
187   gint i, j;
188
189   g_return_val_if_fail (scale != NULL, 0);
190   g_return_val_if_fail (GTK_IS_SCALE (scale), 0);
191
192   return_val = 0;
193   if (scale->draw_value)
194     {
195       range = GTK_RANGE (scale);
196
197       value = ABS (range->adjustment->lower);
198       if (value == 0) value = 1;
199       digits = log10 (value) + 1;
200       if (digits > 13)
201         digits = 13;
202
203       i = 0;
204       if (range->adjustment->lower < 0)
205         buffer[i++] = '-';
206       for (j = 0; j < digits; j++)
207         buffer[i++] = '0';
208       if (GTK_RANGE (scale)->digits)
209         buffer[i++] = '.';
210       for (j = 0; j < GTK_RANGE (scale)->digits; j++)
211         buffer[i++] = '0';
212       buffer[i] = '\0';
213
214       return_val = gdk_string_measure (GTK_WIDGET (scale)->style->font, buffer);
215
216       value = ABS (range->adjustment->upper);
217       if (value == 0) value = 1;
218       digits = log10 (value) + 1;
219       if (digits > 13)
220         digits = 13;
221
222       i = 0;
223       if (range->adjustment->lower < 0)
224         buffer[i++] = '-';
225       for (j = 0; j < digits; j++)
226         buffer[i++] = '0';
227       if (GTK_RANGE (scale)->digits)
228         buffer[i++] = '.';
229       for (j = 0; j < GTK_RANGE (scale)->digits; j++)
230         buffer[i++] = '0';
231       buffer[i] = '\0';
232
233       temp = gdk_string_measure (GTK_WIDGET (scale)->style->font, buffer);
234       return_val = MAX (return_val, temp);
235     }
236
237   return return_val;
238 }
239
240 void
241 gtk_scale_draw_value (GtkScale *scale)
242 {
243   g_return_if_fail (scale != NULL);
244   g_return_if_fail (GTK_IS_SCALE (scale));
245
246   if (SCALE_CLASS (scale)->draw_value)
247     (* SCALE_CLASS (scale)->draw_value) (scale);
248 }
249
250
251 static void
252 gtk_scale_draw_background (GtkRange *range)
253 {
254   g_return_if_fail (range != NULL);
255   g_return_if_fail (GTK_IS_SCALE (range));
256
257   gtk_scale_draw_value (GTK_SCALE (range));
258 }