Remove all occurences of the old Widget_ColorEdit.
[synfig.git] / synfig-studio / src / gtkmm / widget_value.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file widget_value.cpp
3 **      \brief Template File
4 **
5 **      $Id$
6 **
7 **      \legal
8 **      Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 **
10 **      This package is free software; you can redistribute it and/or
11 **      modify it under the terms of the GNU General Public License as
12 **      published by the Free Software Foundation; either version 2 of
13 **      the License, or (at your option) any later version.
14 **
15 **      This package is distributed in the hope that it will be useful,
16 **      but WITHOUT ANY WARRANTY; without even the implied warranty of
17 **      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 **      General Public License for more details.
19 **      \endlegal
20 */
21 /* ========================================================================= */
22
23 /* === H E A D E R S ======================================================= */
24
25 #ifdef USING_PCH
26 #       include "pch.h"
27 #else
28 #ifdef HAVE_CONFIG_H
29 #       include <config.h>
30 #endif
31
32 #include <gtkmm/label.h>
33 #include "widget_value.h"
34 #include <ETL/stringf>
35 #include <gtkmm/celleditable.h>
36 #include <gtkmm/editable.h>
37 #include <gtkmm/entry.h>
38 #include <gtkmm/eventbox.h>
39 #include <gtk/gtkentry.h> /* see XXX below */
40 #include "app.h"
41
42
43 #include "widget_vector.h"
44 #include "widget_filename.h"
45 #include "widget_enum.h"
46 #include "widget_canvaschooser.h"
47 #include "widget_time.h"
48 #include "app.h"
49 #include "widget_distance.h"
50
51 #include "general.h"
52
53 #endif
54
55 using namespace synfig;
56 using namespace etl;
57 using namespace std;
58 using namespace studio;
59
60 /* === M A C R O S ========================================================= */
61
62 #define DIGITS          15
63
64 /* === G L O B A L S ======================================================= */
65
66 /* === P R O C E D U R E S ================================================= */
67
68 /* === M E T H O D S ======================================================= */
69
70 Widget_ValueBase::Widget_ValueBase():
71         Glib::ObjectBase        (typeid(Widget_ValueBase)),
72         Gtk::HBox(),
73         real_adjustment(0,-2000000000,2000000000,0.05,0.05,0),
74         integer_adjustment(0,-2000000000,2000000000,1,1,0),
75         angle_adjustment(0,-2000000000,2000000000,1,1,0)
76 {
77         set_no_show_all();
78
79         label=manage(new class Gtk::Label("Unknown Datatype"));
80         pack_start(*label);
81         label->show();
82
83         vector_widget=manage(new class Widget_Vector());
84         pack_start(*vector_widget);
85
86         color_widget=manage(new class Gtk::ColorSelection());
87         pack_start(*color_widget);
88
89         enum_widget=manage(new class Widget_Enum());
90         pack_start(*enum_widget);
91
92         real_widget=manage(new class Gtk::SpinButton(real_adjustment,0.05,DIGITS));
93         pack_start(*real_widget);
94
95         integer_widget=manage(new class Gtk::SpinButton(integer_adjustment,1,0));
96         pack_start(*integer_widget);
97
98         angle_widget=manage(new class Gtk::SpinButton(angle_adjustment,15,2));
99         pack_start(*angle_widget);
100
101         bool_widget=manage(new class Gtk::CheckButton());
102         pack_start(*bool_widget);
103
104         //color_widget=manage(new class Gtk::ColorSelection());
105         //pack_start(*color_widget);
106
107         string_widget=manage(new class Gtk::Entry());
108         pack_start(*string_widget);
109
110         canvas_widget=manage(new class Widget_CanvasChooser());
111         pack_start(*canvas_widget);
112
113         filename_widget=manage(new class Widget_Filename());
114         pack_start(*filename_widget);
115
116         time_widget=manage(new class Widget_Time());
117         pack_start(*time_widget);
118
119         distance_widget=manage(new class Widget_Distance());
120         pack_start(*distance_widget);
121
122
123         vector_widget->signal_activate().connect(sigc::mem_fun(*this,&Widget_ValueBase::activate));
124         //color_widget->signal_activate().connect(sigc::mem_fun(*this,&Widget_ValueBase::activate));
125         enum_widget->signal_activate().connect(sigc::mem_fun(*this,&Widget_ValueBase::activate));
126         real_widget->signal_activate().connect(sigc::mem_fun(*this,&Widget_ValueBase::activate));
127         integer_widget->signal_activate().connect(sigc::mem_fun(*this,&Widget_ValueBase::activate));
128         angle_widget->signal_activate().connect(sigc::mem_fun(*this,&Widget_ValueBase::activate));
129         string_widget->signal_activate().connect(sigc::mem_fun(*this,&Widget_ValueBase::activate));
130         canvas_widget->signal_activate().connect(sigc::mem_fun(*this,&Widget_ValueBase::activate));
131         filename_widget->signal_activate().connect(sigc::mem_fun(*this,&Widget_ValueBase::activate));
132         time_widget->signal_activate().connect(sigc::mem_fun(*this,&Widget_ValueBase::activate));
133         distance_widget->signal_activate().connect(sigc::mem_fun(*this,&Widget_ValueBase::activate));
134
135         /*signal_focus_in_event().connect(
136                 sigc::bind_return(
137                 sigc::hide(
138                         sigc::mem_fun(*this,&Widget_ValueBase::grab_focus)
139                 ),false
140                 )
141         );*/
142 }
143
144 Widget_ValueBase::~Widget_ValueBase()
145 {
146 }
147
148 void
149 Widget_ValueBase::activate()
150 {
151         signal_activate()();
152 }
153
154 void
155 Widget_ValueBase::inside_cellrenderer()
156 {
157         string_widget->set_has_frame(false);
158         string_widget->gobj()->is_cell_renderer = true; // XXX
159
160         real_widget->set_has_frame(false);
161         //static_cast<Gtk::Entry*>(real_widget)->gobj()->is_cell_renderer = true; // XXX
162
163         distance_widget->set_has_frame(false);
164         //static_cast<Gtk::Entry*>(distance_widget)->gobj()->is_cell_renderer = true; // XXX
165
166         integer_widget->set_has_frame(false);
167         //static_cast<Gtk::Entry*>(integer_widget)->gobj()->is_cell_renderer = true; // XXX
168         vector_widget->set_has_frame(false);
169     //vector_widget->set_digits(10);
170
171         //color_widget->set_has_frame(false);
172     //color_widget->set_digits(10);
173         filename_widget->set_has_frame(false);
174         time_widget->set_has_frame(false);
175 }
176
177 void
178 Widget_ValueBase::set_sensitive(bool x)
179 {
180         Gtk::HBox::set_sensitive(x);
181         label->set_sensitive(x);
182         vector_widget->set_sensitive(x);
183         real_widget->set_sensitive(x);
184         integer_widget->set_sensitive(x);
185         bool_widget->set_sensitive(x);
186     color_widget->set_sensitive(x);
187         string_widget->set_sensitive(x);
188         canvas_widget->set_sensitive(x);
189         enum_widget->set_sensitive(x);
190         angle_widget->set_sensitive(x);
191         filename_widget->set_sensitive(x);
192         time_widget->set_sensitive(x);
193         distance_widget->set_sensitive(x);
194 }
195
196 void
197 Widget_ValueBase::set_value(const synfig::ValueBase &data)
198 {
199         label->hide();
200         vector_widget->hide();
201         real_widget->hide();
202         integer_widget->hide();
203         bool_widget->hide();
204     color_widget->hide();
205         string_widget->hide();
206         canvas_widget->hide();
207         enum_widget->hide();
208         angle_widget->hide();
209         filename_widget->hide();
210         time_widget->hide();
211         distance_widget->hide();
212
213         value=data;
214         try{
215         switch(value.get_type())
216         {
217         case ValueBase::TYPE_VECTOR:
218                 vector_widget->set_canvas(canvas);
219                 vector_widget->set_value(value.get(Vector()));
220                 vector_widget->show();
221                 break;
222         case ValueBase::TYPE_REAL:
223                 if(param_desc.get_is_distance() && canvas)
224                 {
225                         Distance dist(value.get(Real()),Distance::SYSTEM_UNITS);
226                         dist.convert(App::distance_system,canvas->rend_desc());
227                         distance_widget->set_value(dist);
228                         distance_widget->show();
229                 }
230                 else
231                 {
232                         real_widget->set_value(value.get(Real()));
233                         real_widget->show();
234                 }
235                 break;
236         case ValueBase::TYPE_TIME:
237                 if(canvas)time_widget->set_fps(canvas->rend_desc().get_frame_rate());
238                 time_widget->set_value(value.get(Time()));
239                 time_widget->show();
240                 break;
241         case ValueBase::TYPE_ANGLE:
242                 angle_widget->set_value(Angle::deg(value.get(Angle())).get());
243                 angle_widget->show();
244                 break;
245         case ValueBase::TYPE_INTEGER:
246                 if(param_desc.get_hint()!="enum")
247                 {
248                         integer_widget->set_value(value.get(int()));
249                         integer_widget->show();
250                 }
251                 else
252                 {
253                         enum_widget->set_param_desc(param_desc);
254                         enum_widget->set_value(value.get(int()));
255                         enum_widget->show();
256                 }
257                 break;
258         case ValueBase::TYPE_CANVAS:
259                 assert(canvas);
260                 canvas_widget->set_parent_canvas(canvas);
261                 canvas_widget->set_value(value.get(etl::loose_handle<synfig::Canvas>()));
262                 canvas_widget->show();
263                 break;
264         case ValueBase::TYPE_BOOL:
265                 bool_widget->set_active(value.get(bool()));
266                 bool_widget->show();
267                 break;
268         case ValueBase::TYPE_STRING:
269                 if(param_desc.get_hint()!="filename")
270                 {
271                         string_widget->set_text(value.get(string()));
272                         string_widget->show();
273                 }
274                 else
275                 {
276                         filename_widget->set_value(value.get(string()));
277                         filename_widget->show();
278                 }
279                 break;
280         case ValueBase::TYPE_COLOR:
281         {
282                 color_widget->set_current_color(studio::colorconv_synfig2gdk(value.get(synfig::Color())));
283                 color_widget->set_current_alpha((guint16) value.get(synfig::Color()).get_a() * 65535);
284                 color_widget->show();
285 /*
286                         Gdk::Color gdkcolor;
287                         synfig::Color color=value.get(synfig::Color());
288                         gdkcolor.set_rgb_p(color.get_r(),color.get_g(),color.get_b());
289                         color_widget->set_current_color(gdkcolor);
290                         color_widget->set_has_opacity_control(true);
291                         color_widget->set_current_alpha((unsigned short)(color.get_a()*65535.0));
292                         color_widget->show();
293 */
294                 }
295                 break;
296         default:
297                 label->show();
298                 break;
299         }
300         }catch(...) { synfig::error(__FILE__":%d: Caught something that was thrown",__LINE__); }
301 }
302
303 const synfig::ValueBase &
304 Widget_ValueBase::get_value()
305 {
306         switch(value.get_type())
307         {
308         case ValueBase::TYPE_VECTOR:
309                 value=vector_widget->get_value();
310                 break;
311         case ValueBase::TYPE_REAL:
312                 if(param_desc.get_is_distance() && canvas)
313                         value=distance_widget->get_value().units(canvas->rend_desc());
314                 else
315                         value=real_widget->get_value();
316                 break;
317         case ValueBase::TYPE_TIME:
318                 value=time_widget->get_value();
319                 break;
320         case ValueBase::TYPE_ANGLE:
321                 value=Angle::deg(angle_widget->get_value());
322                 break;
323         case ValueBase::TYPE_CANVAS:
324                 value=canvas_widget->get_value();
325                 break;
326         case ValueBase::TYPE_INTEGER:
327                 if(param_desc.get_hint()!="enum")
328                 {
329                         value=integer_widget->get_value_as_int();
330                 }
331                 else
332                 {
333                         value=enum_widget->get_value();
334                 }
335
336                 break;
337         case ValueBase::TYPE_BOOL:
338                 value=bool_widget->get_active();
339                 break;
340         case ValueBase::TYPE_STRING:
341                 if(param_desc.get_hint()!="filename")
342                 {
343                         value=string(string_widget->get_text());
344                 }
345                 else
346                 {
347                         value=string(filename_widget->get_value());
348                 }
349                 break;
350         case ValueBase::TYPE_COLOR:
351         {
352                         value=studio::colorconv_gdk2synfig(color_widget->get_current_color(), color_widget->get_current_alpha() / 65535.0);
353 /*
354                         Gdk::Color gdkcolor;
355                         synfig::Color color;
356                         gdkcolor=color_widget->get_current_color();
357                         color.set_r(gdkcolor.get_red_p());
358             color.set_g(gdkcolor.get_green_p());
359             color.set_b(gdkcolor.get_blue_p());
360                         color.set_a(color_widget->get_current_alpha()/65535.0);
361
362                         value=color;
363 */
364                 }
365                 break;
366         default:
367                 break;
368         }
369
370         return value;
371 }
372
373
374 void
375 Widget_ValueBase::on_grab_focus()
376 {
377         switch(value.get_type())
378         {
379         case ValueBase::TYPE_VECTOR:
380                 vector_widget->grab_focus();
381                 break;
382         case ValueBase::TYPE_REAL:
383                 if(param_desc.get_is_distance()&& canvas)
384                         distance_widget->grab_focus();
385                 else
386                         real_widget->grab_focus();
387                 break;
388         case ValueBase::TYPE_TIME:
389                 time_widget->grab_focus();
390                 break;
391         case ValueBase::TYPE_ANGLE:
392                 angle_widget->grab_focus();
393                 break;
394         case ValueBase::TYPE_CANVAS:
395                 canvas_widget->grab_focus();
396                 break;
397         case ValueBase::TYPE_INTEGER:
398                 if(param_desc.get_hint()!="enum")
399                 {
400                         integer_widget->grab_focus();
401                 }
402                 else
403                 {
404                         enum_widget->grab_focus();
405                 }
406
407                 break;
408         case ValueBase::TYPE_BOOL:
409                 bool_widget->grab_focus();
410                 break;
411         case ValueBase::TYPE_STRING:
412                 if(param_desc.get_hint()!="filename")
413                 {
414                         string_widget->grab_focus();
415                 }
416                 else
417                 {
418                         filename_widget->grab_focus();
419                 }
420                 break;
421         case ValueBase::TYPE_COLOR:
422         {
423                         color_widget->grab_focus();
424                 }
425                 break;
426         default:
427                 break;
428         }
429 }
430
431 /*
432 Glib::SignalProxy0<void>
433 Widget_ValueBase::signal_activate()
434 {
435         switch(value.get_type())
436         {
437         case ValueBase::TYPE_VECTOR:
438                 return vector_widget->signal_activate();
439                 break;
440         case ValueBase::TYPE_REAL:
441                 if(param_desc.get_is_distance()&& canvas)
442                         return distance_widget->signal_activate();
443                 else
444                         return real_widget->signal_activate();
445
446                 break;
447         case ValueBase::TYPE_TIME:
448                 return time_widget->signal_activate();
449                 break;
450         case ValueBase::TYPE_ANGLE:
451                 return angle_widget->signal_activate();
452                 break;
453         case ValueBase::TYPE_CANVAS:
454                 return canvas_widget->signal_activate();
455                 break;
456         case ValueBase::TYPE_INTEGER:
457                 if(param_desc.get_hint()!="enum")
458                         return integer_widget->signal_activate();
459                 else
460                         return enum_widget->signal_activate();
461
462                 break;
463         case ValueBase::TYPE_BOOL:
464                 return string_widget->signal_activate();
465                 break;
466         case ValueBase::TYPE_STRING:
467                 if(param_desc.get_hint()!="filename")
468                 {
469                         return string_widget->signal_activate();
470                 }
471                 else
472                 {
473                         return filename_widget->signal_activate();
474                 }
475                 break;
476         case ValueBase::TYPE_COLOR:
477         {
478                         return color_widget->signal_activate();
479                 }
480                 break;
481         default:
482                 return string_widget->signal_activate();
483                 break;
484         }
485 }
486 */