1 /* === S Y N F I G ========================================================= */
2 /*! \file widget_value.cpp
3 ** \brief Template File
5 ** $Id: widget_value.cpp,v 1.1.1.1 2005/01/07 03:34:37 darco Exp $
8 ** Copyright (c) 2002 Robert B. Quattlebaum Jr.
10 ** This software and associated documentation
11 ** are CONFIDENTIAL and PROPRIETARY property of
12 ** the above-mentioned copyright holder.
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.
20 /* ========================================================================= */
22 /* === H E A D E R S ======================================================= */
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 */
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"
49 #include "widget_distance.h"
53 using namespace synfig;
56 using namespace studio;
58 /* === M A C R O S ========================================================= */
62 /* === G L O B A L S ======================================================= */
64 /* === P R O C E D U R E S ================================================= */
66 /* === M E T H O D S ======================================================= */
68 Widget_ValueBase::Widget_ValueBase():
69 Glib::ObjectBase (typeid(Widget_ValueBase)),
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)
77 label=manage(new class Gtk::Label("Unknown Datatype"));
81 vector_widget=manage(new class Widget_Vector());
82 pack_start(*vector_widget);
84 color_widget=manage(new class Widget_ColorEdit());
85 pack_start(*color_widget);
87 enum_widget=manage(new class Widget_Enum());
88 pack_start(*enum_widget);
90 real_widget=manage(new class Gtk::SpinButton(real_adjustment,0.05,DIGITS));
91 pack_start(*real_widget);
93 integer_widget=manage(new class Gtk::SpinButton(integer_adjustment,1,0));
94 pack_start(*integer_widget);
96 angle_widget=manage(new class Gtk::SpinButton(angle_adjustment,15,2));
97 pack_start(*angle_widget);
99 bool_widget=manage(new class Gtk::CheckButton());
100 pack_start(*bool_widget);
102 //color_widget=manage(new class Gtk::ColorSelection());
103 //pack_start(*color_widget);
105 string_widget=manage(new class Gtk::Entry());
106 pack_start(*string_widget);
108 canvas_widget=manage(new class Widget_CanvasChooser());
109 pack_start(*canvas_widget);
111 filename_widget=manage(new class Widget_Filename());
112 pack_start(*filename_widget);
114 time_widget=manage(new class Widget_Time());
115 pack_start(*time_widget);
117 distance_widget=manage(new class Widget_Distance());
118 pack_start(*distance_widget);
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));
133 /*signal_focus_in_event().connect(
136 sigc::mem_fun(*this,&Widget_ValueBase::grab_focus)
142 Widget_ValueBase::~Widget_ValueBase()
147 Widget_ValueBase::activate()
154 Widget_ValueBase::inside_cellrenderer()
156 string_widget->set_has_frame(false);
157 string_widget->gobj()->is_cell_renderer = true; // XXX
159 real_widget->set_has_frame(false);
160 //static_cast<Gtk::Entry*>(real_widget)->gobj()->is_cell_renderer = true; // XXX
162 distance_widget->set_has_frame(false);
163 //static_cast<Gtk::Entry*>(distance_widget)->gobj()->is_cell_renderer = true; // XXX
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);
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);
177 Widget_ValueBase::set_sensitive(bool x)
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);
196 Widget_ValueBase::set_value(const synfig::ValueBase &data)
199 vector_widget->hide();
201 integer_widget->hide();
203 color_widget->hide();
204 string_widget->hide();
205 canvas_widget->hide();
207 angle_widget->hide();
208 filename_widget->hide();
210 distance_widget->hide();
214 switch(value.get_type())
216 case ValueBase::TYPE_VECTOR:
217 vector_widget->set_canvas(canvas);
218 vector_widget->set_value(value.get(Vector()));
219 vector_widget->show();
221 case ValueBase::TYPE_REAL:
222 if(param_desc.get_is_distance() && canvas)
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();
231 real_widget->set_value(value.get(Real()));
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()));
240 case ValueBase::TYPE_ANGLE:
241 angle_widget->set_value(Angle::deg(value.get(Angle())).get());
242 angle_widget->show();
244 case ValueBase::TYPE_INTEGER:
245 if(param_desc.get_hint()!="enum")
247 integer_widget->set_value(value.get(int()));
248 integer_widget->show();
252 enum_widget->set_param_desc(param_desc);
253 enum_widget->set_value(value.get(int()));
257 case ValueBase::TYPE_CANVAS:
259 canvas_widget->set_parent_canvas(canvas);
260 canvas_widget->set_value(value.get(etl::loose_handle<synfig::Canvas>()));
261 canvas_widget->show();
263 case ValueBase::TYPE_BOOL:
264 bool_widget->set_active(value.get(bool()));
267 case ValueBase::TYPE_STRING:
268 if(param_desc.get_hint()!="filename")
270 string_widget->set_text(value.get(string()));
271 string_widget->show();
275 filename_widget->set_value(value.get(string()));
276 filename_widget->show();
279 case ValueBase::TYPE_COLOR:
281 color_widget->set_value(value.get(synfig::Color()));
282 color_widget->show();
285 synfig::Color color=value.get(synfig::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();
298 }catch(...) { synfig::error(__FILE__":%d: Caught something that was thrown",__LINE__); }
301 const synfig::ValueBase &
302 Widget_ValueBase::get_value()
304 switch(value.get_type())
306 case ValueBase::TYPE_VECTOR:
307 value=vector_widget->get_value();
309 case ValueBase::TYPE_REAL:
310 if(param_desc.get_is_distance() && canvas)
311 value=distance_widget->get_value().units(canvas->rend_desc());
313 value=real_widget->get_value();
315 case ValueBase::TYPE_TIME:
316 value=time_widget->get_value();
318 case ValueBase::TYPE_ANGLE:
319 value=Angle::deg(angle_widget->get_value());
321 case ValueBase::TYPE_CANVAS:
322 value=canvas_widget->get_value();
324 case ValueBase::TYPE_INTEGER:
325 if(param_desc.get_hint()!="enum")
327 value=integer_widget->get_value_as_int();
331 value=enum_widget->get_value();
335 case ValueBase::TYPE_BOOL:
336 value=bool_widget->get_active();
338 case ValueBase::TYPE_STRING:
339 if(param_desc.get_hint()!="filename")
341 value=string(string_widget->get_text());
345 value=string(filename_widget->get_value());
348 case ValueBase::TYPE_COLOR:
350 value=color_widget->get_value();
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);
373 Widget_ValueBase::on_grab_focus()
375 switch(value.get_type())
377 case ValueBase::TYPE_VECTOR:
378 vector_widget->grab_focus();
380 case ValueBase::TYPE_REAL:
381 if(param_desc.get_is_distance()&& canvas)
382 distance_widget->grab_focus();
384 real_widget->grab_focus();
386 case ValueBase::TYPE_TIME:
387 time_widget->grab_focus();
389 case ValueBase::TYPE_ANGLE:
390 angle_widget->grab_focus();
392 case ValueBase::TYPE_CANVAS:
393 canvas_widget->grab_focus();
395 case ValueBase::TYPE_INTEGER:
396 if(param_desc.get_hint()!="enum")
398 integer_widget->grab_focus();
402 enum_widget->grab_focus();
406 case ValueBase::TYPE_BOOL:
407 bool_widget->grab_focus();
409 case ValueBase::TYPE_STRING:
410 if(param_desc.get_hint()!="filename")
412 string_widget->grab_focus();
416 filename_widget->grab_focus();
419 case ValueBase::TYPE_COLOR:
421 color_widget->grab_focus();
430 Glib::SignalProxy0<void>
431 Widget_ValueBase::signal_activate()
433 switch(value.get_type())
435 case ValueBase::TYPE_VECTOR:
436 return vector_widget->signal_activate();
438 case ValueBase::TYPE_REAL:
439 if(param_desc.get_is_distance()&& canvas)
440 return distance_widget->signal_activate();
442 return real_widget->signal_activate();
445 case ValueBase::TYPE_TIME:
446 return time_widget->signal_activate();
448 case ValueBase::TYPE_ANGLE:
449 return angle_widget->signal_activate();
451 case ValueBase::TYPE_CANVAS:
452 return canvas_widget->signal_activate();
454 case ValueBase::TYPE_INTEGER:
455 if(param_desc.get_hint()!="enum")
456 return integer_widget->signal_activate();
458 return enum_widget->signal_activate();
461 case ValueBase::TYPE_BOOL:
462 return string_widget->signal_activate();
464 case ValueBase::TYPE_STRING:
465 if(param_desc.get_hint()!="filename")
467 return string_widget->signal_activate();
471 return filename_widget->signal_activate();
474 case ValueBase::TYPE_COLOR:
476 return color_widget->signal_activate();
480 return string_widget->signal_activate();