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