00001
00022
00023
00024
00025
00026 #ifndef __SYNFIG_CANVAS_H
00027 #define __SYNFIG_CANVAS_H
00028
00029
00030
00031 #include <map>
00032 #include <list>
00033 #include <ETL/handle>
00034 #include <sigc++/signal.h>
00035 #include <sigc++/connection.h>
00036
00037 #include "vector.h"
00038 #include "string.h"
00039 #include "canvasbase.h"
00040 #include "valuenode.h"
00041 #include "keyframe.h"
00042 #include "renddesc.h"
00043 #include "node.h"
00044 #include "guid.h"
00045
00046
00047
00048
00049
00050
00051
00052 namespace synfig {
00053
00054 class Context;
00055 class GUID;
00056
00060 class Canvas : public CanvasBase, public Node
00061 {
00062
00063
00064
00065
00066 public:
00067 typedef etl::handle<Canvas> Handle;
00068 typedef etl::loose_handle<Canvas> LooseHandle;
00069 typedef etl::handle<const Canvas> ConstHandle;
00070
00071 typedef std::list<Handle> Children;
00072
00073 friend void synfig::optimize_layers(Context, Canvas::Handle, bool seen_motion_blur);
00074
00075
00076
00077
00078
00079 private:
00080
00082
00083 String id_;
00084
00086
00087 String name_;
00088
00090
00091 String description_;
00092
00094
00095 String author_;
00096
00098
00099 String email_;
00100
00102
00103 String file_name_;
00104
00106
00107 std::map<String, String> meta_data_;
00108
00110
00111 ValueNodeList value_node_list_;
00112
00114 KeyframeList keyframe_list_;
00115
00117
00120 LooseHandle parent_;
00121
00123
00124 Children children_;
00125
00127
00128 RendDesc desc_;
00129
00131 Time cur_time_;
00132
00134 mutable std::map<String,Handle> externals_;
00135
00137 bool is_inline_;
00138
00139 mutable bool is_dirty_;
00140
00141 bool op_flag_;
00142
00144 std::map<String,std::set<etl::handle<Layer> > > group_db_;
00145
00147 std::map<etl::loose_handle<Layer>,std::vector<sigc::connection> > connections_;
00148
00149
00150
00151
00152
00153 private:
00154
00156 sigc::signal<void,String> signal_group_added_;
00157
00159 sigc::signal<void,String> signal_group_removed_;
00160
00162 sigc::signal<void,String> signal_group_changed_;
00163
00164 sigc::signal<void,String,etl::handle<synfig::Layer> > signal_group_pair_added_;
00165 sigc::signal<void,String,etl::handle<synfig::Layer> > signal_group_pair_removed_;
00166
00168 sigc::signal<void,int*> signal_layers_reordered_;
00169
00171 sigc::signal<void> signal_rend_desc_changed_;
00172
00174 sigc::signal<void> signal_id_changed_;
00175
00177
00178
00180 sigc::signal<void> signal_file_name_changed_;
00181
00183 sigc::signal<void, String> signal_meta_data_changed_;
00184
00186 std::map<String, sigc::signal<void> > signal_map_meta_data_changed_;
00187
00188
00190 sigc::signal<void, etl::handle<ValueNode> > signal_value_node_changed_;
00191
00192 sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> > signal_value_node_child_added_;
00193
00194 sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> > signal_value_node_child_removed_;
00195
00196
00197
00198
00199
00200 public:
00201
00202 sigc::signal<void,String,etl::handle<synfig::Layer> >& signal_group_pair_added() { return signal_group_pair_added_; }
00203 sigc::signal<void,String,etl::handle<synfig::Layer> >& signal_group_pair_removed() { return signal_group_pair_removed_; }
00204
00206 sigc::signal<void,String>& signal_group_added() { return signal_group_added_; }
00207
00209 sigc::signal<void,String>& signal_group_removed() { return signal_group_removed_; }
00210
00212 sigc::signal<void,String>& signal_group_changed() { return signal_group_changed_; }
00213
00215 sigc::signal<void,int*>& signal_layers_reordered() { return signal_layers_reordered_; }
00216
00218 sigc::signal<void>& signal_rend_desc_changed() { return signal_rend_desc_changed_; }
00219
00221 sigc::signal<void>& signal_id_changed() { return signal_id_changed_; }
00222
00224 sigc::signal<void>& signal_file_name_changed();
00225
00227 sigc::signal<void, String>& signal_meta_data_changed() { return signal_meta_data_changed_; }
00228
00230 sigc::signal<void>& signal_meta_data_changed(const String& key) { return signal_map_meta_data_changed_[key]; }
00231
00232
00233 sigc::signal<void, etl::handle<ValueNode> >& signal_value_node_changed() { return signal_value_node_changed_; }
00234
00236 sigc::signal<void>& signal_dirty() { return signal_changed(); }
00237
00239 sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> >& signal_value_node_child_added() { return signal_value_node_child_added_; }
00240
00242 sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> >& signal_value_node_child_removed() { return signal_value_node_child_removed_; }
00243
00244
00245
00246
00247
00248 protected:
00249
00250 Canvas(const String &name);
00251
00252 public:
00253
00254 ~Canvas();
00255
00256
00257
00258
00259
00260 public:
00261
00263 std::set<etl::handle<Layer> > get_layers_in_group(const String&group);
00264
00266 std::set<String> get_groups()const;
00267
00269 int get_group_count()const;
00270
00272 void rename_group(const String&old_name,const String&new_name);
00273
00275 bool is_inline()const { return is_inline_; }
00276
00278 RendDesc &rend_desc() { return desc_; }
00279
00281 const RendDesc &rend_desc()const { return desc_; }
00282
00284 const String & get_name()const { return name_; }
00285
00287 void set_name(const String &x);
00288
00290 const String & get_author()const { return author_; }
00291
00293 void set_author(const String &x);
00294
00296 const String & get_description()const { return description_; }
00297
00299 void set_description(const String &x);
00300
00302 const String & get_id()const { return id_; }
00303
00305 void set_id(const String &x);
00306
00308 String get_meta_data(const String& key)const;
00309
00311 std::list<String> get_meta_data_keys()const;
00312
00314 void set_meta_data(const String& key, const String& data);
00315
00317 void erase_meta_data(const String& key);
00318
00320 String get_relative_id(etl::loose_handle<const Canvas> x)const;
00321
00323 String _get_relative_id(etl::loose_handle<const Canvas> x)const;
00324
00326 bool is_root()const { return !parent_; }
00327
00329
00330 LooseHandle parent()const { return parent_; }
00331
00332 LooseHandle get_root()const;
00333
00335 std::list<Handle> &children() { return children_; }
00336
00338 const std::list<Handle> &children()const { return children_; }
00339
00341
00342
00344 void set_time(Time t)const;
00345
00347 Time get_time()const { return cur_time_; }
00348
00350 int size()const;
00351
00353 void clear();
00354
00356 bool empty()const;
00357
00359
00360
00362 const ValueNodeList &value_node_list()const;
00363
00365 KeyframeList &keyframe_list();
00366
00368 const KeyframeList &keyframe_list()const;
00369
00371
00374 ValueNode::Handle find_value_node(const String &id);
00375
00377 ValueNode::Handle surefind_value_node(const String &id);
00378
00380
00383 ValueNode::ConstHandle find_value_node(const String &id)const;
00384
00386 void add_value_node(ValueNode::Handle x, const String &id);
00387
00389
00390
00392 void remove_value_node(ValueNode::Handle x);
00393
00395 void remove_value_node(const String &id) { remove_value_node(find_value_node(id)); }
00396
00398
00402 Handle surefind_canvas(const String &id);
00403
00405
00408 Handle find_canvas(const String &id);
00409
00411
00414 ConstHandle find_canvas(const String &id)const;
00415
00417
00418
00420 String get_file_path()const;
00421
00423 void set_file_name(const String &);
00424
00426 String get_file_name()const;
00427
00429 Handle new_child_canvas();
00430
00432 Handle new_child_canvas(const String &id);
00433
00435 Handle add_child_canvas(Handle child_canvas, const String &id);
00436
00437 void remove_child_canvas(Handle child_canvas);
00438
00439 etl::handle<Layer> find_layer(const Point &pos);
00440
00441 int get_depth(etl::handle<Layer>)const;
00442
00443 Context get_context()const;
00444
00445 iterator end();
00446
00447 const_iterator end()const;
00448
00449 reverse_iterator rbegin();
00450
00451 const_reverse_iterator rbegin()const;
00452
00453 etl::handle<Layer> &back();
00454
00455 void push_back(etl::handle<Layer> x);
00456
00457 void push_front(etl::handle<Layer> x);
00458
00459 void push_back_simple(etl::handle<Layer> x);
00460
00461 void insert(iterator iter,etl::handle<Layer> x);
00462 void erase(iterator iter);
00463
00464 const etl::handle<Layer> &back()const;
00465
00466 void set_inline(LooseHandle parent);
00467
00468 static Handle create();
00469
00470 static Handle create_inline(Handle parent);
00471
00472 Handle clone(const GUID& deriv_guid=GUID())const;
00473
00474 private:
00475 void add_group_pair(String group, etl::handle<Layer> layer);
00476 void remove_group_pair(String group, etl::handle<Layer> layer);
00477 void add_connection(etl::loose_handle<Layer> layer, sigc::connection connection);
00478 void disconnect_connections(etl::loose_handle<Layer> layer);
00479
00480 protected:
00481 virtual void on_changed();
00482 virtual void get_times_vfunc(Node::time_set &set) const;
00483 };
00484
00485 void optimize_layers(Context context, Canvas::Handle op_canvas, bool seen_motion_blur=false);
00486
00487
00488 };
00489
00490
00491
00492 #endif