my log
[synfig.git] / synfig-studio / trunk / src / synfigapp / canvasinterface.h
1 /* === S Y N F I G ========================================================= */
2 /*!     \file canvasinterface.h
3 **      \brief Template Header
4 **
5 **      $Id: canvasinterface.h,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 /* === S T A R T =========================================================== */
23
24 #ifndef __SYNFIG_APP_CANVASINTERFACE_H
25 #define __SYNFIG_APP_CANVASINTERFACE_H
26
27 /* === H E A D E R S ======================================================= */
28
29 //#include <synfig/canvas.h>
30 #include <synfig/value.h>
31 #include <sigc++/signal.h>
32 #include <sigc++/object.h>
33 #include <list>
34 #include "selectionmanager.h"
35 #include "uimanager.h"
36 #include "value_desc.h"
37 #include "editmode.h"
38
39 /* === M A C R O S ========================================================= */
40
41 /* === T Y P E D E F S ===================================================== */
42
43 /* === C L A S S E S & S T R U C T S ======================================= */
44
45 namespace synfig { class ValueNode_DynamicList; class Waypoint; class GUIDSet; class Canvas; };
46
47 namespace synfigapp {
48
49 namespace Action { class ParamList; class Param; class EditModeSet; }; 
50
51 class Instance;
52 class ValueDesc;
53         
54 class CanvasInterface : public etl::shared_object, public sigc::trackable
55 {
56         friend class Instance;
57         friend class Action::EditModeSet;
58                 
59 public:
60
61         typedef EditMode Mode;
62
63 private:
64         // Constructor is private to force the use of the "create()" constructor.
65         CanvasInterface(etl::loose_handle<Instance> instance,etl::handle<synfig::Canvas> canvas);
66
67 private:
68         etl::loose_handle<Instance> instance_;
69         etl::handle<synfig::Canvas> canvas_;
70         etl::handle<SelectionManager> selection_manager_;
71         etl::handle<UIInterface> ui_interface_;
72         synfig::Time cur_time_;
73         Mode mode_;
74
75         sigc::signal<void,synfig::Layer::Handle> signal_layer_raised_;
76         sigc::signal<void,synfig::Layer::Handle> signal_layer_lowered_;
77         sigc::signal<void,synfig::Layer::Handle,int> signal_layer_inserted_;
78         sigc::signal<void,synfig::Layer::Handle,int,synfig::Canvas::Handle> signal_layer_moved_;
79         sigc::signal<void,synfig::Layer::Handle> signal_layer_removed_;
80         sigc::signal<void,synfig::Layer::Handle,bool> signal_layer_status_changed_;
81         sigc::signal<void,synfig::Layer::Handle,synfig::String> signal_layer_new_description_;
82         sigc::signal<void,synfig::Canvas::Handle> signal_canvas_added_;
83         sigc::signal<void,synfig::Canvas::Handle> signal_canvas_removed_;
84         
85         sigc::signal<void,synfig::ValueNode::Handle> signal_value_node_added_;
86         sigc::signal<void,synfig::ValueNode::Handle> signal_value_node_deleted_;
87         sigc::signal<void,synfig::ValueNode::Handle> signal_value_node_changed_;
88         sigc::signal<void,synfig::ValueNode::Handle,synfig::ValueNode::Handle> signal_value_node_replaced_;
89
90         sigc::signal<void,synfig::Keyframe> signal_keyframe_added_;
91         sigc::signal<void,synfig::Keyframe> signal_keyframe_removed_;
92         sigc::signal<void,synfig::Keyframe> signal_keyframe_changed_;
93
94         sigc::signal<void> signal_id_changed_;
95
96         sigc::signal<void> signal_time_changed_;
97
98         sigc::signal<void> signal_rend_desc_changed_;
99
100         sigc::signal<void,Mode> signal_mode_changed_;
101
102         //sigc::signal<void> signal_dirty_preview_;
103
104         sigc::signal<void,synfig::Layer::Handle,synfig::String> signal_layer_param_changed_;
105
106 public: // Signal Interface
107
108         sigc::signal<void,synfig::Layer::Handle,int,synfig::Canvas::Handle>& signal_layer_moved() { return signal_layer_moved_; }
109
110         sigc::signal<void,synfig::Layer::Handle,synfig::String>& signal_layer_new_description() { return signal_layer_new_description_; }
111
112         //! Signal called when layer is raised.
113         sigc::signal<void,synfig::Layer::Handle>& signal_layer_raised() { return signal_layer_raised_; }
114         
115         //! Signal called when layer is lowered.
116         sigc::signal<void,synfig::Layer::Handle>& signal_layer_lowered() { return signal_layer_lowered_; }
117         
118         //! Signal called when layer has been inserted at a given position.
119         sigc::signal<void,synfig::Layer::Handle,int>& signal_layer_inserted() { return signal_layer_inserted_; }
120
121         //! Signal called when a layer has been removed from the canvas.
122         sigc::signal<void,synfig::Layer::Handle>& signal_layer_removed() { return signal_layer_removed_; }
123
124         //! Signal called when the layer's active status has changed.
125         sigc::signal<void,synfig::Layer::Handle,bool>& signal_layer_status_changed() { return signal_layer_status_changed_; }
126
127         //! Signal called when a canvas has been added.
128         sigc::signal<void,etl::handle<synfig::Canvas> >& signal_canvas_added() { return signal_canvas_added_; }
129
130         //! Signal called when a canvas has been removed.
131         sigc::signal<void,etl::handle<synfig::Canvas> >& signal_canvas_removed() { return signal_canvas_removed_; }
132
133         //! Signal called when a layer's parameter has been changed
134         sigc::signal<void,synfig::Layer::Handle,synfig::String>& signal_layer_param_changed() { return signal_layer_param_changed_; }
135
136         //! Signal called when the canvas's preview needs to be updated
137         //sigc::signal<void>& signal_dirty_preview() { return signal_dirty_preview_; }
138         sigc::signal<void>& signal_dirty_preview() { return get_canvas()->signal_dirty(); }
139
140         sigc::signal<void,etl::handle<synfig::ValueNode>,etl::handle<synfig::ValueNode> >&
141                 signal_value_node_child_added() { return get_canvas()->signal_value_node_child_added(); }
142         sigc::signal<void,etl::handle<synfig::ValueNode>,etl::handle<synfig::ValueNode> >&
143                 signal_value_node_child_removed() { return get_canvas()->signal_value_node_child_removed(); }
144
145         //! Signal called when a ValueNode has changed
146         sigc::signal<void,etl::handle<synfig::ValueNode> >& signal_value_node_added() { return signal_value_node_added_; }
147
148         //! Signal called when a ValueNode has been deleted
149         sigc::signal<void,etl::handle<synfig::ValueNode> >& signal_value_node_deleted() { return signal_value_node_deleted_; }
150
151         //! Signal called when a ValueNode has been changed
152         sigc::signal<void,etl::handle<synfig::ValueNode> >& signal_value_node_changed() { return get_canvas()->signal_value_node_changed(); }
153         //sigc::signal<void,etl::handle<synfig::ValueNode> >& signal_value_node_changed() { return signal_value_node_changed_; }
154
155         //! Signal called when the mode has changed
156         sigc::signal<void,Mode> signal_mode_changed() { return signal_mode_changed_; }
157
158         //! Signal called when a the ID has been changed
159         sigc::signal<void>& signal_id_changed() { return signal_id_changed_; }
160
161         //! Signal called whenever the time changes
162         sigc::signal<void> signal_time_changed() { return signal_time_changed_; }
163
164         //! Signal called whenever a data node has been replaced.
165         /*!     Second ValueNode replaces first */
166         sigc::signal<void,synfig::ValueNode::Handle,synfig::ValueNode::Handle>& signal_value_node_replaced()
167                 { return signal_value_node_replaced_; }
168
169         //! Signal called whenever the RendDesc changes
170         sigc::signal<void>& signal_rend_desc_changed() { return signal_rend_desc_changed_; }
171
172         sigc::signal<void,synfig::Keyframe>& signal_keyframe_added() { return signal_keyframe_added_; }
173
174         sigc::signal<void,synfig::Keyframe>& signal_keyframe_removed() { return signal_keyframe_removed_; }
175
176         sigc::signal<void,synfig::Keyframe>& signal_keyframe_changed() { return signal_keyframe_changed_; }
177
178 public:
179
180         void auto_export(const ValueDesc& value_desc);
181
182         void auto_export(synfig::ValueNode::Handle value_node);
183
184         void set_meta_data(const synfig::String& key,const synfig::String& data);
185
186         //! Changes the current SelectionManager object
187         void set_selection_manager(const etl::handle<SelectionManager> &sm) { selection_manager_=sm; }
188         
189         //! Disables the selection manager
190         void unset_selection_manager() { selection_manager_=new NullSelectionManager(); }
191         
192         //! Returns a handle to the current SelectionManager
193         const etl::handle<SelectionManager> &get_selection_manager()const { return selection_manager_; }        
194
195         //! Changes the current UIInterface object
196         void set_ui_interface(const etl::handle<UIInterface> &uim) { ui_interface_=uim; }
197
198         //! Disables the UIInterface
199         void unset_ui_interface() { ui_interface_=new DefaultUIInterface(); }
200         
201         //! Returns a handle to the current UIInterface
202         const etl::handle<UIInterface> &get_ui_interface() { return ui_interface_; }    
203
204         //! Returns the Canvas associated with this interface
205         etl::handle<synfig::Canvas> get_canvas()const { return canvas_; }
206
207         //! Returns the Instance associated with this interface
208         etl::loose_handle<Instance> get_instance()const { return instance_; }
209
210         //! Changes the name of the canvas. Undoable.
211         bool set_name(const synfig::String &x);
212
213         //! Changes the description of the canvas. Undoable.
214         bool set_description(const synfig::String &x);
215
216         //! Changes the ID of the canvas. Undoable.
217         bool set_id(const synfig::String &x);
218         
219         //! Convience function to retrieve the name of the canvas
220         synfig::String get_name()const { return get_canvas()->get_name(); }
221
222         //! Convience function to retrieve the description of the canvas
223         synfig::String get_description()const { return get_canvas()->get_description(); }
224
225         //! Convience function to retrieve the ID of the canvas
226         synfig::String get_id()const { return get_canvas()->get_id(); }
227
228         //! Sets the current time
229         void set_time(synfig::Time x);
230         
231         //! Retrieves the current time
232         synfig::Time get_time()const;
233         
234         //! Changes the current time to the next keyframe
235         void jump_to_next_keyframe();
236
237         //! Changes the current time to the next keyframe
238         void jump_to_prev_keyframe();
239         
240         void seek_frame(int frames);
241
242         void seek_time(synfig::Time time);
243         
244         //! \writeme
245         void refresh_current_values();
246         
247         //! Sets the current editing mode
248         /*! \see Mode */
249         void set_mode(Mode x);
250
251         //! Retrieves the current editing mode
252         /*! \see Mode */
253         Mode get_mode()const;
254
255         //! Creates a new layer, of type \c id at the top of the layer stack
256         synfig::Layer::Handle add_layer(synfig::String id) { return add_layer_to(id,get_canvas()); }
257
258         synfig::Layer::Handle add_layer_to(synfig::String id,synfig::Canvas::Handle canvas, int depth=0);
259
260         bool convert(ValueDesc value_desc, synfig::String type);
261         //! Adds the given ValueNode to the canvas.
262         bool add_value_node(synfig::ValueNode::Handle value_node, synfig::String name);
263
264
265         Action::ParamList generate_param_list(const synfigapp::ValueDesc &);
266
267         Action::ParamList generate_param_list(const std::list<synfigapp::ValueDesc> &);
268
269         void set_rend_desc(const synfig::RendDesc &rend_desc);
270
271         bool import(const synfig::String &filename, bool copy=false);
272         
273         
274         void waypoint_duplicate(synfigapp::ValueDesc value_desc,synfig::Waypoint waypoint);
275
276         void waypoint_remove(synfigapp::ValueDesc value_desc,synfig::Waypoint waypoint);
277
278         bool change_value(synfigapp::ValueDesc value_desc,synfig::ValueBase new_value);
279
280
281         int find_important_value_descs(std::vector<synfigapp::ValueDesc>& out);
282         static int find_important_value_descs(synfig::Canvas::Handle canvas,std::vector<synfigapp::ValueDesc>& out,synfig::GUIDSet& guid_set);
283
284         ~CanvasInterface();
285
286         static etl::handle<CanvasInterface> create(etl::loose_handle<Instance> instance,etl::handle<synfig::Canvas> canvas);
287 }; // END of class CanvasInterface
288
289 /*!     \class PushMode
290 **      \brief Class that changes the mode of a CanvasInterface, and restores it on destruction.
291 */
292 class PushMode
293 {
294         CanvasInterface* canvas_interface_;
295         CanvasInterface::Mode old_mode_;
296 public:
297         PushMode(etl::loose_handle<CanvasInterface> c, CanvasInterface::Mode mode):
298                 canvas_interface_(c.get()), old_mode_(canvas_interface_->get_mode())
299         { canvas_interface_->set_mode(mode); }
300         
301         ~PushMode() { canvas_interface_->set_mode(old_mode_); }
302 }; // END of class PushMode
303
304 }; // END of namespace studio
305
306 /* === E N D =============================================================== */
307
308 #endif