Add function LayerTreeStore::queue_rebuild(). Nothing uses it yet.
[synfig.git] / synfig-studio / trunk / src / gtkmm / layertreestore.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file layertreestore.cpp
3 **      \brief Template File
4 **
5 **      $Id$
6 **
7 **      \legal
8 **      Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 **      Copyright (c) 2008 Chris Moore
10 **
11 **      This package is free software; you can redistribute it and/or
12 **      modify it under the terms of the GNU General Public License as
13 **      published by the Free Software Foundation; either version 2 of
14 **      the License, or (at your option) any later version.
15 **
16 **      This package is distributed in the hope that it will be useful,
17 **      but WITHOUT ANY WARRANTY; without even the implied warranty of
18 **      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 **      General Public License for more details.
20 **      \endlegal
21 */
22 /* ========================================================================= */
23
24 /* === H E A D E R S ======================================================= */
25
26 #ifdef USING_PCH
27 #       include "pch.h"
28 #else
29 #ifdef HAVE_CONFIG_H
30 #       include <config.h>
31 #endif
32
33 #include "layertreestore.h"
34 #include "iconcontroller.h"
35 #include <gtkmm/button.h>
36 #include <synfig/paramdesc.h>
37 #include <synfigapp/action.h>
38 #include <synfigapp/instance.h>
39 #include "app.h"
40 #include "instance.h"
41 #include <synfigapp/action_system.h>
42
43 #include <gtk/gtkversion.h>
44 #include <ETL/clock>
45 #include "general.h"
46
47 #endif
48
49 /* === U S I N G =========================================================== */
50
51 using namespace std;
52 using namespace etl;
53 using namespace synfig;
54 using namespace studio;
55
56 /* === M A C R O S ========================================================= */
57
58 /* === G L O B A L S ======================================================= */
59
60 /* === P R O C E D U R E S ================================================= */
61
62 /* === M E T H O D S ======================================================= */
63
64 static LayerTreeStore::Model& ModelHack()
65 {
66         static LayerTreeStore::Model* model(0);
67         if(!model)model=new LayerTreeStore::Model;
68         return *model;
69 }
70
71 LayerTreeStore::LayerTreeStore(etl::loose_handle<synfigapp::CanvasInterface> canvas_interface_):
72         Gtk::TreeStore                  (ModelHack()),
73         queued                                  (false),
74         canvas_interface_               (canvas_interface_)
75 {
76         layer_icon=Gtk::Button().render_icon(Gtk::StockID("synfig-layer"),Gtk::ICON_SIZE_SMALL_TOOLBAR);
77
78         // Connect Signals to Terminals
79         canvas_interface()->signal_layer_status_changed().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_status_changed));
80         canvas_interface()->signal_layer_lowered().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_lowered));
81         canvas_interface()->signal_layer_raised().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_raised));
82         canvas_interface()->signal_layer_removed().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_removed));
83         canvas_interface()->signal_layer_inserted().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_inserted));
84         canvas_interface()->signal_layer_moved().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_moved));
85         //canvas_interface()->signal_layer_param_changed().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_param_changed));
86         canvas_interface()->signal_layer_new_description().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_new_description));
87
88         canvas_interface()->signal_time_changed().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::refresh));
89
90         //canvas_interface()->signal_value_node_changed().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_value_node_changed));
91         //canvas_interface()->signal_value_node_added().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_value_node_added));
92         //canvas_interface()->signal_value_node_deleted().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_value_node_deleted));
93         //canvas_interface()->signal_value_node_replaced().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_value_node_replaced));
94
95         set_default_sort_func(sigc::ptr_fun(index_sorter));
96
97 //      rebuild();
98 }
99
100 LayerTreeStore::~LayerTreeStore()
101 {
102         if (getenv("SYNFIG_DEBUG_DESTRUCTORS"))
103                 synfig::info("LayerTreeStore::~LayerTreeStore(): Deleted");
104 }
105
106 int
107 LayerTreeStore::z_sorter(const Gtk::TreeModel::iterator &rhs,const Gtk::TreeModel::iterator &lhs)
108 {
109         const Model model;
110
111         float diff((float)(*rhs)[model.z_depth]-(float)(*lhs)[model.z_depth]);
112
113         if(diff<0)
114                 return -1;
115         if(diff>0)
116                 return 1;
117         return 0;
118 }
119
120 int
121 LayerTreeStore::index_sorter(const Gtk::TreeModel::iterator &rhs,const Gtk::TreeModel::iterator &lhs)
122 {
123         const Model model;
124
125         return ((int)(*rhs)[model.index]-(int)(*lhs)[model.index]);
126 }
127
128 bool
129 LayerTreeStore::search_func(const Glib::RefPtr<TreeModel>&,int,const Glib::ustring& x,const TreeModel::iterator& iter)
130 {
131         const Model model;
132
133         Glib::ustring substr(x.uppercase());
134         Glib::ustring label((*iter)[model.label]);
135         label=label.uppercase();
136
137         return label.find(substr)==Glib::ustring::npos;
138 }
139
140
141 Glib::RefPtr<LayerTreeStore>
142 LayerTreeStore::create(etl::loose_handle<synfigapp::CanvasInterface> canvas_interface_)
143 {
144         return Glib::RefPtr<LayerTreeStore>(new LayerTreeStore(canvas_interface_));
145 }
146
147 void
148 LayerTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int column, Glib::ValueBase& value)const
149 {
150         if(column==model.index.index())
151         {
152                 synfig::Layer::Handle layer((*iter)[model.layer]);
153
154                 if(!layer)return;
155
156                 Glib::Value<int> x;
157                 g_value_init(x.gobj(),x.value_type());
158
159                 x.set(layer->get_depth());
160
161                 g_value_init(value.gobj(),x.value_type());
162                 g_value_copy(x.gobj(),value.gobj());
163         }
164         else if(column==model.z_depth.index())
165         {
166                 synfig::Layer::Handle layer((*iter)[model.layer]);
167
168                 if(!layer)return;
169
170                 Glib::Value<float> x;
171                 g_value_init(x.gobj(),x.value_type());
172
173                 x.set(layer->get_z_depth(canvas_interface()->get_time())*1.0001+layer->get_depth());
174
175                 g_value_init(value.gobj(),x.value_type());
176                 g_value_copy(x.gobj(),value.gobj());
177         }
178         else if(column==model.children_lock.index())
179         {
180                 synfig::Layer::Handle layer((*iter)[model.layer]);
181
182                 if(!layer)return;
183
184                 Glib::Value<bool> x;
185                 g_value_init(x.gobj(),x.value_type());
186                 x.set(false);
187
188                 ValueBase v(layer->get_param("children_lock"));
189                 if(v.same_type_as(bool()))
190                         x.set(v.get(bool()));
191
192                 g_value_init(value.gobj(),x.value_type());
193                 g_value_copy(x.gobj(),value.gobj());
194         }
195         else if(column==model.label.index())
196         {
197                 synfig::Layer::Handle layer((*iter)[model.layer]);
198
199                 if(!layer)return;
200
201                 Glib::Value<Glib::ustring> x;
202                 g_value_init(x.gobj(),x.value_type());
203
204                 x.set(layer->get_non_empty_description());
205
206                 g_value_init(value.gobj(),x.value_type());
207                 //g_value_copy(x.gobj(),value.gobj());
208                 value=x;
209         }
210         else if(column==model.tooltip.index())
211         {
212                 synfig::Layer::Handle layer((*iter)[model.layer]);
213
214                 if(!layer)return;
215
216                 Glib::Value<Glib::ustring> x;
217                 g_value_init(x.gobj(),x.value_type());
218
219
220                 x.set(layer->get_local_name());
221
222                 g_value_init(value.gobj(),x.value_type());
223                 //g_value_copy(x.gobj(),value.gobj());
224                 value=x;
225         }
226         else if(column==model.canvas.index())
227         {
228                 synfig::Layer::Handle layer((*iter)[model.layer]);
229
230                 if(!layer)return;
231
232                 Glib::Value<Canvas::Handle> x;
233                 g_value_init(x.gobj(),x.value_type());
234
235
236                 x.set(layer->get_canvas());
237
238                 g_value_init(value.gobj(),x.value_type());
239                 //g_value_copy(x.gobj(),value.gobj());
240                 value=x;
241         }
242         else if(column==model.active.index())
243         {
244                 synfig::Layer::Handle layer((*iter)[model.layer]);
245
246                 if(!layer)return;
247
248                 Glib::Value<bool> x;
249                 g_value_init(x.gobj(),x.value_type());
250
251                 x.set(layer->active());
252
253                 g_value_init(value.gobj(),x.value_type());
254                 g_value_copy(x.gobj(),value.gobj());
255         }
256         else if(column==model.icon.index())
257         {
258                 synfig::Layer::Handle layer((*iter)[model.layer]);
259                 if(!layer)return;
260
261                 Glib::Value<Glib::RefPtr<Gdk::Pixbuf> > x;
262                 g_value_init(x.gobj(),x.value_type());
263
264                 //x.set(layer_icon);
265                 x.set(get_tree_pixbuf_layer(layer->get_name()));
266
267                 g_value_init(value.gobj(),x.value_type());
268                 g_value_copy(x.gobj(),value.gobj());
269         }
270         else
271                 Gtk::TreeStore::get_value_vfunc(iter,column,value);
272 }
273
274 void
275 LayerTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int column, const Glib::ValueBase& value)
276 {
277         //if(!iterator_sane(row))
278         //      return;
279
280         if(column>=get_n_columns_vfunc())
281         {
282                 g_warning("LayerTreeStore::set_value_impl: Bad column (%d)",column);
283                 return;
284         }
285
286         if(!g_value_type_compatible(G_VALUE_TYPE(value.gobj()),get_column_type_vfunc(column)))
287         {
288                 g_warning("LayerTreeStore::set_value_impl: Bad value type");
289                 return;
290         }
291
292         try
293         {
294                 if(column==model.label.index())
295                 {
296                         Glib::Value<Glib::ustring> x;
297                         g_value_init(x.gobj(),model.label.type());
298                         g_value_copy(value.gobj(),x.gobj());
299
300                         synfig::Layer::Handle layer((*iter)[model.layer]);
301                         if(!layer)
302                                 return;
303                         synfig::String new_desc(x.get());
304
305                         if(new_desc==layer->get_local_name())
306                                 new_desc=synfig::String();
307
308                         if(new_desc==layer->get_description())
309                                 return;
310
311                         synfigapp::Action::Handle action(synfigapp::Action::create("layer_set_desc"));
312
313                         if(!action)
314                                 return;
315
316                         action->set_param("canvas",canvas_interface()->get_canvas());
317                         action->set_param("canvas_interface",canvas_interface());
318                         action->set_param("layer",layer);
319                         action->set_param("new_description",synfig::String(x.get()));
320
321                         canvas_interface()->get_instance()->perform_action(action);
322                         return;
323                 }
324                 else if(column==model.active.index())
325                 {
326                         synfig::Layer::Handle layer((*iter)[model.layer]);
327
328                         if(!layer)return;
329
330                         Glib::Value<bool> x;
331                         g_value_init(x.gobj(),model.active.type());
332                         g_value_copy(value.gobj(),x.gobj());
333
334                         synfigapp::Action::Handle action(synfigapp::Action::create("layer_activate"));
335
336                         if(!action)
337                                 return;
338
339                         action->set_param("canvas",canvas_interface()->get_canvas());
340                         action->set_param("canvas_interface",canvas_interface());
341                         action->set_param("layer",layer);
342                         action->set_param("new_status",bool(x.get()));
343
344                         canvas_interface()->get_instance()->perform_action(action);
345                         return;
346                 }
347                 else
348                         Gtk::TreeStore::set_value_impl(iter,column, value);
349
350         }
351         catch(std::exception x)
352         {
353                 g_warning(x.what());
354         }
355 }
356
357
358
359
360 bool
361 LayerTreeStore::row_draggable_vfunc (const TreeModel::Path& /*path*/)const
362 {
363         //if(!get_iter(path)) return false;
364 //      Gtk::TreeModel::Row row(*get_iter(path));
365
366         return true;
367 //      return (bool)true;
368 }
369
370 bool
371 LayerTreeStore::drag_data_get_vfunc (const TreeModel::Path& path, Gtk::SelectionData& selection_data)const
372 {
373         if(!const_cast<LayerTreeStore*>(this)->get_iter(path)) return false;
374         //synfig::info("Dragged data of type \"%s\"",selection_data.get_data_type());
375         //synfig::info("Dragged data of target \"%s\"",gdk_atom_name(selection_data->target));
376         //synfig::info("Dragged selection=\"%s\"",gdk_atom_name(selection_data->selection));
377
378         Gtk::TreeModel::Row row(*const_cast<LayerTreeStore*>(this)->get_iter(path));
379
380         if((bool)true)
381         {
382                 Layer* layer(((Layer::Handle)row[model.layer]).get());
383                 assert(layer);
384                 bool included(false);
385
386                 //gtk_selection_data_set (selection_data, gdk_atom_intern("LAYER",false), 8, reinterpret_cast<const guchar*>(&layer), sizeof(layer));
387
388                 std::vector<Layer*> layers;
389                 // The following is a hack for multiple row DND
390                 {
391                         synfigapp::SelectionManager::LayerList bleh(get_canvas_interface()->get_selection_manager()->get_selected_layers());
392                         if(bleh.empty())
393                         {
394                                 selection_data.set("LAYER", 8, reinterpret_cast<const guchar*>(&layer), sizeof(layer));
395                                 return true;
396                         }
397                         while(!bleh.empty())
398                         {
399                                 if(bleh.back().get()==layer)
400                                         included=true;
401                                 layers.push_back(bleh.back().get());
402                                 bleh.pop_back();
403                         }
404                 }
405                 if(!included)
406                         layers.push_back(layer);
407                 selection_data.set("LAYER", 8, reinterpret_cast<const guchar*>(&layers.front()), sizeof(void*)*layers.size());
408
409                 return true;
410         }
411         return false;
412 }
413
414 bool
415 LayerTreeStore::drag_data_delete_vfunc (const TreeModel::Path& /*path*/)
416 {
417         return true;
418 }
419
420 bool
421 LayerTreeStore::row_drop_possible_vfunc (const TreeModel::Path& dest, const Gtk::SelectionData& selection_data)const
422 {
423         //if(!const_cast<LayerTreeStore*>(this)->get_iter(dest)) return false;
424
425         //synfig::info("possible_drop -- data of type \"%s\"",selection_data.get_data_type());
426         //synfig::info("possible_drop -- data of target \"%s\"",gdk_atom_name(selection_data->target));
427         //synfig::info("possible_drop -- selection=\"%s\"",gdk_atom_name(selection_data->selection));
428
429         //Gtk::TreeModel::Row row(*get_iter(dest));
430
431         if(synfig::String(selection_data.get_data_type())=="LAYER" && (bool)true)
432         {
433                 //Layer::Handle src(reinterpret_cast<Layer**>(const_cast<guint8*>(selection_data.get_data()))[i]);
434                 //assert(src);
435
436                 //return true;
437                 TreeModel::Path dest_parent(dest);
438                 if(!dest_parent.up() || dest.get_depth()==1)
439                 {
440                         //row=(*get_iter(dest));
441                         //dest_canvas=(Canvas::Handle)(row[model.canvas]);
442                         return true;
443                 }
444                 else if((bool)const_cast<LayerTreeStore*>(this)->get_iter(dest_parent))
445                         return (bool)(Canvas::Handle)(*const_cast<LayerTreeStore*>(this)->get_iter(dest_parent))[model.contained_canvas];
446         }
447         return false;
448 }
449
450 bool
451 LayerTreeStore::drag_data_received_vfunc (const TreeModel::Path& dest, const Gtk::SelectionData& selection_data)
452 {
453
454         //if(!dest_parent.up() || !get_iter(dest)) return false;
455
456         bool ret=false;
457         int i(0);
458
459
460         //synfig::info("Dropped data of type \"%s\"",selection_data.get_data_type());
461         //synfig::info("Dropped data of target \"%s\"",gdk_atom_name(selection_data->target));
462         //synfig::info("Dropped selection=\"%s\"",gdk_atom_name(selection_data->selection));
463         synfigapp::Action::PassiveGrouper passive_grouper(canvas_interface()->get_instance().get(),_("Move Layers"));
464
465         // Save the selection data
466         synfigapp::SelectionManager::LayerList selected_layer_list=canvas_interface()->get_selection_manager()->get_selected_layers();
467
468         if ((selection_data.get_length() >= 0) && (selection_data.get_format() == 8))
469         {
470                 Gtk::TreeModel::Row row;
471                 Canvas::Handle dest_canvas;
472
473                 int dest_layer_depth=dest.back();
474
475                 TreeModel::Path dest_parent(dest);
476                 if(!dest_parent.up() || !get_iter(dest_parent))
477                 {
478                         TreeModel::Path dest_(dest);
479                         if(!get_iter(dest_))
480                                 dest_.prev();
481
482                         if(!get_iter(dest_))
483                                 return false;
484
485                         {
486                                 row=(*get_iter(dest_));
487                                 dest_canvas=(Canvas::Handle)(row[model.canvas]);
488                         }
489                 }
490                 else
491                 {
492                         row=(*get_iter(dest_parent));
493                         dest_canvas=row[model.contained_canvas];
494                 }
495
496                 assert(dest_canvas);
497
498                 Layer::Handle dest_layer(row[model.layer]);
499
500                 if(synfig::String(selection_data.get_data_type())=="LAYER")for(unsigned int i=0;i<selection_data.get_length()/sizeof(void*);i++)
501                 {
502                         //synfig::info("dest_layer_depth=%d",dest_layer_depth);
503
504                         Layer::Handle src(reinterpret_cast<Layer**>(const_cast<guint8*>(selection_data.get_data()))[i]);
505                         assert(src);
506                         if(dest_layer==src)
507                                 continue;
508
509                         if(dest_canvas==src->get_canvas() && src->get_depth()<dest_layer_depth)
510                                 dest_layer_depth--;
511
512                         // In this case, we are just moving.
513 //                      if(dest_canvas==src->get_canvas())
514                         {
515                                 //if(dest_canvas==src->get_canvas() && dest_layer_depth && dest_layer_depth>src->get_depth())
516                                 //      dest_layer_depth--;
517                                 if(dest_canvas==src->get_canvas() && dest_layer_depth==src->get_depth())
518                                         continue;
519
520                                 synfigapp::Action::Handle action(synfigapp::Action::create("layer_move"));
521                                 action->set_param("canvas",dest_canvas);
522                                 action->set_param("canvas_interface",canvas_interface());
523                                 action->set_param("layer",src);
524                                 action->set_param("new_index",dest_layer_depth);
525                                 action->set_param("dest_canvas",dest_canvas);
526                                 if(canvas_interface()->get_instance()->perform_action(action))
527                                         ret=true;
528                                 else
529                                 {
530                                         passive_grouper.cancel();
531                                         return false;
532                                 }
533                                 continue;
534                         }
535                         /*else // In this case we need to remove and then add
536                         {
537
538                                 synfigapp::Action::Handle action;
539                                 action=synfigapp::Action::create("layer_remove");
540                                 action->set_param("canvas",Canvas::Handle(src->get_canvas()));
541                                 if(!action->set_param("canvas_interface",App::get_instance(src->get_canvas())->find_canvas_interface(src->get_canvas())))
542                                         action->set_param("canvas_interface",canvas_interface());
543                                 action->set_param("layer",src);
544                                 if(!canvas_interface()->get_instance()->perform_action(action))
545                                 {
546                                         passive_grouper.cancel();
547                                         ret=false;
548                                         return false;
549                                 }
550
551                                 action=synfigapp::Action::create("layer_add");
552                                 action->set_param("canvas",dest_canvas);
553                                 action->set_param("canvas_interface",canvas_interface());
554                                 action->set_param("new",src);
555                                 if(!canvas_interface()->get_instance()->perform_action(action))
556                                 {
557                                         passive_grouper.cancel();
558                                         ret=false;
559                                         return false;
560                                 }
561
562                                 if(dest_layer_depth!=0)
563                                 {
564                                         action=synfigapp::Action::create("layer_move");
565                                         action->set_param("canvas",dest_canvas);
566                                         action->set_param("canvas_interface",canvas_interface());
567                                         action->set_param("layer",src);
568                                         action->set_param("new_index",dest_layer_depth);
569                                         if(!canvas_interface()->get_instance()->perform_action(action))
570                                         {
571                                                 passive_grouper.cancel();
572                                                 ret=false;
573                                                 return false;
574                                         }
575                                 }
576                                 ret=true;
577                         }
578                         */
579                 }
580         }
581         synfig::info("I supposedly moved %d layers",i);
582
583         // Reselect the previously selected layers
584         canvas_interface()->get_selection_manager()->set_selected_layers(selected_layer_list);
585
586         return ret;
587 }
588
589 void
590 LayerTreeStore::queue_rebuild()
591 {
592         if (queued) return;
593         queued = false;
594         queue_connection.disconnect();
595         queue_connection=Glib::signal_timeout().connect(
596                 sigc::bind_return(
597                         sigc::mem_fun(*this,&LayerTreeStore::rebuild),
598                         false
599                 )
600         ,150);
601 }
602
603 void
604 LayerTreeStore::rebuild()
605 {
606         if (queued) queued = false;
607
608         //etl::clock timer;timer.reset();
609
610         //synfig::warning("---------rebuilding layer table---------");
611         // Save the selection data
612         synfigapp::SelectionManager::LayerList layer_list=canvas_interface()->get_selection_manager()->get_selected_layers();
613
614         // Clear out the current list
615         clear();
616
617         // Go ahead and and add all the layers
618         std::for_each(
619                 canvas_interface()->get_canvas()->rbegin(), canvas_interface()->get_canvas()->rend(),
620                 sigc::mem_fun(*this, &studio::LayerTreeStore::on_layer_added)
621         );
622
623         // Reselect the previously selected layers
624         if(!layer_list.empty())
625                 canvas_interface()->get_selection_manager()->set_selected_layers(layer_list);
626
627         //synfig::info("LayerTreeStore::rebuild() took %f seconds",float(timer()));
628 }
629
630 void
631 LayerTreeStore::refresh()
632 {
633         etl::clock timer;timer.reset();
634
635         Gtk::TreeModel::Children children_(children());
636
637         Gtk::TreeModel::Children::iterator iter;
638
639         if(!children_.empty())
640                 for(iter = children_.begin(); iter && iter != children_.end(); ++iter)
641                 {
642                         Gtk::TreeRow row=*iter;
643                         refresh_row(row);
644                 }
645         //synfig::info("LayerTreeStore::refresh() took %f seconds",float(timer()));
646 }
647
648 void
649 LayerTreeStore::refresh_row(Gtk::TreeModel::Row &row)
650 {
651         Layer::Handle layer=row[model.layer];
652         /*
653         {
654                 row[model.name] = layer->get_local_name();
655                 if(layer->get_description().empty())
656                 {
657                         row[model.label] = layer->get_local_name();
658                         row[model.tooltip] = Glib::ustring("Layer");
659                 }
660                 else
661                 {
662                         row[model.label] = layer->get_description();
663                         row[model.tooltip] = layer->get_local_name();
664                 }
665         }
666         */
667
668         if(layer->dynamic_param_list().count("z_depth"))
669                 row[model.z_depth]=Time::begin();
670         //      row_changed(get_path(row),row);
671
672         Gtk::TreeModel::Children children = row.children();
673         Gtk::TreeModel::Children::iterator iter;
674
675         if(!children.empty())
676                 for(iter = children.begin(); iter && iter != children.end(); ++iter)
677                 {
678                         Gtk::TreeRow row=*iter;
679                         refresh_row(row);
680                 }
681 }
682
683
684 void
685 LayerTreeStore::set_row_layer(Gtk::TreeRow &row,synfig::Layer::Handle &handle)
686 {
687         //row[model.id] = handle->get_name();
688         //row[model.name] = handle->get_local_name();
689         /*if(handle->get_description().empty())
690         {
691                 //row[model.label] = handle->get_local_name();
692                 row[model.tooltip] = Glib::ustring("Layer");
693         }
694         else
695         {
696                 //row[model.label] = handle->get_description();
697                 row[model.tooltip] = handle->get_local_name();
698         }*/
699
700         //row[model.active] = handle->active();
701         row[model.layer] = handle;
702         //row[model.canvas] = handle->get_canvas();
703         //row[model.icon] = layer_icon;
704
705         synfig::Layer::ParamList paramlist=handle->get_param_list();
706
707         synfig::Layer::Vocab vocab=handle->get_param_vocab();
708         synfig::Layer::Vocab::iterator iter;
709
710         for(iter=vocab.begin();iter!=vocab.end();++iter)
711         {
712                 if(iter->get_hidden())
713                         continue;
714                 if(handle->get_param(iter->get_name()).get_type()!=ValueBase::TYPE_CANVAS)
715                         continue;
716
717                 {
718                         Canvas::Handle canvas;
719                         canvas=handle->get_param(iter->get_name()).get(canvas);
720                         if(!canvas)
721                                 continue;
722
723                         Canvas::reverse_iterator iter;
724                         row[model.contained_canvas]=canvas;
725
726                         for(iter=canvas->rbegin();iter!=canvas->rend();++iter)
727                         {
728                                 Gtk::TreeRow row_(*(prepend(row.children())));
729                                 set_row_layer(row_,*iter);
730                         }
731                         continue;
732                 }
733
734                 /*
735                 etl::handle<ValueNode> value_node;
736                 if(handle.constant()->dynamic_param_list().count(iter->get_name()))
737                         value_node=handle->dynamic_param_list()[iter->get_name()];
738
739                 Gtk::TreeRow child_row = *(append(row.children()));
740                 set_row_param(
741                         child_row,
742                         handle,
743                         iter->get_name(),
744                         iter->get_local_name(),
745                         paramlist[iter->get_name()],
746                         value_node,
747                         &*iter
748                 );
749                 */
750         }
751 }
752
753 void
754 LayerTreeStore::on_layer_added(synfig::Layer::Handle layer)
755 {
756         assert(layer);
757         Gtk::TreeRow row;
758         if(canvas_interface()->get_canvas()==layer->get_canvas())
759         {
760                 row=*(prepend());
761         }
762         else
763         {
764                 Gtk::TreeModel::Children::iterator iter;
765                 if(!find_canvas_row(layer->get_canvas(),iter))
766                 {
767                         rebuild();
768                         return;
769                 }
770                 row=*(prepend(iter->children()));
771         }
772         set_row_layer(row,layer);
773 }
774
775 void
776 LayerTreeStore::on_layer_removed(synfig::Layer::Handle handle)
777 {
778         Gtk::TreeModel::Children::iterator iter;
779         if(find_layer_row(handle,iter))
780                 erase(iter);
781         else
782         {
783                 synfig::error("LayerTreeStore::on_layer_removed():Unable to find layer to be removed, forced to rebuild...");
784                 rebuild();
785         }
786 }
787
788 void
789 LayerTreeStore::on_layer_inserted(synfig::Layer::Handle handle,int depth)
790 {
791         if(depth==0)
792         {
793                 on_layer_added(handle);
794                 return;
795         }
796
797         Gtk::TreeModel::Children children_(children());
798         if(canvas_interface()->get_canvas()!=handle->get_canvas())
799         {
800                 Gtk::TreeModel::Children::iterator iter;
801                 if(!find_canvas_row(handle->get_canvas(),iter))
802                 {
803                         synfig::error("LayerTreeStore::on_layer_inserted():Unable to find canvas row, forced to rebuild...");
804                         rebuild();
805                         return;
806                 }
807                 children_=iter->children();
808         }
809
810         Gtk::TreeModel::Children::iterator iter(children_.begin());
811         while(depth-- && iter)
812         {
813                 ++iter;
814                 if(!iter || iter==children_.end())
815                 {
816                         synfig::error("LayerTreeStore::on_layer_inserted():Unable to achieve desired depth, forced to rebuild...");
817                         rebuild();
818                         return;
819                 }
820         }
821
822         Gtk::TreeModel::Row row(*insert(iter));
823         set_row_layer(row,handle);
824 }
825
826 void
827 LayerTreeStore::on_layer_status_changed(synfig::Layer::Handle handle,bool /*x*/)
828 {
829         Gtk::TreeModel::Children::iterator iter;
830         if(find_layer_row(handle,iter))
831                 (*iter)[model.layer]=handle;
832         else
833         {
834                 synfig::warning("Couldn't find layer to be activated in layer list. Rebuilding index...");
835                 rebuild();
836         }
837 }
838
839 void
840 LayerTreeStore::on_layer_lowered(synfig::Layer::Handle layer)
841 {
842         Gtk::TreeModel::Children::iterator iter, iter2;
843         if(find_layer_row(layer,iter))
844         {
845                 // Save the selection data
846                 //synfigapp::SelectionManager::LayerList layer_list=canvas_interface()->get_selection_manager()->get_selected_layers();
847                 iter2=iter;
848                 iter2++;
849                 if(!iter2)
850                 {
851                         rebuild();
852                         return;
853                 }
854
855                 //Gtk::TreeModel::Row row(*iter);
856                 Gtk::TreeModel::Row row2 = *iter2;
857                 synfig::Layer::Handle layer2=row2[model.layer];
858
859                 erase(iter2);
860                 row2=*insert(iter);
861                 set_row_layer(row2,layer2);
862
863         }
864         else
865                 rebuild();
866 }
867
868 void
869 LayerTreeStore::on_layer_raised(synfig::Layer::Handle layer)
870 {
871         Gtk::TreeModel::Children::iterator iter, iter2;
872
873         Gtk::TreeModel::Children children_(children());
874
875         if(find_layer_row_(layer, canvas_interface()->get_canvas(), children_, iter,iter2))
876         {
877                 if(iter!=iter2)
878                 {
879                         //Gtk::TreeModel::Row row = *iter;
880                         Gtk::TreeModel::Row row2 = *iter2;
881                         synfig::Layer::Handle layer2=row2[model.layer];
882
883                         erase(iter2);
884                         iter++;
885                         row2=*insert(iter);
886                         set_row_layer(row2,layer2);
887
888                         return;
889                 }
890         }
891
892         rebuild();
893 }
894
895 void
896 LayerTreeStore::on_layer_moved(synfig::Layer::Handle layer,int depth, synfig::Canvas::Handle /*canvas*/)
897 {
898         on_layer_removed(layer);
899         on_layer_inserted(layer,depth);
900 }
901
902 void
903 LayerTreeStore::on_layer_param_changed(synfig::Layer::Handle handle,synfig::String param_name)
904 {
905         if(param_name=="z_depth")
906         {
907                 Gtk::TreeModel::Children::iterator iter;
908                 if(find_layer_row(handle,iter))
909                 {
910                         (*iter)[model.z_depth]=Time::begin();
911                 }
912         }
913
914         /*
915         Gtk::TreeModel::Children::iterator iter;
916         if(find_layer_row(handle,iter))
917         {
918                 Gtk::TreeModel::Children children(iter->children());
919
920                 for(iter = children.begin(); iter && iter != children.end(); ++iter)
921                 {
922                         if((Glib::ustring)(*iter)[model.param_name]==param_name)
923                         {
924                                 Gtk::TreeRow row=*iter;
925                                 refresh_row(row);
926                                 return;
927                         }
928                 }
929         }
930         rebuild();
931         */
932 }
933
934 void
935 LayerTreeStore::on_layer_new_description(synfig::Layer::Handle handle,synfig::String desc)
936 {
937         Gtk::TreeModel::Children::iterator iter;
938         if(find_layer_row(handle,iter))
939         {
940                 Gtk::TreeRow row(*iter);
941
942                 Layer::Handle layer(row[model.layer]);
943
944                 if(desc.empty())
945                 {
946                         //row[model.label]=layer->get_local_name();
947                         row[model.tooltip]=Glib::ustring(_("Layer"));
948                 }
949                 else
950                         //row[model.label]=layer->get_description();
951                         row[model.tooltip]=layer->get_local_name();
952         }
953         else
954         {
955                 rebuild();
956         }
957 }
958
959 bool
960 LayerTreeStore::find_canvas_row_(synfig::Canvas::Handle canvas, synfig::Canvas::Handle parent, Gtk::TreeModel::Children layers, Gtk::TreeModel::Children::iterator &iter)
961 {
962         if(canvas==parent)
963                 return false;
964
965         {
966                 for(iter=layers.begin(); iter && iter != layers.end(); ++iter)
967                 {
968                         Gtk::TreeModel::Row row = *iter;
969                         if(canvas==(synfig::Canvas::Handle)row[model.contained_canvas])
970                                 return true;
971                 }
972
973                 iter=children().end();
974                 //return false;
975         }
976
977         Gtk::TreeModel::Children::iterator iter2;
978         //Gtk::TreeModel::Children::iterator iter3;
979
980         for(iter2 = layers.begin(); iter2 && iter2 != layers.end(); ++iter2)
981         {
982                 Gtk::TreeModel::Row row = *iter2;
983                 assert((bool)true);
984
985                 if(row.children().empty())
986                         continue;
987
988                 Canvas::Handle sub_canvas((*row.children().begin())[model.canvas]);
989                 if(!sub_canvas)
990                         continue;
991
992                 if(find_canvas_row_(canvas,sub_canvas,iter2->children(),iter))
993                         return true;
994         }
995
996         iter=children().end();
997         return false;
998 }
999
1000 bool
1001 LayerTreeStore::find_canvas_row(synfig::Canvas::Handle canvas, Gtk::TreeModel::Children::iterator &iter)
1002 {
1003         return find_canvas_row_(canvas,canvas_interface()->get_canvas(),children(),iter);
1004 }
1005
1006
1007 bool
1008 LayerTreeStore::find_layer_row_(const synfig::Layer::Handle &layer, synfig::Canvas::Handle /*canvas*/, Gtk::TreeModel::Children layers, Gtk::TreeModel::Children::iterator &iter, Gtk::TreeModel::Children::iterator &prev)
1009 {
1010         assert(layer);
1011
1012         //if(layer->get_canvas()==canvas)
1013         {
1014                 for(iter=prev=layers.begin(); iter && iter != layers.end(); prev=iter++)
1015                 {
1016                         Gtk::TreeModel::Row row = *iter;
1017                         if(layer==(synfig::Layer::Handle)row[model.layer])
1018                                 return true;
1019                 }
1020
1021                 iter=children().end();
1022                 //return false;
1023         }
1024
1025         Gtk::TreeModel::Children::iterator iter2;
1026
1027         for(iter2 = layers.begin(); iter2 && iter2 != layers.end(); ++iter2)
1028         {
1029                 Gtk::TreeModel::Row row = *iter2;
1030                 assert((bool)true);
1031
1032                 if(row.children().empty())
1033                         continue;
1034
1035                 Canvas::Handle canvas((*row.children().begin())[model.canvas]);
1036                 if(!canvas)
1037                         continue;
1038
1039                 if(find_layer_row_(layer,canvas,iter2->children(),iter,prev))
1040                         return true;
1041         }
1042
1043         iter=children().end();
1044         return false;
1045 }
1046
1047 bool
1048 LayerTreeStore::find_layer_row(const synfig::Layer::Handle &layer, Gtk::TreeModel::Children::iterator &iter)
1049 {
1050         Gtk::TreeModel::Children::iterator prev;
1051         return find_layer_row_(layer,canvas_interface()->get_canvas(),children(),iter,prev);
1052 }
1053
1054 bool
1055 LayerTreeStore::find_prev_layer_row(const synfig::Layer::Handle &layer, Gtk::TreeModel::Children::iterator &prev)
1056 {
1057         Gtk::TreeModel::Children::iterator iter;
1058         if(!find_layer_row_(layer,canvas_interface()->get_canvas(),children(),iter,prev))
1059                 return false;
1060         if(iter==children().begin())
1061                 return false;
1062         return true;
1063 }