1 /* === S Y N F I G ========================================================= */
2 /*! \file widget_value.cpp
3 ** \brief Template File
8 ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
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.
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.
21 /* ========================================================================= */
23 /* === H E A D E R S ======================================================= */
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 */
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"
50 #include "widget_distance.h"
56 using namespace synfig;
59 using namespace studio;
61 /* === M A C R O S ========================================================= */
65 /* === G L O B A L S ======================================================= */
67 /* === P R O C E D U R E S ================================================= */
69 /* === M E T H O D S ======================================================= */
71 Widget_ValueBase::Widget_ValueBase():
72 Glib::ObjectBase (typeid(Widget_ValueBase)),
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)
80 label=manage(new class Gtk::Label("Unknown Datatype"));
84 vector_widget=manage(new class Widget_Vector());
85 pack_start(*vector_widget);
87 color_widget=manage(new class Widget_ColorEdit());
88 pack_start(*color_widget);
90 enum_widget=manage(new class Widget_Enum());
91 pack_start(*enum_widget);
93 real_widget=manage(new class Gtk::SpinButton(real_adjustment,0.05,DIGITS));
94 pack_start(*real_widget);
96 integer_widget=manage(new class Gtk::SpinButton(integer_adjustment,1,0));
97 pack_start(*integer_widget);
99 angle_widget=manage(new class Gtk::SpinButton(angle_adjustment,15,2));
100 pack_start(*angle_widget);
102 bool_widget=manage(new class Gtk::CheckButton());
103 pack_start(*bool_widget);
105 //color_widget=manage(new class Gtk::ColorSelection());
106 //pack_start(*color_widget);
108 string_widget=manage(new class Gtk::Entry());
109 pack_start(*string_widget);
111 canvas_widget=manage(new class Widget_CanvasChooser());
112 pack_start(*canvas_widget);
114 filename_widget=manage(new class Widget_Filename());
115 pack_start(*filename_widget);
117 time_widget=manage(new class Widget_Time());
118 pack_start(*time_widget);
120 distance_widget=manage(new class Widget_Distance());
121 pack_start(*distance_widget);
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));
136 /*signal_focus_in_event().connect(
139 sigc::mem_fun(*this,&Widget_ValueBase::grab_focus)
145 Widget_ValueBase::~Widget_ValueBase()
150 Widget_ValueBase::activate()
157 Widget_ValueBase::inside_cellrenderer()
159 string_widget->set_has_frame(false);
160 string_widget->gobj()->is_cell_renderer = true; // XXX
162 real_widget->set_has_frame(false);
163 //static_cast<Gtk::Entry*>(real_widget)->gobj()->is_cell_renderer = true; // XXX
165 distance_widget->set_has_frame(false);
166 //static_cast<Gtk::Entry*>(distance_widget)->gobj()->is_cell_renderer = true; // XXX
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);
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);
180 Widget_ValueBase::set_sensitive(bool x)
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);
199 Widget_ValueBase::set_value(const synfig::ValueBase &data)
202 vector_widget->hide();
204 integer_widget->hide();
206 color_widget->hide();
207 string_widget->hide();
208 canvas_widget->hide();
210 angle_widget->hide();
211 filename_widget->hide();
213 distance_widget->hide();
217 switch(value.get_type())
219 case ValueBase::TYPE_VECTOR:
220 vector_widget->set_canvas(canvas);
221 vector_widget->set_value(value.get(Vector()));
222 vector_widget->show();
224 case ValueBase::TYPE_REAL:
225 if(param_desc.get_is_distance() && canvas)
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();
234 real_widget->set_value(value.get(Real()));
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()));
243 case ValueBase::TYPE_ANGLE:
244 angle_widget->set_value(Angle::deg(value.get(Angle())).get());
245 angle_widget->show();
247 case ValueBase::TYPE_INTEGER:
248 if(param_desc.get_hint()!="enum")
250 integer_widget->set_value(value.get(int()));
251 integer_widget->show();
255 enum_widget->set_param_desc(param_desc);
256 enum_widget->set_value(value.get(int()));
260 case ValueBase::TYPE_CANVAS:
262 canvas_widget->set_parent_canvas(canvas);
263 canvas_widget->set_value(value.get(etl::loose_handle<synfig::Canvas>()));
264 canvas_widget->show();
266 case ValueBase::TYPE_BOOL:
267 bool_widget->set_active(value.get(bool()));
270 case ValueBase::TYPE_STRING:
271 if(param_desc.get_hint()!="filename")
273 string_widget->set_text(value.get(string()));
274 string_widget->show();
278 filename_widget->set_value(value.get(string()));
279 filename_widget->show();
282 case ValueBase::TYPE_COLOR:
284 color_widget->set_value(value.get(synfig::Color()));
285 color_widget->show();
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();
301 }catch(...) { synfig::error(__FILE__":%d: Caught something that was thrown",__LINE__); }
304 const synfig::ValueBase &
305 Widget_ValueBase::get_value()
307 switch(value.get_type())
309 case ValueBase::TYPE_VECTOR:
310 value=vector_widget->get_value();
312 case ValueBase::TYPE_REAL:
313 if(param_desc.get_is_distance() && canvas)
314 value=distance_widget->get_value().units(canvas->rend_desc());
316 value=real_widget->get_value();
318 case ValueBase::TYPE_TIME:
319 value=time_widget->get_value();
321 case ValueBase::TYPE_ANGLE:
322 value=Angle::deg(angle_widget->get_value());
324 case ValueBase::TYPE_CANVAS:
325 value=canvas_widget->get_value();
327 case ValueBase::TYPE_INTEGER:
328 if(param_desc.get_hint()!="enum")
330 value=integer_widget->get_value_as_int();
334 value=enum_widget->get_value();
338 case ValueBase::TYPE_BOOL:
339 value=bool_widget->get_active();
341 case ValueBase::TYPE_STRING:
342 if(param_desc.get_hint()!="filename")
344 value=string(string_widget->get_text());
348 value=string(filename_widget->get_value());
351 case ValueBase::TYPE_COLOR:
353 value=color_widget->get_value();
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);
376 Widget_ValueBase::on_grab_focus()
378 switch(value.get_type())
380 case ValueBase::TYPE_VECTOR:
381 vector_widget->grab_focus();
383 case ValueBase::TYPE_REAL:
384 if(param_desc.get_is_distance()&& canvas)
385 distance_widget->grab_focus();
387 real_widget->grab_focus();
389 case ValueBase::TYPE_TIME:
390 time_widget->grab_focus();
392 case ValueBase::TYPE_ANGLE:
393 angle_widget->grab_focus();
395 case ValueBase::TYPE_CANVAS:
396 canvas_widget->grab_focus();
398 case ValueBase::TYPE_INTEGER:
399 if(param_desc.get_hint()!="enum")
401 integer_widget->grab_focus();
405 enum_widget->grab_focus();
409 case ValueBase::TYPE_BOOL:
410 bool_widget->grab_focus();
412 case ValueBase::TYPE_STRING:
413 if(param_desc.get_hint()!="filename")
415 string_widget->grab_focus();
419 filename_widget->grab_focus();
422 case ValueBase::TYPE_COLOR:
424 color_widget->grab_focus();
433 Glib::SignalProxy0<void>
434 Widget_ValueBase::signal_activate()
436 switch(value.get_type())
438 case ValueBase::TYPE_VECTOR:
439 return vector_widget->signal_activate();
441 case ValueBase::TYPE_REAL:
442 if(param_desc.get_is_distance()&& canvas)
443 return distance_widget->signal_activate();
445 return real_widget->signal_activate();
448 case ValueBase::TYPE_TIME:
449 return time_widget->signal_activate();
451 case ValueBase::TYPE_ANGLE:
452 return angle_widget->signal_activate();
454 case ValueBase::TYPE_CANVAS:
455 return canvas_widget->signal_activate();
457 case ValueBase::TYPE_INTEGER:
458 if(param_desc.get_hint()!="enum")
459 return integer_widget->signal_activate();
461 return enum_widget->signal_activate();
464 case ValueBase::TYPE_BOOL:
465 return string_widget->signal_activate();
467 case ValueBase::TYPE_STRING:
468 if(param_desc.get_hint()!="filename")
470 return string_widget->signal_activate();
474 return filename_widget->signal_activate();
477 case ValueBase::TYPE_COLOR:
479 return color_widget->signal_activate();
483 return string_widget->signal_activate();