Allow PasteCanvas layers with unset canvas parameters to be exported.
[synfig.git] / synfig-studio / trunk / src / gtkmm / layertreestore.h
1 /* === S Y N F I G ========================================================= */
2 /*!     \file layertreestore.h
3 **      \brief Template Header
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 /* === S T A R T =========================================================== */
24
25 #ifndef __SYNFIG_STUDIO_LAYERTREESTORE_H
26 #define __SYNFIG_STUDIO_LAYERTREESTORE_H
27
28 /* === H E A D E R S ======================================================= */
29
30 #include <gtkmm/treestore.h>
31 #include <synfigapp/canvasinterface.h>
32 #include <synfig/value.h>
33 #include <synfig/valuenode.h>
34 #include <gtkmm/treeview.h>
35
36 /* === M A C R O S ========================================================= */
37
38 /* === T Y P E D E F S ===================================================== */
39
40 /* === C L A S S E S & S T R U C T S ======================================= */
41
42 namespace studio {
43
44 class LayerTreeStore : virtual public Gtk::TreeStore
45 {
46         /*
47  -- ** -- P U B L I C   T Y P E S ---------------------------------------------
48         */
49
50 public:
51
52         class Model : public Gtk::TreeModel::ColumnRecord
53         {
54         public:
55                 Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon;
56                 Gtk::TreeModelColumn<Glib::ustring> label;
57                 Gtk::TreeModelColumn<Glib::ustring> name;
58                 Gtk::TreeModelColumn<Glib::ustring> id;
59
60                 Gtk::TreeModelColumn<synfig::Canvas::Handle> canvas;
61
62                 Gtk::TreeModelColumn<Glib::ustring> tooltip;
63
64
65                 Gtk::TreeModelColumn<bool>                                              active;
66                 Gtk::TreeModelColumn<synfig::Layer::Handle>             layer;
67                 Gtk::TreeModelColumn<synfig::Canvas::Handle>                    contained_canvas;
68
69                 Gtk::TreeModelColumn<bool>                                              children_lock;
70
71                 Gtk::TreeModelColumn<float> z_depth;
72                 Gtk::TreeModelColumn<int> index;
73
74                 Model()
75                 {
76                         add(icon);
77                         add(label);
78                         add(name);
79                         add(id);
80                         add(canvas);
81                         add(tooltip);
82                         add(active);
83                         add(layer);
84                         add(contained_canvas);
85                         add(z_depth);
86                         add(index);
87                         add(children_lock);
88                 }
89         };
90
91         /*
92  -- ** -- P U B L I C  D A T A ------------------------------------------------
93         */
94
95 public:
96
97         //! TreeModel for the layers
98         const Model model;
99
100         /*
101  -- ** -- P R I V A T E   D A T A ---------------------------------------------
102         */
103
104 private:
105
106         bool queued;
107
108         sigc::connection queue_connection;
109
110         std::map<synfig::Layer::Handle, sigc::connection> subcanvas_changed_connections;
111
112         etl::loose_handle<synfigapp::CanvasInterface> canvas_interface_;
113
114         Glib::RefPtr<Gdk::Pixbuf> layer_icon;
115
116         /*
117  -- ** -- P R I V A T E   M E T H O D S ---------------------------------------
118         */
119
120 private:
121
122         /*
123  -- ** -- P R O T E C T E D   M E T H O D S -----------------------------------
124         */
125
126 private:
127         virtual void  set_value_impl (const Gtk::TreeModel::iterator& row, int column, const Glib::ValueBase& value);
128         virtual void  get_value_vfunc (const Gtk::TreeModel::iterator& iter, int column, Glib::ValueBase& value)const;
129
130         virtual bool  row_draggable_vfunc (const TreeModel::Path& path)const;
131         virtual bool  drag_data_get_vfunc (const TreeModel::Path& path, Gtk::SelectionData& selection_data)const;
132         virtual bool  drag_data_delete_vfunc (const TreeModel::Path& path);
133         virtual bool  drag_data_received_vfunc (const TreeModel::Path& dest, const Gtk::SelectionData& selection_data);
134         virtual bool  row_drop_possible_vfunc (const TreeModel::Path& dest, const Gtk::SelectionData& selection_data)const;
135
136         /*
137  -- ** -- S I G N A L   T E R M I N A L S -------------------------------------
138         */
139
140 private:
141
142         bool on_layer_tree_event(GdkEvent *event);
143
144         void on_layer_new_description(synfig::Layer::Handle handle,synfig::String desc);
145
146         void on_layer_added(synfig::Layer::Handle handle);
147
148         void on_layer_removed(synfig::Layer::Handle handle);
149
150         void on_layer_inserted(synfig::Layer::Handle handle,int depth);
151
152         void on_layer_moved(synfig::Layer::Handle handle,int depth, synfig::Canvas::Handle canvas);
153
154         void on_layer_status_changed(synfig::Layer::Handle handle,bool);
155
156         void on_layer_lowered(synfig::Layer::Handle handle);
157
158         void on_layer_raised(synfig::Layer::Handle handle);
159
160         void on_layer_param_changed(synfig::Layer::Handle handle,synfig::String param_name);
161
162         //void on_value_node_added(synfig::ValueNode::Handle value_node);
163
164         //void on_value_node_deleted(synfig::ValueNode::Handle value_node);
165
166         //void on_value_node_changed(synfig::ValueNode::Handle value_node);
167
168         //void on_value_node_replaced(synfig::ValueNode::Handle replaced_value_node,synfig::ValueNode::Handle new_value_node);
169
170         bool find_layer_row_(const synfig::Layer::Handle &handle, synfig::Canvas::Handle canvas, Gtk::TreeModel::Children layers, Gtk::TreeModel::Children::iterator &iter, Gtk::TreeModel::Children::iterator &prev);
171
172         bool find_canvas_row_(synfig::Canvas::Handle canvas, synfig::Canvas::Handle parent, Gtk::TreeModel::Children layers, Gtk::TreeModel::Children::iterator &iter);
173
174         /*
175  -- ** -- P U B L I C   M E T H O D S -----------------------------------------
176         */
177
178 public:
179
180         LayerTreeStore(etl::loose_handle<synfigapp::CanvasInterface> canvas_interface_);
181         ~LayerTreeStore();
182
183         etl::loose_handle<synfigapp::CanvasInterface> canvas_interface() { return canvas_interface_; }
184         etl::loose_handle<const synfigapp::CanvasInterface> canvas_interface()const { return canvas_interface_; }
185         etl::loose_handle<synfigapp::CanvasInterface> get_canvas_interface()const { return canvas_interface_; }
186
187         bool find_canvas_row(synfig::Canvas::Handle canvas, Gtk::TreeModel::Children::iterator &iter);
188
189         bool find_layer_row(const synfig::Layer::Handle &handle, Gtk::TreeModel::Children::iterator &iter);
190
191         bool find_prev_layer_row(const synfig::Layer::Handle &handle, Gtk::TreeModel::Children::iterator &iter);
192
193         void queue_rebuild();
194
195         void rebuild();
196
197         void refresh();
198
199         void refresh_row(Gtk::TreeModel::Row &row);
200
201         void set_row_layer(Gtk::TreeRow &row,synfig::Layer::Handle &handle);
202
203         static int z_sorter(const Gtk::TreeModel::iterator &rhs,const Gtk::TreeModel::iterator &lhs);
204         static int index_sorter(const Gtk::TreeModel::iterator &rhs,const Gtk::TreeModel::iterator &lhs);
205
206         //void set_row_param(Gtk::TreeRow &row,synfig::Layer::Handle &handle,const std::string& name, const std::string& local_name, const synfig::ValueBase &value, etl::handle<synfig::ValueNode> value_node,synfig::ParamDesc *param_desc);
207
208         //virtual void set_row(Gtk::TreeRow row,synfigapp::ValueDesc value_desc);
209         static bool search_func(const Glib::RefPtr<TreeModel>&,int,const Glib::ustring&,const TreeModel::iterator&);
210
211         /*
212  -- ** -- S T A T I C   P U B L I C   M E T H O D S ---------------------------
213         */
214
215 public:
216
217         static Glib::RefPtr<LayerTreeStore> create(etl::loose_handle<synfigapp::CanvasInterface> canvas_interface_);
218
219
220 }; // END of class LayerTreeStore
221
222 }; // END of namespace studio
223
224 /* === E N D =============================================================== */
225
226 #endif