d548b732532f96d4936fd62aedf1096cd41c1436
1 #ifdef HAVE_CONFIG_H
2 # include "config.h"
3 #endif
4 #include <math.h>
5 #include <gtk/gtksignal.h>
6 #include <gtk/gtklabel.h>
7 #include <gtk/gtktable.h>
8 #include <gtk/gtkspinbutton.h>
9 #include <glibmm/i18n.h>
10 #include "../dialogs/dialog-events.h"
11 #include "sp-color-wheel-selector.h"
12 #include "sp-color-scales.h"
13 #include "sp-color-icc-selector.h"
14 #include "../svg/svg-icc-color.h"
16 G_BEGIN_DECLS
18 static void sp_color_wheel_selector_class_init (SPColorWheelSelectorClass *klass);
19 static void sp_color_wheel_selector_init (SPColorWheelSelector *cs);
20 static void sp_color_wheel_selector_destroy (GtkObject *object);
22 static void sp_color_wheel_selector_show_all (GtkWidget *widget);
23 static void sp_color_wheel_selector_hide_all (GtkWidget *widget);
26 G_END_DECLS
28 static SPColorSelectorClass *parent_class;
30 #define XPAD 4
31 #define YPAD 1
33 GType
34 sp_color_wheel_selector_get_type (void)
35 {
36 static GType type = 0;
37 if (!type) {
38 static const GTypeInfo info = {
39 sizeof (SPColorWheelSelectorClass),
40 NULL, /* base_init */
41 NULL, /* base_finalize */
42 (GClassInitFunc) sp_color_wheel_selector_class_init,
43 NULL, /* class_finalize */
44 NULL, /* class_data */
45 sizeof (SPColorWheelSelector),
46 0, /* n_preallocs */
47 (GInstanceInitFunc) sp_color_wheel_selector_init,
48 0, /* value_table */
49 };
51 type = g_type_register_static (SP_TYPE_COLOR_SELECTOR,
52 "SPColorWheelSelector",
53 &info,
54 static_cast< GTypeFlags > (0) );
55 }
56 return type;
57 }
59 static void
60 sp_color_wheel_selector_class_init (SPColorWheelSelectorClass *klass)
61 {
62 static const gchar* nameset[] = {N_("Wheel"), 0};
63 GtkObjectClass *object_class;
64 GtkWidgetClass *widget_class;
65 SPColorSelectorClass *selector_class;
67 object_class = (GtkObjectClass *) klass;
68 widget_class = (GtkWidgetClass *) klass;
69 selector_class = SP_COLOR_SELECTOR_CLASS (klass);
71 parent_class = SP_COLOR_SELECTOR_CLASS (g_type_class_peek_parent (klass));
73 selector_class->name = nameset;
74 selector_class->submode_count = 1;
76 object_class->destroy = sp_color_wheel_selector_destroy;
78 widget_class->show_all = sp_color_wheel_selector_show_all;
79 widget_class->hide_all = sp_color_wheel_selector_hide_all;
80 }
82 ColorWheelSelector::ColorWheelSelector( SPColorSelector* csel )
83 : ColorSelector( csel ),
84 _updating( FALSE ),
85 _dragging( FALSE ),
86 _adj(0),
87 _wheel(0),
88 _sbtn(0),
89 _label(0)
90 {
91 }
93 ColorWheelSelector::~ColorWheelSelector()
94 {
95 _adj = 0;
96 _wheel = 0;
97 _sbtn = 0;
98 _label = 0;
99 }
101 void sp_color_wheel_selector_init (SPColorWheelSelector *cs)
102 {
103 SP_COLOR_SELECTOR(cs)->base = new ColorWheelSelector( SP_COLOR_SELECTOR(cs) );
105 if ( SP_COLOR_SELECTOR(cs)->base )
106 {
107 SP_COLOR_SELECTOR(cs)->base->init();
108 }
109 }
111 void ColorWheelSelector::init()
112 {
113 GtkWidget *t;
114 gint row = 0;
116 _updating = FALSE;
117 _dragging = FALSE;
119 _tt = gtk_tooltips_new();
121 t = gtk_table_new (5, 3, FALSE);
122 gtk_widget_show (t);
123 gtk_box_pack_start (GTK_BOX (_csel), t, TRUE, TRUE, 0);
125 /* Create components */
126 row = 0;
128 _wheel = gtk_hsv_new();
129 gtk_widget_show( _wheel );
130 gtk_table_attach( GTK_TABLE(t), _wheel, 0, 3, row, row + 1, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), XPAD, YPAD);
132 row++;
134 /* Label */
135 _label = gtk_label_new_with_mnemonic (_("_A:"));
136 gtk_misc_set_alignment (GTK_MISC (_label), 1.0, 0.5);
137 gtk_widget_show (_label);
138 gtk_table_attach (GTK_TABLE (t), _label, 0, 1, row, row + 1, GTK_FILL, GTK_FILL, XPAD, YPAD);
140 /* Adjustment */
141 _adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 255.0, 1.0, 10.0, 10.0);
143 /* Slider */
144 _slider = sp_color_slider_new (_adj);
145 gtk_tooltips_set_tip (_tt, _slider, _("Alpha (opacity)"), NULL);
146 gtk_widget_show (_slider);
147 gtk_table_attach (GTK_TABLE (t), _slider, 1, 2, row, row + 1, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), (GtkAttachOptions)GTK_FILL, XPAD, YPAD);
149 sp_color_slider_set_colors (SP_COLOR_SLIDER (_slider),
150 SP_RGBA32_F_COMPOSE (1.0, 1.0, 1.0, 0.0),
151 SP_RGBA32_F_COMPOSE (1.0, 1.0, 1.0, 0.5),
152 SP_RGBA32_F_COMPOSE (1.0, 1.0, 1.0, 1.0));
155 /* Spinbutton */
156 _sbtn = gtk_spin_button_new (GTK_ADJUSTMENT (_adj), 1.0, 0);
157 gtk_tooltips_set_tip (_tt, _sbtn, _("Alpha (opacity)"), NULL);
158 sp_dialog_defocus_on_enter (_sbtn);
159 gtk_label_set_mnemonic_widget (GTK_LABEL(_label), _sbtn);
160 gtk_widget_show (_sbtn);
161 gtk_table_attach (GTK_TABLE (t), _sbtn, 2, 3, row, row + 1, (GtkAttachOptions)0, (GtkAttachOptions)0, XPAD, YPAD);
163 /* Signals */
164 gtk_signal_connect (GTK_OBJECT (_adj), "value_changed",
165 GTK_SIGNAL_FUNC (_adjustmentChanged), _csel);
167 gtk_signal_connect (GTK_OBJECT (_slider), "grabbed",
168 GTK_SIGNAL_FUNC (_sliderGrabbed), _csel);
169 gtk_signal_connect (GTK_OBJECT (_slider), "released",
170 GTK_SIGNAL_FUNC (_sliderReleased), _csel);
171 gtk_signal_connect (GTK_OBJECT (_slider), "changed",
172 GTK_SIGNAL_FUNC (_sliderChanged), _csel);
174 gtk_signal_connect( GTK_OBJECT(_wheel), "changed",
175 GTK_SIGNAL_FUNC(_wheelChanged), _csel );
176 }
178 static void
179 sp_color_wheel_selector_destroy (GtkObject *object)
180 {
181 if (((GtkObjectClass *) (parent_class))->destroy)
182 (* ((GtkObjectClass *) (parent_class))->destroy) (object);
183 }
185 static void
186 sp_color_wheel_selector_show_all (GtkWidget *widget)
187 {
188 gtk_widget_show (widget);
189 }
191 static void
192 sp_color_wheel_selector_hide_all (GtkWidget *widget)
193 {
194 gtk_widget_hide (widget);
195 }
197 GtkWidget *
198 sp_color_wheel_selector_new (void)
199 {
200 SPColorWheelSelector *csel;
202 csel = (SPColorWheelSelector*)gtk_type_new (SP_TYPE_COLOR_WHEEL_SELECTOR);
204 return GTK_WIDGET (csel);
205 }
207 /* Helpers for setting color value */
209 static void preserve_icc(SPColor *color, SPColorWheelSelector *cs){
210 ColorSelector* selector = (ColorSelector*)(SP_COLOR_SELECTOR(cs)->base);
211 color->icc = selector->getColor().icc ? new SVGICCColor(*selector->getColor().icc) : 0;
212 }
214 void ColorWheelSelector::_colorChanged()
215 {
216 #ifdef DUMP_CHANGE_INFO
217 g_message("ColorWheelSelector::_colorChanged( this=%p, %f, %f, %f, %f)", this, color.v.c[0], color.v.c[1], color.v.c[2], alpha );
218 #endif
219 _updating = TRUE;
220 {
221 gdouble h = 0;
222 gdouble s = 0;
223 gdouble v = 0;
224 gtk_rgb_to_hsv( _color.v.c[0], _color.v.c[1], _color.v.c[2], &h, &s, &v );
225 gtk_hsv_set_color( GTK_HSV(_wheel), h, s, v );
226 }
228 guint32 start = _color.toRGBA32( 0x00 );
229 guint32 mid = _color.toRGBA32( 0x7f );
230 guint32 end = _color.toRGBA32( 0xff );
232 sp_color_slider_set_colors(SP_COLOR_SLIDER(_slider), start, mid, end);
234 ColorScales::setScaled(_adj, _alpha);
236 _updating = FALSE;
237 }
239 void ColorWheelSelector::_adjustmentChanged( GtkAdjustment *adjustment, SPColorWheelSelector *cs )
240 {
241 // TODO check this. It looks questionable:
242 // if a value is entered between 0 and 1 exclusive, normalize it to (int) 0..255 or 0..100
243 if (adjustment->value > 0.0 && adjustment->value < 1.0) {
244 gtk_adjustment_set_value( adjustment, floor ((adjustment->value) * adjustment->upper + 0.5) );
245 }
247 ColorWheelSelector* wheelSelector = (ColorWheelSelector*)(SP_COLOR_SELECTOR(cs)->base);
248 if (wheelSelector->_updating) return;
250 wheelSelector->_updating = TRUE;
252 preserve_icc(&wheelSelector->_color, cs);
253 wheelSelector->_updateInternals( wheelSelector->_color, ColorScales::getScaled( wheelSelector->_adj ), wheelSelector->_dragging );
255 wheelSelector->_updating = FALSE;
256 }
258 void ColorWheelSelector::_sliderGrabbed( SPColorSlider *slider, SPColorWheelSelector *cs )
259 {
260 (void)slider;
261 ColorWheelSelector* wheelSelector = (ColorWheelSelector*)(SP_COLOR_SELECTOR(cs)->base);
262 if (!wheelSelector->_dragging) {
263 wheelSelector->_dragging = TRUE;
264 wheelSelector->_grabbed();
266 preserve_icc(&wheelSelector->_color, cs);
267 wheelSelector->_updateInternals( wheelSelector->_color, ColorScales::getScaled( wheelSelector->_adj ), wheelSelector->_dragging );
268 }
269 }
271 void ColorWheelSelector::_sliderReleased( SPColorSlider *slider, SPColorWheelSelector *cs )
272 {
273 (void)slider;
274 ColorWheelSelector* wheelSelector = (ColorWheelSelector*)(SP_COLOR_SELECTOR(cs)->base);
275 if (wheelSelector->_dragging) {
276 wheelSelector->_dragging = FALSE;
277 wheelSelector->_released();
279 preserve_icc(&wheelSelector->_color, cs);
280 wheelSelector->_updateInternals( wheelSelector->_color, ColorScales::getScaled( wheelSelector->_adj ), wheelSelector->_dragging );
281 }
282 }
284 void ColorWheelSelector::_sliderChanged( SPColorSlider *slider, SPColorWheelSelector *cs )
285 {
286 (void)slider;
287 ColorWheelSelector* wheelSelector = (ColorWheelSelector*)(SP_COLOR_SELECTOR(cs)->base);
289 preserve_icc(&wheelSelector->_color, cs);
290 wheelSelector->_updateInternals( wheelSelector->_color, ColorScales::getScaled( wheelSelector->_adj ), wheelSelector->_dragging );
291 }
293 void ColorWheelSelector::_wheelChanged( GtkHSV *hsv, SPColorWheelSelector *cs )
294 {
295 ColorWheelSelector* wheelSelector = static_cast<ColorWheelSelector*>(SP_COLOR_SELECTOR(cs)->base);
297 gdouble h = 0;
298 gdouble s = 0;
299 gdouble v = 0;
300 gtk_hsv_get_color( hsv, &h, &s, &v );
302 gdouble r = 0;
303 gdouble g = 0;
304 gdouble b = 0;
305 gtk_hsv_to_rgb(h, s, v, &r, &g, &b);
307 SPColor color(r, g, b);
309 guint32 start = color.toRGBA32( 0x00 );
310 guint32 mid = color.toRGBA32( 0x7f );
311 guint32 end = color.toRGBA32( 0xff );
313 sp_color_slider_set_colors (SP_COLOR_SLIDER(wheelSelector->_slider), start, mid, end);
315 preserve_icc(&color, cs);
316 wheelSelector->_updateInternals( color, wheelSelector->_alpha, gtk_hsv_is_adjusting( hsv ) );
317 }
320 /*
321 Local Variables:
322 mode:c++
323 c-file-style:"stroustrup"
324 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
325 indent-tabs-mode:nil
326 fill-column:99
327 End:
328 */
329 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :