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