1 /* === S Y N F I G ========================================================= */
2 /*! \file synfigapp/main.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 ======================================================= */
35 #include <synfig/color.h>
36 #include <synfig/gradient.h>
38 #include <ETL/trivial>
46 /* === U S I N G =========================================================== */
50 using namespace synfig;
51 using namespace synfigapp;
53 /* === M A C R O S ========================================================= */
55 /* === S T A T I C S ======================================================= */
57 static etl::reference_counter synfigapp_ref_count_(0);
58 static synfigapp::Action::Main* action_main;
60 static Color foreground_;
61 static Color background_;
62 static Gradient gradient_;
63 static bool gradient_default_colors_;
65 static synfig::Distance bline_width_;
67 static Color::BlendMethod blend_method_;
70 static synfigapp::InputDevice::Handle selected_input_device_;
71 static list<synfigapp::InputDevice::Handle> input_devices_;
73 trivial<sigc::signal<void> > signal_foreground_color_changed_;
74 trivial<sigc::signal<void> > signal_background_color_changed_;
75 trivial<sigc::signal<void> > signal_gradient_changed_;
76 trivial<sigc::signal<void> > signal_bline_width_changed_;
77 trivial<sigc::signal<void> > signal_blend_method_changed_;
78 trivial<sigc::signal<void> > signal_opacity_changed_;
79 trivial<sigc::signal<void> > signal_interpolation_changed_;
81 trivial<Settings> settings_;
83 static synfig::Waypoint::Interpolation interpolation_;
85 /* === P R O C E D U R E S ================================================= */
87 /* === M E T H O D S ======================================================= */
89 synfigapp::Main::Main(const synfig::String &basepath, synfig::ProgressCallback *cb):
90 synfig::Main(basepath,cb),
91 ref_count_(synfigapp_ref_count_)
93 if(ref_count_.count())
96 synfigapp_ref_count_.reset();
97 ref_count_=synfigapp_ref_count_;
99 // Add initialization after this point
101 bindtextdomain("synfigstudio", LOCALEDIR);
103 action_main=new synfigapp::Action::Main();
105 settings_.construct();
107 signal_foreground_color_changed_.construct();
108 signal_background_color_changed_.construct();
109 signal_gradient_changed_.construct();
110 signal_opacity_changed_.construct();
111 signal_blend_method_changed_.construct();
112 signal_interpolation_changed_.construct();
114 set_foreground_color(Color::black());
115 set_background_color(Color::white());
116 set_gradient_default_colors();
117 set_bline_width(Distance(1,Distance::SYSTEM_POINTS));
119 set_blend_method(Color::BLEND_COMPOSITE);
122 synfigapp::Main::~Main()
125 if(!synfigapp_ref_count_.unique())
127 synfigapp_ref_count_.detach();
129 // Add deinitialization after this point
133 selected_input_device_=0;
134 input_devices_.clear();
136 settings_.destruct();
137 signal_foreground_color_changed_.destruct();
138 signal_background_color_changed_.destruct();
139 signal_gradient_changed_.destruct();
141 signal_opacity_changed_.destruct();
142 signal_blend_method_changed_.destruct();
143 signal_interpolation_changed_.destruct();
147 synfigapp::Main::settings()
153 synfigapp::Main::signal_foreground_color_changed()
155 return signal_foreground_color_changed_;
159 synfigapp::Main::signal_background_color_changed()
161 return signal_background_color_changed_;
165 synfigapp::Main::signal_gradient_changed()
167 return signal_gradient_changed_;
171 synfigapp::Main::signal_bline_width_changed()
173 return signal_bline_width_changed_;
177 synfigapp::Main::signal_blend_method_changed()
179 return signal_blend_method_changed_;
183 synfigapp::Main::signal_opacity_changed()
185 return signal_opacity_changed_;
189 synfigapp::Main::signal_interpolation_changed()
191 return signal_interpolation_changed_;
195 synfigapp::Main::get_foreground_color()
201 synfigapp::Main::get_background_color()
206 const synfig::Gradient&
207 synfigapp::Main::get_gradient()
213 synfigapp::Main::get_opacity()
218 synfig::Color::BlendMethod
219 synfigapp::Main::get_blend_method()
221 return blend_method_;
225 synfigapp::Main::set_foreground_color(synfig::Color color)
228 signal_foreground_color_changed()();
229 if(selected_input_device_)
230 selected_input_device_->set_foreground_color(foreground_);
231 if(gradient_default_colors_)
233 gradient_=Gradient(foreground_,background_);
234 signal_gradient_changed()();
239 synfigapp::Main::set_background_color(synfig::Color color)
242 signal_background_color_changed()();
244 if(selected_input_device_)
245 selected_input_device_->set_background_color(background_);
247 if(gradient_default_colors_)
249 gradient_=Gradient(foreground_,background_);
250 signal_gradient_changed()();
255 synfigapp::Main::set_gradient(synfig::Gradient gradient)
258 gradient_default_colors_=false;
259 signal_gradient_changed()();
263 synfigapp::Main::set_gradient_default_colors()
265 gradient_default_colors_=true;
266 gradient_=Gradient(foreground_,background_);
267 signal_gradient_changed()();
271 synfigapp::Main::color_swap()
273 const Color tmp(foreground_);
274 foreground_=background_;
277 if(selected_input_device_)
279 selected_input_device_->set_foreground_color(foreground_);
280 selected_input_device_->set_background_color(background_);
283 signal_foreground_color_changed()();
284 signal_background_color_changed()();
286 if(gradient_default_colors_)
288 gradient_=Gradient(foreground_,background_);
289 signal_gradient_changed()();
293 synfig::Waypoint::Interpolation
294 synfigapp::Main::get_interpolation()
296 return interpolation_;
301 synfigapp::Main::set_interpolation(synfig::Waypoint::Interpolation x)
303 if(interpolation_!=x)
307 signal_interpolation_changed();
311 const synfig::Distance&
312 synfigapp::Main::get_bline_width()
318 synfigapp::Main::set_bline_width(synfig::Distance x)
325 if(selected_input_device_)
326 selected_input_device_->set_bline_width(x);
328 signal_bline_width_changed()();
333 synfigapp::Main::set_opacity(synfig::Real x)
336 if(selected_input_device_)
337 selected_input_device_->set_opacity(opacity_);
338 signal_opacity_changed()();
342 synfigapp::Main::set_blend_method(synfig::Color::BlendMethod x)
345 if(selected_input_device_)
346 selected_input_device_->set_blend_method(x);
347 signal_blend_method_changed()();
352 synfigapp::Main::add_input_device(const synfig::String id, InputDevice::Type type)
354 input_devices_.push_back(new InputDevice(id,type));
355 return input_devices_.back();
359 synfigapp::Main::find_input_device(const synfig::String id)
361 list<InputDevice::Handle>::iterator iter;
362 for(iter=input_devices_.begin();iter!=input_devices_.end();++iter)
363 if((*iter)->get_id()==id)
369 synfigapp::Main::select_input_device(const synfig::String id)
371 InputDevice::Handle input_device(find_input_device(id));
374 if(!select_input_device(input_device))
380 synfigapp::Main::select_input_device(InputDevice::Handle input_device)
382 assert(input_device);
384 // synfig::info("Input device changed to \"%s\"",input_device->get_id().c_str());
386 selected_input_device_=input_device;
388 set_bline_width(input_device->get_bline_width());
389 set_foreground_color(input_device->get_foreground_color());
390 set_opacity(input_device->get_opacity());
391 set_blend_method(input_device->get_blend_method());
397 synfigapp::Main::get_selected_input_device()
399 return selected_input_device_;
403 synfigapp::Main::set_state(synfig::String state)
405 if(selected_input_device_)
406 selected_input_device_->set_state(state);