1 /* === S Y N F I G ========================================================= */
3 ** \brief Template File
5 ** $Id: main.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 ======================================================= */
34 #include <synfig/color.h>
35 #include <synfig/gradient.h>
37 #include <ETL/trivial>
43 /* === U S I N G =========================================================== */
47 using namespace synfig;
48 using namespace synfigapp;
50 /* === M A C R O S ========================================================= */
52 /* === S T A T I C S ======================================================= */
54 static etl::reference_counter synfigapp_ref_count_(0);
55 static synfigapp::Action::Main* action_main;
57 static Color foreground_;
58 static Color background_;
59 static Gradient gradient_;
60 static bool gradient_default_colors_;
62 static synfig::Distance bline_width_;
64 static Color::BlendMethod blend_method_;
67 static synfigapp::InputDevice::Handle selected_input_device_;
68 static list<synfigapp::InputDevice::Handle> input_devices_;
70 trivial<sigc::signal<void> > signal_foreground_color_changed_;
71 trivial<sigc::signal<void> > signal_background_color_changed_;
72 trivial<sigc::signal<void> > signal_gradient_changed_;
73 trivial<sigc::signal<void> > signal_bline_width_changed_;
74 trivial<sigc::signal<void> > signal_blend_method_changed_;
75 trivial<sigc::signal<void> > signal_opacity_changed_;
76 trivial<sigc::signal<void> > signal_interpolation_changed_;
78 trivial<Settings> settings_;
80 static synfig::Waypoint::Interpolation interpolation_;
82 /* === P R O C E D U R E S ================================================= */
84 /* === M E T H O D S ======================================================= */
86 synfigapp::Main::Main(const synfig::String &basepath,ProgressCallback *cb):
87 synfig::Main(basepath,cb),
88 ref_count_(synfigapp_ref_count_)
90 if(ref_count_.count())
93 synfigapp_ref_count_.reset();
94 ref_count_=synfigapp_ref_count_;
96 // Add initialization after this point
97 action_main=new synfigapp::Action::Main();
99 settings_.construct();
101 signal_foreground_color_changed_.construct();
102 signal_background_color_changed_.construct();
103 signal_gradient_changed_.construct();
104 signal_opacity_changed_.construct();
105 signal_blend_method_changed_.construct();
106 signal_interpolation_changed_.construct();
108 set_foreground_color(Color::black());
109 set_background_color(Color::white());
110 set_gradient_default_colors();
111 set_bline_width(Distance(1,Distance::SYSTEM_POINTS));
113 set_blend_method(Color::BLEND_COMPOSITE);
116 synfigapp::Main::~Main()
119 if(!synfigapp_ref_count_.unique())
121 synfigapp_ref_count_.detach();
123 // Add deinitialization after this point
127 selected_input_device_=0;
128 input_devices_.clear();
130 settings_.destruct();
131 signal_foreground_color_changed_.destruct();
132 signal_background_color_changed_.destruct();
133 signal_gradient_changed_.destruct();
135 signal_opacity_changed_.destruct();
136 signal_blend_method_changed_.destruct();
137 signal_interpolation_changed_.destruct();
141 synfigapp::Main::settings()
147 synfigapp::Main::signal_foreground_color_changed()
149 return signal_foreground_color_changed_;
153 synfigapp::Main::signal_background_color_changed()
155 return signal_background_color_changed_;
159 synfigapp::Main::signal_gradient_changed()
161 return signal_gradient_changed_;
165 synfigapp::Main::signal_bline_width_changed()
167 return signal_bline_width_changed_;
171 synfigapp::Main::signal_blend_method_changed()
173 return signal_blend_method_changed_;
177 synfigapp::Main::signal_opacity_changed()
179 return signal_opacity_changed_;
183 synfigapp::Main::signal_interpolation_changed()
185 return signal_interpolation_changed_;
189 synfigapp::Main::get_foreground_color()
195 synfigapp::Main::get_background_color()
200 const synfig::Gradient&
201 synfigapp::Main::get_gradient()
207 synfigapp::Main::get_opacity()
212 synfig::Color::BlendMethod
213 synfigapp::Main::get_blend_method()
215 return blend_method_;
219 synfigapp::Main::set_foreground_color(synfig::Color color)
222 signal_foreground_color_changed()();
223 if(selected_input_device_)
224 selected_input_device_->set_foreground_color(foreground_);
225 if(gradient_default_colors_)
227 gradient_=Gradient(foreground_,background_);
228 signal_gradient_changed()();
233 synfigapp::Main::set_background_color(synfig::Color color)
236 signal_background_color_changed()();
238 if(selected_input_device_)
239 selected_input_device_->set_background_color(background_);
241 if(gradient_default_colors_)
243 gradient_=Gradient(foreground_,background_);
244 signal_gradient_changed()();
249 synfigapp::Main::set_gradient(synfig::Gradient gradient)
252 gradient_default_colors_=false;
253 signal_gradient_changed()();
257 synfigapp::Main::set_gradient_default_colors()
259 gradient_default_colors_=true;
260 gradient_=Gradient(foreground_,background_);
261 signal_gradient_changed()();
265 synfigapp::Main::color_swap()
267 const Color tmp(foreground_);
268 foreground_=background_;
271 if(selected_input_device_)
273 selected_input_device_->set_foreground_color(foreground_);
274 selected_input_device_->set_background_color(background_);
277 signal_foreground_color_changed()();
278 signal_background_color_changed()();
280 if(gradient_default_colors_)
282 gradient_=Gradient(foreground_,background_);
283 signal_gradient_changed()();
287 synfig::Waypoint::Interpolation
288 synfigapp::Main::get_interpolation()
290 return interpolation_;
295 synfigapp::Main::set_interpolation(synfig::Waypoint::Interpolation x)
297 if(interpolation_!=x)
301 signal_interpolation_changed();
305 const synfig::Distance&
306 synfigapp::Main::get_bline_width()
312 synfigapp::Main::set_bline_width(synfig::Distance x)
319 if(selected_input_device_)
320 selected_input_device_->set_bline_width(x);
322 signal_bline_width_changed()();
327 synfigapp::Main::set_opacity(synfig::Real x)
330 if(selected_input_device_)
331 selected_input_device_->set_opacity(opacity_);
332 signal_opacity_changed()();
336 synfigapp::Main::set_blend_method(synfig::Color::BlendMethod x)
339 if(selected_input_device_)
340 selected_input_device_->set_blend_method(x);
341 signal_blend_method_changed()();
346 synfigapp::Main::add_input_device(const synfig::String id, InputDevice::Type type)
348 input_devices_.push_back(new InputDevice(id,type));
349 return input_devices_.back();
353 synfigapp::Main::find_input_device(const synfig::String id)
355 list<InputDevice::Handle>::iterator iter;
356 for(iter=input_devices_.begin();iter!=input_devices_.end();++iter)
357 if((*iter)->get_id()==id)
363 synfigapp::Main::select_input_device(const synfig::String id)
365 InputDevice::Handle input_device(find_input_device(id));
368 if(!select_input_device(input_device))
374 synfigapp::Main::select_input_device(InputDevice::Handle input_device)
376 assert(input_device);
378 synfig::info("Input device changed to \"%s\"",input_device->get_id().c_str());
380 selected_input_device_=input_device;
382 set_bline_width(input_device->get_bline_width());
383 set_foreground_color(input_device->get_foreground_color());
384 set_opacity(input_device->get_opacity());
385 set_blend_method(input_device->get_blend_method());
391 synfigapp::Main::get_selected_input_device()
393 return selected_input_device_;
397 synfigapp::Main::set_state(synfig::String state)
399 if(selected_input_device_)
400 selected_input_device_->set_state(state);