1 /* === S Y N F I G ========================================================= */
2 /*! \file widget_defaults.cpp
3 ** \brief Template File
5 ** $Id: widget_defaults.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 "widget_defaults.h"
32 #include "widget_color.h"
33 #include "widget_gradient.h"
34 #include "dialog_color.h"
35 #include "dialog_gradient.h"
37 #include <gtkmm/menu.h>
38 #include <gtkmm/scale.h>
39 #include <synfig/exception.h>
40 #include <synfigapp/main.h>
41 #include "canvasview.h"
42 #include "widget_distance.h"
43 #include "widget_enum.h"
47 /* === U S I N G =========================================================== */
51 using namespace synfig;
52 using namespace studio;
54 /* === M A C R O S ========================================================= */
56 #define GRADIENT_HEIGHT 16
57 #define DEFAULT_INCREMENT (0.25)
58 #define DEFAULT_WIDTH (synfig::Distance(3,synfig::Distance::SYSTEM_POINTS))
60 /* === G L O B A L S ======================================================= */
62 class studio::Widget_Brush : public Gtk::DrawingArea
67 signal_expose_event().connect(sigc::mem_fun(*this, &studio::Widget_Brush::redraw));
69 set_size_request(24,24);
70 add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
71 add_events(Gdk::BUTTON1_MOTION_MASK);
73 synfigapp::Main::signal_foreground_color_changed().connect(sigc::mem_fun(*this,&studio::Widget_Brush::queue_draw));
74 synfigapp::Main::signal_background_color_changed().connect(sigc::mem_fun(*this,&studio::Widget_Brush::queue_draw));
75 synfigapp::Main::signal_bline_width_changed().connect(sigc::mem_fun(*this,&studio::Widget_Brush::queue_draw));
76 studio::App::signal_instance_selected().connect(sigc::hide(sigc::mem_fun(*this,&studio::Widget_Brush::queue_draw)));
80 redraw(GdkEventExpose*bleh)
82 Glib::RefPtr<Gdk::GC> gc(Gdk::GC::create(get_window()));
84 const int h(get_height());
85 const int w(get_width());
88 if(App::get_selected_canvas_view())
90 const RendDesc& rend_desc(App::get_selected_canvas_view()->get_canvas()->rend_desc());
91 pixelsize=synfigapp::Main::get_bline_width().get(Distance::SYSTEM_PIXELS,rend_desc);
96 pixelsize=synfigapp::Main::get_bline_width().get(Distance::SYSTEM_PIXELS,rend_desc);
98 // Fill in the background color
99 render_color_to_window(get_window(),Gdk::Rectangle(0,0,w,h),synfigapp::Main::get_background_color());
102 gc->set_rgb_fg_color(colorconv_synfig2gdk(synfigapp::Main::get_background_color()));
103 gc->set_line_attributes(1,Gdk::LINE_SOLID,Gdk::CAP_BUTT,Gdk::JOIN_MITER);
104 get_window()->draw_rectangle(
112 // Draw in the circle
113 gc->set_rgb_fg_color(colorconv_synfig2gdk(synfigapp::Main::get_foreground_color()));
114 gc->set_function(Gdk::COPY);
115 gc->set_line_attributes(1,Gdk::LINE_SOLID,Gdk::CAP_BUTT,Gdk::JOIN_MITER);
116 get_window()->draw_arc(
119 round_to_int(((float)w/2.0f)-pixelsize/2.0f),
120 round_to_int(((float)h/2.0f)-pixelsize/2.0f),
121 round_to_int(pixelsize+0.6),
122 round_to_int(pixelsize+0.6),
131 on_event(GdkEvent *event)
133 // const int x(static_cast<int>(event->button.x));
134 const int y(static_cast<int>(event->button.y));
136 const int h(get_height());
137 // const int w(get_width());
141 case GDK_MOTION_NOTIFY:
143 case GDK_BUTTON_RELEASE:
144 if(event->button.button==1) // Left click
146 Distance dist(synfigapp::Main::get_bline_width());
148 if(y<h/2) // increase BLine size
150 dist+=DEFAULT_INCREMENT;
152 else // Decrease BLine size
154 dist-=DEFAULT_INCREMENT;
156 synfigapp::Main::set_bline_width(dist);
159 if(event->button.button==3)
161 // right click on bline width
162 synfigapp::Main::set_bline_width(DEFAULT_WIDTH);
168 Distance dist(synfigapp::Main::get_bline_width());
170 if(event->scroll.direction==GDK_SCROLL_UP)
172 dist+=DEFAULT_INCREMENT;
174 else if(event->scroll.direction==GDK_SCROLL_DOWN)
176 dist-=DEFAULT_INCREMENT;
178 synfigapp::Main::set_bline_width(dist);
190 /* === P R O C E D U R E S ================================================= */
192 /* === M E T H O D S ======================================================= */
194 Widget_Defaults::Widget_Defaults()
196 //set_size_request(48,48+GRADIENT_HEIGHT+16);
197 //set_size_request(48,-1);
200 Gtk::Table* subtable(manage(new Gtk::Table()));
203 widget_fg_color=manage(new Widget_Color());
204 widget_fg_color->show();
205 widget_fg_color->set_size_request(16,16);
206 widget_fg_color->signal_clicked().connect(sigc::mem_fun(*this,&Widget_Defaults::on_fg_color_clicked));
207 subtable->attach(*widget_fg_color, 0, 2, 0, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
208 tooltips_.set_tip(*widget_fg_color,_("Foreground Color"));
211 widget_bg_color=manage(new Widget_Color());
212 widget_bg_color->show();
213 widget_bg_color->set_size_request(16,16);
214 widget_bg_color->signal_clicked().connect(sigc::mem_fun(*this,&Widget_Defaults::on_bg_color_clicked));
215 subtable->attach(*widget_bg_color, 1, 3, 1, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
216 tooltips_.set_tip(*widget_bg_color,_("Background Color"));
221 Gtk::Button* button_swap(manage(new Gtk::Button()));
223 button_swap->set_relief(Gtk::RELIEF_NONE);
224 button_swap->set_border_width(0);
225 icon=manage(new Gtk::Image(Gtk::StockID("synfig-swap_colors"),Gtk::IconSize(1)));
227 button_swap->add(*icon);
228 //button_swap->get_child()->set_size_request(16/3,16/3);
229 //button_swap->set_size_request(16/3,16/3);
230 dynamic_cast<Gtk::Misc*>(button_swap->get_child())->set_padding(0,0);
231 button_swap->signal_clicked().connect(sigc::mem_fun(*this,&Widget_Defaults::on_swap_color_clicked));
232 subtable->attach(*button_swap, 2, 3, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
233 tooltips_.set_tip(*button_swap,_("Swap Background and\nForeground Colors"));
236 Gtk::Button* button_reset(manage(new Gtk::Button("R")));
237 button_reset->show();
238 button_reset->set_relief(Gtk::RELIEF_NONE);
239 button_reset->set_border_width(0);
240 dynamic_cast<Gtk::Misc*>(button_reset->get_child())->set_padding(0,0);
241 //button_reset->set_size_request(16/3,16/3);
242 button_reset->signal_clicked().connect(sigc::mem_fun(*this,&Widget_Defaults::on_reset_color_clicked));
243 subtable->attach(*button_reset, 0,1, 2, 3, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
244 tooltips_.set_tip(*button_reset,_("Reset Colors to Black and White"));
247 attach(*subtable, 0, 1, 0, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 1, 1);
248 subtable->set_size_request(36,36);
249 subtable->set_homogeneous(true);
252 widget_brush=manage(new Widget_Brush());
253 widget_brush->show();
254 widget_brush->set_size_request(36,36);
255 attach(*widget_brush,1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 1, 1);
256 tooltips_.set_tip(*widget_brush,_("Brush Preview"));
258 widget_bline_width=manage(new Widget_Distance());
259 widget_bline_width->show();
260 widget_bline_width->set_digits(2);
261 widget_bline_width->set_size_request(24,-1);
262 widget_bline_width->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::on_bline_width_changed));
263 attach(*widget_bline_width,1, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
264 tooltips_.set_tip(*widget_bline_width,_("Brush Size"));
267 widget_blend_method=manage(new Widget_Enum());
268 widget_blend_method->show();
269 widget_blend_method->signal_activate().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::on_blend_method_changed));
270 widget_blend_method->set_param_desc(ParamDesc(Color::BLEND_COMPOSITE,"blend_method"));
271 attach(*widget_blend_method,0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 1, 1);
272 tooltips_.set_tip(*widget_blend_method,_("Default Blend Method"));
274 widget_interpolation=manage(new Widget_Enum());
275 widget_interpolation->show();
276 widget_interpolation->signal_activate().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::on_interpolation_changed));
277 widget_interpolation->set_param_desc(
278 ParamDesc("interpolation")
280 .add_enum_value(INTERPOLATION_TCB,"auto",_("TBC"))
281 .add_enum_value(INTERPOLATION_CONSTANT,"constant",_("Constant"))
282 .add_enum_value(INTERPOLATION_HALT,"ease",_("Ease in/out"))
283 .add_enum_value(INTERPOLATION_LINEAR,"linear",_("Linear"))
285 attach(*widget_interpolation,0, 2, 5, 6, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 1, 1);
286 tooltips_.set_tip(*widget_interpolation,_("Default Interpolation"));
288 widget_opacity=manage(new Gtk::HScale(0.0f,1.01f,0.01f));
289 widget_opacity->show();
290 widget_opacity->set_digits(2);
291 widget_opacity->set_value_pos(Gtk::POS_LEFT);
292 widget_opacity->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::on_opacity_changed));
293 attach(*widget_opacity,0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 1, 1);
294 tooltips_.set_tip(*widget_opacity,_("Default Opacity"));
296 widget_gradient=manage(new Widget_Gradient());
297 widget_gradient->show();
298 widget_gradient->set_size_request(-1,GRADIENT_HEIGHT);
299 widget_gradient->signal_clicked().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::on_gradient_clicked));
300 attach(*widget_gradient,0, 2, 4, 5, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 1, 1);
301 tooltips_.set_tip(*widget_gradient,_("Default Gradient"));
305 synfigapp::Main::signal_opacity_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::opacity_refresh));
306 synfigapp::Main::signal_bline_width_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::bline_width_refresh));
307 synfigapp::Main::signal_foreground_color_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::fg_color_refresh));
308 synfigapp::Main::signal_background_color_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::bg_color_refresh));
309 synfigapp::Main::signal_gradient_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::gradient_refresh));
310 synfigapp::Main::signal_blend_method_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::blend_method_refresh));
311 synfigapp::Main::signal_interpolation_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::interpolation_refresh));
316 bline_width_refresh();
317 blend_method_refresh();
319 interpolation_refresh();
321 set_size_request(48,48+GRADIENT_HEIGHT);
322 signal_expose_event().connect(sigc::mem_fun(*this, &studio::Widget_Defaults::redraw));
323 add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
324 add_events(Gdk::BUTTON1_MOTION_MASK);
326 synfigapp::Main::signal_foreground_color_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::queue_draw));
327 synfigapp::Main::signal_background_color_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::queue_draw));
328 synfigapp::Main::signal_gradient_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::queue_draw));
329 synfigapp::Main::signal_bline_width_changed().connect(sigc::mem_fun(*this,&studio::Widget_Defaults::queue_draw));
331 if(App::dialog_gradient)
333 App::dialog_gradient->set_gradient(synfigapp::Main::get_gradient());
334 App::dialog_gradient->reset();
335 App::dialog_gradient->signal_edited().connect(sigc::mem_fun(synfigapp::Main::set_gradient));
338 if(App::dialog_color)
340 App::dialog_color->set_color(synfigapp::Main::get_foreground_color());
341 App::dialog_color->reset();
342 App::dialog_color->signal_edited().connect(sigc::mem_fun(synfigapp::Main::set_foreground_color));
347 Widget_Defaults::~Widget_Defaults()
352 Widget_Defaults::fg_color_refresh()
354 widget_fg_color->set_value(synfigapp::Main::get_foreground_color());
358 Widget_Defaults::bg_color_refresh()
360 widget_bg_color->set_value(synfigapp::Main::get_background_color());
364 Widget_Defaults::gradient_refresh()
366 widget_gradient->set_value(synfigapp::Main::get_gradient());
370 Widget_Defaults::bline_width_refresh()
372 widget_bline_width->set_value(synfigapp::Main::get_bline_width());
376 Widget_Defaults::blend_method_refresh()
378 widget_blend_method->set_value(synfigapp::Main::get_blend_method());
382 Widget_Defaults::interpolation_refresh()
384 widget_interpolation->set_value(synfigapp::Main::get_interpolation());
388 Widget_Defaults::opacity_refresh()
390 widget_opacity->set_value(synfigapp::Main::get_opacity());
394 Widget_Defaults::on_opacity_changed()
396 synfigapp::Main::set_opacity(widget_opacity->get_value());
400 Widget_Defaults::on_blend_method_changed()
402 synfigapp::Main::set_blend_method(Color::BlendMethod(widget_blend_method->get_value()));
406 Widget_Defaults::on_interpolation_changed()
408 synfigapp::Main::set_interpolation(Waypoint::Interpolation(widget_interpolation->get_value()));
412 Widget_Defaults::on_bline_width_changed()
414 synfigapp::Main::set_bline_width(widget_bline_width->get_value());
418 Widget_Defaults::on_fg_color_clicked()
420 // Left click on foreground
421 App::dialog_color->set_color(synfigapp::Main::get_foreground_color());
422 App::dialog_color->reset();
423 App::dialog_color->signal_edited().connect(sigc::ptr_fun(synfigapp::Main::set_foreground_color));
424 App::dialog_color->present();
428 Widget_Defaults::on_bg_color_clicked()
430 // Left click on background
431 App::dialog_color->set_color(synfigapp::Main::get_background_color());
432 App::dialog_color->reset();
433 App::dialog_color->signal_edited().connect(sigc::ptr_fun(synfigapp::Main::set_background_color));
434 App::dialog_color->present();
438 Widget_Defaults::on_swap_color_clicked()
440 synfigapp::Main::color_swap();
444 Widget_Defaults::on_reset_color_clicked()
446 synfigapp::Main::set_background_color(Color::white());
447 synfigapp::Main::set_foreground_color(Color::black());
451 Widget_Defaults::on_gradient_clicked()
453 App::dialog_gradient->set_gradient(synfigapp::Main::get_gradient());
454 App::dialog_gradient->reset();
455 App::dialog_gradient->signal_edited().connect(sigc::ptr_fun(synfigapp::Main::set_gradient));
456 App::dialog_gradient->present();
461 Widget_Defaults::redraw(GdkEventExpose*bleh)
463 Glib::RefPtr<Gdk::GC> gc(Gdk::GC::create(get_window()));
465 const int h(get_height());
466 const int w(get_width());
467 const int size=std::min(h-GRADIENT_HEIGHT,w);
469 render_color_to_window(get_window(),Gdk::Rectangle(size/4,size/4,size/4*3-1,size/4*3-1),synfigapp::Main::get_background_color());
470 render_color_to_window(get_window(),Gdk::Rectangle(0,0,size/4*3-1,size/4*3-1),synfigapp::Main::get_foreground_color());
471 render_gradient_to_window(get_window(),Gdk::Rectangle(0,h-GRADIENT_HEIGHT,w,GRADIENT_HEIGHT-1),synfigapp::Main::get_gradient());
477 Glib::RefPtr<Pango::Layout> layout(Pango::Layout::create(get_pango_context()));
479 gc->set_rgb_fg_color(Gdk::Color("#FF0000"));
480 layout->set_text(synfigapp::Main::get_bline_width().get_string(2));
481 layout->set_alignment(Pango::ALIGN_CENTER);
482 layout->set_width(w/2);
483 get_window()->draw_layout(gc, w*3/4, (h-GRADIENT_HEIGHT)-16, layout);
489 Widget_Defaults::on_event(GdkEvent *event)
491 const int x(static_cast<int>(event->button.x));
492 const int y(static_cast<int>(event->button.y));
494 const int h(get_height());
495 const int w(get_width());
496 const int size=std::min(h-GRADIENT_HEIGHT,w);
500 case GDK_MOTION_NOTIFY:
502 case GDK_BUTTON_PRESS:
503 // if(event->button.button==1 && y>get_height()-CONTROL_HEIGHT)
505 case GDK_BUTTON_RELEASE:
506 if(event->button.button==1)
510 // Left click on gradient
511 App::dialog_gradient->set_gradient(synfigapp::Main::get_gradient());
512 App::dialog_gradient->reset();
513 App::dialog_gradient->signal_edited().connect(sigc::mem_fun(synfigapp::Main::set_gradient));
514 App::dialog_gradient->present();
519 if(x<size*3/4 && y<size*3/4)
521 // Left click on foreground
522 App::dialog_color->set_color(synfigapp::Main::get_foreground_color());
523 App::dialog_color->reset();
524 App::dialog_color->signal_edited().connect(sigc::mem_fun(synfigapp::Main::set_foreground_color));
525 App::dialog_color->present();
528 if(x>size*3/4 && y>size/4)
530 // Left click on background
531 App::dialog_color->set_color(synfigapp::Main::get_background_color());
532 App::dialog_color->reset();
533 App::dialog_color->signal_edited().connect(sigc::mem_fun(synfigapp::Main::set_background_color));
534 App::dialog_color->present();
538 if(x>size) // Left click on BLine Width
540 Distance dist(synfigapp::Main::get_bline_width());
542 if(y<size/2) // increase BLine size
544 dist+=DEFAULT_INCREMENT;
546 else // Decrease BLine size
548 dist-=DEFAULT_INCREMENT;
550 synfigapp::Main::set_bline_width(dist);
553 if(event->button.button==3)
557 // right click on gradient
558 synfigapp::Main::set_gradient_default_colors();
565 // right click on colors
566 synfigapp::Main::color_swap();
572 // right click on bline width
573 synfigapp::Main::set_bline_width(DEFAULT_WIDTH);
581 Distance dist(synfigapp::Main::get_bline_width());
583 if(event->scroll.direction==GDK_SCROLL_UP)
585 dist+=DEFAULT_INCREMENT;
587 else if(event->scroll.direction==GDK_SCROLL_DOWN)
589 dist-=DEFAULT_INCREMENT;
591 synfigapp::Main::set_bline_width(dist);