00001
00021
00022
00023
00024
00025 #ifndef __SYNFIG_CANVAS_H
00026 #define __SYNFIG_CANVAS_H
00027
00028
00029
00030 #include <map>
00031 #include <list>
00032 #include <ETL/handle>
00033 #include <sigc++/signal.h>
00034
00035 #include "vector.h"
00036 #include "string.h"
00037 #include "canvasbase.h"
00038 #include "valuenode.h"
00039 #include "keyframe.h"
00040 #include "renddesc.h"
00041 #include "node.h"
00042 #include "guid.h"
00043
00044
00045
00046
00047
00048
00049
00050 namespace synfig {
00051
00052 class Context;
00053 class GUID;
00054
00058 class Canvas : public CanvasBase, public Node
00059 {
00060
00061
00062
00063
00064 public:
00065 typedef etl::handle<Canvas> Handle;
00066 typedef etl::loose_handle<Canvas> LooseHandle;
00067 typedef etl::handle<const Canvas> ConstHandle;
00068
00069 typedef std::list<Handle> Children;
00070
00071 friend void synfig::optimize_layers(Context, Canvas::Handle);
00072
00073
00074
00075
00076
00077 private:
00078
00080
00081 String id_;
00082
00084
00085 String name_;
00086
00088
00089 String description_;
00090
00092
00093 String author_;
00094
00096
00097 String email_;
00098
00100
00101 String file_name_;
00102
00104
00105 std::map<String, String> meta_data_;
00106
00108
00109 ValueNodeList value_node_list_;
00110
00112 KeyframeList keyframe_list_;
00113
00115
00118 LooseHandle parent_;
00119
00121
00122 Children children_;
00123
00125
00126 RendDesc desc_;
00127
00129 Time cur_time_;
00130
00132 mutable std::map<String,Handle> externals_;
00133
00135 bool is_inline_;
00136
00137 mutable bool is_dirty_;
00138
00139 bool op_flag_;
00140
00142 std::map<String,std::set<etl::handle<Layer> > > group_db_;
00143
00144
00145
00146
00147
00148 private:
00149
00151 sigc::signal<void,String> signal_group_added_;
00152
00154 sigc::signal<void,String> signal_group_removed_;
00155
00157 sigc::signal<void,String> signal_group_changed_;
00158
00159 sigc::signal<void,String,etl::handle<synfig::Layer> > signal_group_pair_added_;
00160 sigc::signal<void,String,etl::handle<synfig::Layer> > signal_group_pair_removed_;
00161
00163 sigc::signal<void,int*> signal_layers_reordered_;
00164
00166 sigc::signal<void> signal_rend_desc_changed_;
00167
00169 sigc::signal<void> signal_id_changed_;
00170
00172
00173
00175 sigc::signal<void> signal_file_name_changed_;
00176
00178 sigc::signal<void, String> signal_meta_data_changed_;
00179
00181 std::map<String, sigc::signal<void> > signal_map_meta_data_changed_;
00182
00183
00185 sigc::signal<void, etl::handle<ValueNode> > signal_value_node_changed_;
00186
00187 sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> > signal_value_node_child_added_;
00188
00189 sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> > signal_value_node_child_removed_;
00190
00191
00192
00193
00194
00195 public:
00196
00197 sigc::signal<void,String,etl::handle<synfig::Layer> >& signal_group_pair_added() { return signal_group_pair_added_; }
00198 sigc::signal<void,String,etl::handle<synfig::Layer> >& signal_group_pair_removed() { return signal_group_pair_removed_; }
00199
00201 sigc::signal<void,String>& signal_group_added() { return signal_group_added_; }
00202
00204 sigc::signal<void,String>& signal_group_removed() { return signal_group_removed_; }
00205
00207 sigc::signal<void,String>& signal_group_changed() { return signal_group_changed_; }
00208
00210 sigc::signal<void,int*>& signal_layers_reordered() { return signal_layers_reordered_; }
00211
00213 sigc::signal<void>& signal_rend_desc_changed() { return signal_rend_desc_changed_; }
00214
00216 sigc::signal<void>& signal_id_changed() { return signal_id_changed_; }
00217
00219 sigc::signal<void>& signal_file_name_changed();
00220
00222 sigc::signal<void, String>& signal_meta_data_changed() { return signal_meta_data_changed_; }
00223
00225 sigc::signal<void>& signal_meta_data_changed(const String& key) { return signal_map_meta_data_changed_[key]; }
00226
00227
00228 sigc::signal<void, etl::handle<ValueNode> >& signal_value_node_changed() { return signal_value_node_changed_; }
00229
00231 sigc::signal<void>& signal_dirty() { return signal_changed(); }
00232
00234 sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> >& signal_value_node_child_added() { return signal_value_node_child_added_; }
00235
00237 sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> >& signal_value_node_child_removed() { return signal_value_node_child_removed_; }
00238
00239
00240
00241
00242
00243 protected:
00244
00245 Canvas(const String &name);
00246
00247 public:
00248
00249 ~Canvas();
00250
00251
00252
00253
00254
00255 public:
00256
00258 std::set<etl::handle<Layer> > get_layers_in_group(const String&group);
00259
00261 std::set<String> get_groups()const;
00262
00264 int get_group_count()const;
00265
00267 void rename_group(const String&old_name,const String&new_name);
00268
00270 bool is_inline()const { return is_inline_; }
00271
00273 RendDesc &rend_desc() { return desc_; }
00274
00276 const RendDesc &rend_desc()const { return desc_; }
00277
00279 const String & get_name()const { return name_; }
00280
00282 void set_name(const String &x);
00283
00285 const String & get_author()const { return author_; }
00286
00288 void set_author(const String &x);
00289
00291 const String & get_description()const { return description_; }
00292
00294 void set_description(const String &x);
00295
00297 const String & get_id()const { return id_; }
00298
00300 void set_id(const String &x);
00301
00303 String get_meta_data(const String& key)const;
00304
00306 std::list<String> get_meta_data_keys()const;
00307
00309 void set_meta_data(const String& key, const String& data);
00310
00312 void erase_meta_data(const String& key);
00313
00315 String get_relative_id(etl::loose_handle<const Canvas> x)const;
00316
00318 String _get_relative_id(etl::loose_handle<const Canvas> x)const;
00319
00321 bool is_root()const { return !parent_; }
00322
00324
00325 LooseHandle parent()const { return parent_; }
00326
00327 LooseHandle get_root()const;
00328
00330 std::list<Handle> &children() { return children_; }
00331
00333 const std::list<Handle> &children()const { return children_; }
00334
00336
00337
00339 void set_time(Time t)const;
00340
00342 Time get_time()const { return cur_time_; }
00343
00345 int size()const;
00346
00348 void clear();
00349
00351 bool empty()const;
00352
00354
00355
00357 const ValueNodeList &value_node_list()const;
00358
00360 KeyframeList &keyframe_list();
00361
00363 const KeyframeList &keyframe_list()const;
00364
00366
00369 ValueNode::Handle find_value_node(const String &id);
00370
00372 ValueNode::Handle surefind_value_node(const String &id);
00373
00375
00378 ValueNode::ConstHandle find_value_node(const String &id)const;
00379
00381 void add_value_node(ValueNode::Handle x, const String &id);
00382
00384
00385
00387 void remove_value_node(ValueNode::Handle x);
00388
00390 void remove_value_node(const String &id) { remove_value_node(find_value_node(id)); }
00391
00393
00397 Handle surefind_canvas(const String &id);
00398
00400
00403 Handle find_canvas(const String &id);
00404
00406
00409 ConstHandle find_canvas(const String &id)const;
00410
00412
00413
00415 String get_file_path()const;
00416
00418 void set_file_name(const String &);
00419
00421 String get_file_name()const;
00422
00424 Handle new_child_canvas();
00425
00427 Handle new_child_canvas(const String &id);
00428
00430 Handle add_child_canvas(Handle child_canvas, const String &id);
00431
00432 void remove_child_canvas(Handle child_canvas);
00433
00434 etl::handle<Layer> find_layer(const Point &pos);
00435
00436 int get_depth(etl::handle<Layer>)const;
00437
00438 Context get_context()const;
00439
00440 iterator end();
00441
00442 const_iterator end()const;
00443
00444 reverse_iterator rbegin();
00445
00446 const_reverse_iterator rbegin()const;
00447
00448 etl::handle<Layer> &back();
00449
00450 void push_back(etl::handle<Layer> x);
00451
00452 void push_front(etl::handle<Layer> x);
00453
00454 void push_back_simple(etl::handle<Layer> x);
00455
00456 void insert(iterator iter,etl::handle<Layer> x);
00457 void erase(iterator iter);
00458
00459 const etl::handle<Layer> &back()const;
00460
00461 void set_inline(LooseHandle parent);
00462
00463 static Handle create();
00464
00465 static Handle create_inline(Handle parent);
00466
00467 Handle clone(const GUID& deriv_guid=GUID())const;
00468
00469 private:
00470 void add_group_pair(String group, etl::handle<Layer> layer);
00471 void remove_group_pair(String group, etl::handle<Layer> layer);
00472
00473 protected:
00474 virtual void on_changed();
00475 virtual void get_times_vfunc(Node::time_set &set) const;
00476 };
00477
00478 void optimize_layers(Context context, Canvas::Handle op_canvas);
00479
00480
00481 };
00482
00483
00484
00485 #endif