Fix most of the warnings from doxygen for synfig-studio sources.
[synfig.git] / synfig-studio / trunk / src / synfigapp / main.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file synfigapp/main.cpp
3 **      \brief Template File
4 **
5 **      $Id$
6 **
7 **      \legal
8 **      Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 **
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.
14 **
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.
19 **      \endlegal
20 */
21 /* ========================================================================= */
22
23 /* === H E A D E R S ======================================================= */
24
25 #ifdef USING_PCH
26 #       include "pch.h"
27 #else
28 #ifdef HAVE_CONFIG_H
29 #       include <config.h>
30 #endif
31
32 #include "main.h"
33 #include "action.h"
34
35 #include <synfig/color.h>
36 #include <synfig/gradient.h>
37
38 #include <ETL/trivial>
39
40 #include <list>
41
42 #include "general.h"
43
44 #endif
45
46 /* === U S I N G =========================================================== */
47
48 using namespace std;
49 using namespace etl;
50 using namespace synfig;
51 using namespace synfigapp;
52
53 /* === M A C R O S ========================================================= */
54
55 /* === S T A T I C S ======================================================= */
56
57 static etl::reference_counter synfigapp_ref_count_(0);
58 static synfigapp::Action::Main* action_main;
59
60 static Color foreground_;
61 static Color background_;
62 static Gradient gradient_;
63 static bool gradient_default_colors_;
64
65 static synfig::Distance bline_width_;
66
67 static Color::BlendMethod blend_method_;
68 static Real opacity_;
69
70 static synfigapp::InputDevice::Handle selected_input_device_;
71 static list<synfigapp::InputDevice::Handle> input_devices_;
72
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_;
80
81 trivial<Settings> settings_;
82
83 static synfig::Waypoint::Interpolation interpolation_;
84
85 /* === P R O C E D U R E S ================================================= */
86
87 /* === M E T H O D S ======================================================= */
88
89 synfigapp::Main::Main(const synfig::String &basepath, synfig::ProgressCallback *cb):
90         synfig::Main(basepath,cb),
91         ref_count_(synfigapp_ref_count_)
92 {
93         if(ref_count_.count())
94                 return;
95
96         synfigapp_ref_count_.reset();
97         ref_count_=synfigapp_ref_count_;
98
99         // Add initialization after this point
100
101         bindtextdomain("synfigstudio", LOCALEDIR);
102
103         action_main=new synfigapp::Action::Main();
104
105         settings_.construct();
106
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();
113
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));
118         set_opacity(1.0);
119         set_blend_method(Color::BLEND_COMPOSITE);
120 }
121
122 synfigapp::Main::~Main()
123 {
124         ref_count_.detach();
125         if(!synfigapp_ref_count_.unique())
126                 return;
127         synfigapp_ref_count_.detach();
128
129         // Add deinitialization after this point
130
131         delete action_main;
132
133         selected_input_device_=0;
134         input_devices_.clear();
135
136         settings_.destruct();
137         signal_foreground_color_changed_.destruct();
138         signal_background_color_changed_.destruct();
139         signal_gradient_changed_.destruct();
140
141         signal_opacity_changed_.destruct();
142         signal_blend_method_changed_.destruct();
143         signal_interpolation_changed_.destruct();
144 }
145
146 Settings&
147 synfigapp::Main::settings()
148 {
149         return settings_;
150 }
151
152 sigc::signal<void>&
153 synfigapp::Main::signal_foreground_color_changed()
154 {
155         return signal_foreground_color_changed_;
156 }
157
158 sigc::signal<void>&
159 synfigapp::Main::signal_background_color_changed()
160 {
161         return signal_background_color_changed_;
162 }
163
164 sigc::signal<void>&
165 synfigapp::Main::signal_gradient_changed()
166 {
167         return signal_gradient_changed_;
168 }
169
170 sigc::signal<void>&
171 synfigapp::Main::signal_bline_width_changed()
172 {
173         return signal_bline_width_changed_;
174 }
175
176 sigc::signal<void>&
177 synfigapp::Main::signal_blend_method_changed()
178 {
179         return signal_blend_method_changed_;
180 }
181
182 sigc::signal<void>&
183 synfigapp::Main::signal_opacity_changed()
184 {
185         return signal_opacity_changed_;
186 }
187
188 sigc::signal<void>&
189 synfigapp::Main::signal_interpolation_changed()
190 {
191         return signal_interpolation_changed_;
192 }
193
194 const synfig::Color&
195 synfigapp::Main::get_foreground_color()
196 {
197         return foreground_;
198 }
199
200 const synfig::Color&
201 synfigapp::Main::get_background_color()
202 {
203         return background_;
204 }
205
206 const synfig::Gradient&
207 synfigapp::Main::get_gradient()
208 {
209         return gradient_;
210 }
211
212 const synfig::Real&
213 synfigapp::Main::get_opacity()
214 {
215         return opacity_;
216 }
217
218 synfig::Color::BlendMethod
219 synfigapp::Main::get_blend_method()
220 {
221         return blend_method_;
222 }
223
224 void
225 synfigapp::Main::set_foreground_color(synfig::Color color)
226 {
227         foreground_=color;
228         signal_foreground_color_changed()();
229         if(selected_input_device_)
230                 selected_input_device_->set_foreground_color(foreground_);
231         if(gradient_default_colors_)
232         {
233                 gradient_=Gradient(foreground_,background_);
234                 signal_gradient_changed()();
235         }
236 }
237
238 void
239 synfigapp::Main::set_background_color(synfig::Color color)
240 {
241         background_=color;
242         signal_background_color_changed()();
243
244         if(selected_input_device_)
245                 selected_input_device_->set_background_color(background_);
246
247         if(gradient_default_colors_)
248         {
249                 gradient_=Gradient(foreground_,background_);
250                 signal_gradient_changed()();
251         }
252 }
253
254 void
255 synfigapp::Main::set_gradient(synfig::Gradient gradient)
256 {
257         gradient_=gradient;
258         gradient_default_colors_=false;
259         signal_gradient_changed()();
260 }
261
262 void
263 synfigapp::Main::set_gradient_default_colors()
264 {
265         gradient_default_colors_=true;
266         gradient_=Gradient(foreground_,background_);
267         signal_gradient_changed()();
268 }
269
270 void
271 synfigapp::Main::color_swap()
272 {
273         const Color tmp(foreground_);
274         foreground_=background_;
275         background_=tmp;
276
277         if(selected_input_device_)
278         {
279                 selected_input_device_->set_foreground_color(foreground_);
280                 selected_input_device_->set_background_color(background_);
281         }
282
283         signal_foreground_color_changed()();
284         signal_background_color_changed()();
285
286         if(gradient_default_colors_)
287         {
288                 gradient_=Gradient(foreground_,background_);
289                 signal_gradient_changed()();
290         }
291 }
292
293 synfig::Waypoint::Interpolation
294 synfigapp::Main::get_interpolation()
295 {
296         return interpolation_;
297 }
298
299
300 void
301 synfigapp::Main::set_interpolation(synfig::Waypoint::Interpolation x)
302 {
303         if(interpolation_!=x)
304         {
305                 interpolation_=x;
306
307                 signal_interpolation_changed();
308         }
309 }
310
311 const synfig::Distance&
312 synfigapp::Main::get_bline_width()
313 {
314         return bline_width_;
315 }
316
317 void
318 synfigapp::Main::set_bline_width(synfig::Distance x)
319 {
320         if(x<0)x=0;
321         if(x!=bline_width_)
322         {
323                 bline_width_=x;
324
325                 if(selected_input_device_)
326                         selected_input_device_->set_bline_width(x);
327
328                 signal_bline_width_changed()();
329         }
330 }
331
332 void
333 synfigapp::Main::set_opacity(synfig::Real x)
334 {
335         opacity_=x;
336         if(selected_input_device_)
337                 selected_input_device_->set_opacity(opacity_);
338         signal_opacity_changed()();
339 }
340
341 void
342 synfigapp::Main::set_blend_method(synfig::Color::BlendMethod x)
343 {
344         blend_method_=x;
345         if(selected_input_device_)
346                 selected_input_device_->set_blend_method(x);
347         signal_blend_method_changed()();
348 }
349
350
351 InputDevice::Handle
352 synfigapp::Main::add_input_device(const synfig::String id, InputDevice::Type type)
353 {
354         input_devices_.push_back(new InputDevice(id,type));
355         return input_devices_.back();
356 }
357
358 InputDevice::Handle
359 synfigapp::Main::find_input_device(const synfig::String id)
360 {
361         list<InputDevice::Handle>::iterator iter;
362         for(iter=input_devices_.begin();iter!=input_devices_.end();++iter)
363                 if((*iter)->get_id()==id)
364                         return *iter;
365         return 0;
366 }
367
368 InputDevice::Handle
369 synfigapp::Main::select_input_device(const synfig::String id)
370 {
371         InputDevice::Handle input_device(find_input_device(id));
372         if(!input_device)
373                 return 0;
374         if(!select_input_device(input_device))
375                 return 0;
376         return input_device;
377 }
378
379 bool
380 synfigapp::Main::select_input_device(InputDevice::Handle input_device)
381 {
382         assert(input_device);
383
384         // synfig::info("Input device changed to \"%s\"",input_device->get_id().c_str());
385
386         selected_input_device_=input_device;
387
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());
392
393         return true;
394 }
395
396 InputDevice::Handle
397 synfigapp::Main::get_selected_input_device()
398 {
399         return selected_input_device_;
400 }
401
402 void
403 synfigapp::Main::set_state(synfig::String state)
404 {
405         if(selected_input_device_)
406                 selected_input_device_->set_state(state);
407 }