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