Now that it doesn't matter which half of a waypoint you click on, we don't need to...
[synfig.git] / synfig-studio / trunk / src / gtkmm / layertree.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file layertree.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) 2007, 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 "layertree.h"
34 #include "layerparamtreestore.h"
35 #include "cellrenderer_value.h"
36 #include "cellrenderer_timetrack.h"
37 #include <synfigapp/action.h>
38 #include <synfigapp/instance.h>
39 #include <gtkmm/scrolledwindow.h>
40 #include <gtkmm/paned.h>
41 #include "app.h"
42 #include "instance.h"
43 #include <gtkmm/treemodelsort.h>
44
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 #ifndef SMALL_BUTTON
59 #define SMALL_BUTTON(button,stockid,tooltip)    \
60         button = manage(new class Gtk::Button());       \
61         icon=manage(new Gtk::Image(Gtk::StockID(stockid),iconsize));    \
62         button->add(*icon);     \
63         tooltips_.set_tip(*button,tooltip);     \
64         icon->set_padding(0,0);\
65         icon->show();   \
66         button->set_relief(Gtk::RELIEF_NONE); \
67         button->show()
68 #endif
69
70 #ifndef NORMAL_BUTTON
71 #define NORMAL_BUTTON(button,stockid,tooltip)   \
72         button = manage(new class Gtk::Button());       \
73         icon=manage(new Gtk::Image(Gtk::StockID(stockid),Gtk::ICON_SIZE_BUTTON));       \
74         button->add(*icon);     \
75         tooltips_.set_tip(*button,tooltip);     \
76         icon->set_padding(0,0);\
77         icon->show();   \
78         /*button->set_relief(Gtk::RELIEF_NONE);*/ \
79         button->show()
80 #endif
81
82 #define NEW_SMALL_BUTTON(x,y,z) Gtk::Button *SMALL_BUTTON(x,y,z)
83
84 #define NOT_IMPLEMENTED_SLOT sigc::mem_fun(*reinterpret_cast<studio::CanvasViewUIInterface*>(get_ui_interface().get()),&studio::CanvasViewUIInterface::not_implemented)
85
86 /* === G L O B A L S ======================================================= */
87
88 /* === P R O C E D U R E S ================================================= */
89
90 /* === M E T H O D S ======================================================= */
91
92 LayerTree::LayerTree():
93         layer_amount_adjustment_(1,0,1,0.01,0.01,0)
94 {
95         param_tree_view_=new Gtk::TreeView;
96         layer_tree_view_=new Gtk::TreeView;
97
98         //Gtk::HPaned* hpaned(manage(new Gtk::HPaned()));
99         //hpaned->show();
100         //attach(*hpaned, 0, 3, 0, 1, Gtk::EXPAND|Gtk::FILL,Gtk::EXPAND|Gtk::FILL, 0, 0);
101         //attach(*create_layer_tree(), 0, 3, 0, 1, Gtk::EXPAND|Gtk::FILL,Gtk::EXPAND|Gtk::FILL, 0, 0);
102
103         create_layer_tree();
104         create_param_tree();
105
106         //hpaned->pack1(*create_layer_tree(),false,false);
107         //hpaned->pack2(*create_param_tree(),true,false);
108         //hpaned->set_position(200);
109         hbox=manage(new Gtk::HBox());
110
111         attach(*hbox, 0, 1, 1, 2, Gtk::FILL|Gtk::SHRINK, Gtk::SHRINK, 0, 0);
112         attach(blend_method_widget, 2, 3, 1, 2,Gtk::SHRINK, Gtk::SHRINK, 0, 0);
113
114         layer_amount_hscale=manage(new Gtk::HScale(layer_amount_adjustment_));
115         layer_amount_hscale->set_digits(2);
116         layer_amount_hscale->set_value_pos(Gtk::POS_LEFT);
117         layer_amount_hscale->set_sensitive(false);
118         layer_amount_hscale->set_update_policy( Gtk::UPDATE_DISCONTINUOUS);
119         attach(*layer_amount_hscale, 1, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK, 1, 1);
120         layer_amount_adjustment_.signal_value_changed().connect(sigc::mem_fun(*this, &studio::LayerTree::on_amount_value_changed));
121
122         Gtk::Image *icon;
123         //Gtk::IconSize iconsize(Gtk::IconSize::from_name("synfig-small_icon"));
124         Gtk::IconSize iconsize(Gtk::ICON_SIZE_SMALL_TOOLBAR);
125
126         SMALL_BUTTON(button_raise,"gtk-go-up","Raise");
127         SMALL_BUTTON(button_lower,"gtk-go-down","Lower");
128         SMALL_BUTTON(button_duplicate,"synfig-duplicate","Duplicate");
129         SMALL_BUTTON(button_encapsulate,"synfig-encapsulate","Encapsulate");
130         SMALL_BUTTON(button_delete,"gtk-delete","Delete");
131
132         hbox->pack_start(*button_raise,Gtk::PACK_SHRINK);
133         hbox->pack_start(*button_lower,Gtk::PACK_SHRINK);
134         hbox->pack_start(*button_duplicate,Gtk::PACK_SHRINK);
135         hbox->pack_start(*button_encapsulate,Gtk::PACK_SHRINK);
136         hbox->pack_start(*button_delete,Gtk::PACK_SHRINK);
137
138         // button_raise->signal_clicked().connect(sigc::mem_fun(*this, &studio::LayerTree::on_raise_pressed));
139         // button_lower->signal_clicked().connect(sigc::mem_fun(*this, &studio::LayerTree::on_lower_pressed));
140         // button_duplicate->signal_clicked().connect(sigc::mem_fun(*this, &studio::LayerTree::on_duplicate_pressed));
141         // button_encapsulate->signal_clicked().connect(sigc::mem_fun(*this, &studio::LayerTree::on_encapsulate_pressed));
142         // button_delete->signal_clicked().connect(sigc::mem_fun(*this, &studio::LayerTree::on_delete_pressed));
143         
144         button_raise->set_sensitive(false);
145         button_lower->set_sensitive(false);
146         button_duplicate->set_sensitive(false);
147         button_encapsulate->set_sensitive(false);
148         button_delete->set_sensitive(false);
149
150         get_selection()->signal_changed().connect(sigc::mem_fun(*this, &studio::LayerTree::on_selection_changed));
151
152         get_layer_tree_view().set_reorderable(true);
153         get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);
154         //get_param_tree_view().get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);
155         get_layer_tree_view().show();
156         get_param_tree_view().show();
157
158         hbox->show();
159         layer_amount_hscale->show();
160         blend_method_widget.show();
161
162         tooltips_.enable();
163         disable_amount_changed_signal=false;
164
165         blend_method_widget.set_param_desc(ParamDesc(Color::BlendMethod(),"blend_method"));
166
167         blend_method_widget.set_value((int)Color::BLEND_COMPOSITE);
168         blend_method_widget.set_size_request(150,-1);
169         blend_method_widget.set_sensitive(false);
170         blend_method_widget.signal_activate().connect(sigc::mem_fun(*this, &studio::LayerTree::on_blend_method_changed));
171 }
172
173 LayerTree::~LayerTree()
174 {
175         if (getenv("SYNFIG_DEBUG_DESTRUCTORS"))
176                 synfig::info("LayerTree::~LayerTree(): Deleted");
177 }
178
179 Gtk::Widget*
180 LayerTree::create_layer_tree()
181 {
182         const LayerTreeStore::Model model;
183
184         {       // --- O N / O F F ----------------------------------------------------
185                 //int index;
186                 //index=get_layer_tree_view().append_column_editable(_(" "),layer_model.active);
187                 //Gtk::TreeView::Column* column = get_layer_tree_view().get_column(index-1);
188
189                 Gtk::TreeView::Column* column = Gtk::manage( new Gtk::TreeView::Column(_(" ")) );
190
191                 // Set up the icon cell-renderer
192                 Gtk::CellRendererToggle* cellrenderer = Gtk::manage( new Gtk::CellRendererToggle() );
193                 cellrenderer->signal_toggled().connect(sigc::mem_fun(*this, &studio::LayerTree::on_layer_toggle));
194
195                 column->pack_start(*cellrenderer,false);
196                 column->add_attribute(cellrenderer->property_active(), layer_model.active);
197                 get_layer_tree_view().append_column(*column);
198         }
199
200         {       // --- I C O N --------------------------------------------------------
201                 int index;
202                 index=get_layer_tree_view().append_column(_("Z"),layer_model.icon);
203                 Gtk::TreeView::Column* column = get_layer_tree_view().get_column(index-1);
204                 get_layer_tree_view().set_expander_column(*column);
205
206                 column->set_sort_column(layer_model.z_depth);
207                 //column->set_reorderable();
208                 //column->set_resizable();
209                 //column->set_clickable();
210
211                 //Gtk::CellRendererPixbuf* icon_cellrenderer = Gtk::manage( new Gtk::CellRendererPixbuf() );
212                 //column->pack_start(*icon_cellrenderer,false);
213                 //column->add_attribute(icon_cellrenderer->property_pixbuf(), layer_model.icon);
214         }
215         //get_layer_tree_view().append_column(_("Z"),layer_model.z_depth);
216         {       // --- N A M E --------------------------------------------------------
217                 Gtk::TreeView::Column* column = Gtk::manage( new Gtk::TreeView::Column(_("Name")) );
218
219                 // Set up the icon cell-renderer
220                 Gtk::CellRendererText* cellrenderer = Gtk::manage( new Gtk::CellRendererText() );
221                 column->pack_start(*cellrenderer,false);
222                 column->add_attribute(cellrenderer->property_text(), layer_model.label);
223                 cellrenderer->signal_edited().connect(sigc::mem_fun(*this, &studio::LayerTree::on_layer_renamed));
224                 cellrenderer->property_editable()=true;
225
226                 column->set_reorderable();
227                 // column->set_resizable();
228                 column->set_clickable(true);
229                 column->set_sort_column(layer_model.label);
230
231                 get_layer_tree_view().append_column(*column);
232
233                 //              int index;
234 //              index=get_layer_tree_view().append_column_editable(_("Layer"),layer_model.label);
235                 //Gtk::TreeView::Column* column = get_layer_tree_view().get_column(index-1);
236
237                 //get_layer_tree_view().set_expander_column(*column);
238
239                 //Gtk::CellRendererPixbuf* icon_cellrenderer = Gtk::manage( new Gtk::CellRendererPixbuf() );
240                 //column->pack_start(*icon_cellrenderer,false);
241                 //column->add_attribute(icon_cellrenderer->property_pixbuf(), layer_model.icon);
242         }
243         {       // --- Z D E P T H ----------------------------------------------------
244                 int index;
245                 index=get_layer_tree_view().append_column(_("Z"),layer_model.z_depth);
246                 column_z_depth=get_layer_tree_view().get_column(index-1);
247
248                 column_z_depth->set_reorderable();
249                 column_z_depth->set_resizable();
250                 column_z_depth->set_clickable();
251
252                 column_z_depth->set_sort_column(layer_model.z_depth);
253         }
254
255         get_layer_tree_view().set_enable_search(true);
256         get_layer_tree_view().set_search_column(layer_model.label);
257         get_layer_tree_view().set_search_equal_func(sigc::ptr_fun(&studio::LayerTreeStore::search_func));
258
259         std::list<Gtk::TargetEntry> listTargets;
260         listTargets.push_back( Gtk::TargetEntry("LAYER") );
261         get_layer_tree_view().drag_dest_set(listTargets);
262
263         // This makes things easier to read.
264         get_layer_tree_view().set_rules_hint();
265
266         // Make us more sensitive to several events
267         //get_layer_tree_view().add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::BUTTON1_MOTION_MASK | Gdk::BUTTON2_MOTION_MASK|Gdk::POINTER_MOTION_MASK);
268
269         get_layer_tree_view().signal_event().connect(sigc::mem_fun(*this, &studio::LayerTree::on_layer_tree_event));
270         get_layer_tree_view().show();
271
272         Gtk::ScrolledWindow *scroll = manage(new class Gtk::ScrolledWindow());
273         scroll->set_flags(Gtk::CAN_FOCUS);
274         scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
275         //scroll->add(get_layer_tree_view());
276         scroll->set_shadow_type(Gtk::SHADOW_ETCHED_IN);
277         scroll->show();
278
279         return scroll;
280 }
281
282 Gtk::Widget*
283 LayerTree::create_param_tree()
284 {
285         Pango::AttrList attr_list;
286         {
287                 Pango::AttrInt pango_size(Pango::Attribute::create_attr_size(Pango::SCALE*8));
288                 pango_size.set_start_index(0);
289                 pango_size.set_end_index(64);
290                 attr_list.change(pango_size);
291         }
292
293         Gtk::IconSize icon_size(Gtk::ICON_SIZE_SMALL_TOOLBAR);
294
295         {       // --- N A M E --------------------------------------------------------
296                 Gtk::TreeView::Column* column = Gtk::manage( new Gtk::TreeView::Column(_("Name")) );
297
298                 // Set up the icon cell-renderer
299                 Gtk::CellRendererPixbuf* icon_cellrenderer = Gtk::manage( new Gtk::CellRendererPixbuf() );
300                 column->pack_start(*icon_cellrenderer,false);
301                 column->add_attribute(icon_cellrenderer->property_pixbuf(), param_model.icon);
302
303                 // Pack the label into the column
304                 //column->pack_start(layer_model.label,true);
305                 Gtk::CellRendererText* text_cellrenderer = Gtk::manage( new Gtk::CellRendererText() );
306                 column->pack_start(*text_cellrenderer,false);
307                 column->add_attribute(text_cellrenderer->property_text(), param_model.label);
308                 text_cellrenderer->property_attributes()=attr_list;
309
310                 text_cellrenderer->property_foreground()=Glib::ustring("#7f7f7f");
311                 column->add_attribute(text_cellrenderer->property_foreground_set(),param_model.is_inconsistent);
312
313                 // Pack the label into the column
314                 //column->pack_start(param_model.label,true);
315
316                 // Set up the value-node icon cell-renderer to be on the far right
317                 Gtk::CellRendererPixbuf* valuenode_icon_cellrenderer = Gtk::manage( new Gtk::CellRendererPixbuf() );
318                 column->pack_end(*valuenode_icon_cellrenderer,false);
319                 valuenode_icon_cellrenderer->property_pixbuf()=Gtk::Button().render_icon(Gtk::StockID("synfig-value_node"),icon_size);
320                 column->add_attribute(valuenode_icon_cellrenderer->property_visible(), param_model.is_shared);
321
322                 // Finish setting up the column
323                 column->set_reorderable();
324                 column->set_resizable();
325                 column->set_clickable();
326
327                 get_param_tree_view().append_column(*column);
328         }
329         {       // --- V A L U E  -----------------------------------------------------
330                 Gtk::TreeView::Column* column = Gtk::manage( new Gtk::TreeView::Column(_("Value")) );
331
332                 // Set up the value cell-renderer
333                 cellrenderer_value=LayerParamTreeStore::add_cell_renderer_value(column);
334                 cellrenderer_value->signal_edited().connect(sigc::mem_fun(*this, &studio::LayerTree::on_edited_value));
335                 cellrenderer_value->property_value()=synfig::ValueBase();
336                 column->add_attribute(cellrenderer_value->property_param_desc(), param_model.param_desc);
337                 column->add_attribute(cellrenderer_value->property_inconsistent(),param_model.is_inconsistent);
338                 //cellrenderer_value->property_canvas()=canvas_interface->get_canvas(); // Is this line necessary?
339                 cellrenderer_value->property_attributes()=attr_list;
340
341                 // Finish setting up the column
342                 get_param_tree_view().append_column(*column);
343                 column->set_sizing(Gtk::TREE_VIEW_COLUMN_AUTOSIZE);
344                 column->set_clickable();
345                 column->set_min_width(120);
346                 column->set_reorderable();
347                 column->set_resizable();
348         }
349         {       // --- T Y P E --------------------------------------------------------
350                 Gtk::TreeView::Column* column = Gtk::manage( new Gtk::TreeView::Column(_("Type")) );
351                 Gtk::CellRendererText* text_cellrenderer = Gtk::manage( new Gtk::CellRendererText() );
352                 column->pack_start(*text_cellrenderer,false);
353                 column->add_attribute(text_cellrenderer->property_text(), param_model.type);
354                 text_cellrenderer->property_attributes()=attr_list;
355                 get_param_tree_view().append_column(*column);
356                 column->set_reorderable();
357                 column->set_resizable();
358                 column->set_clickable();
359                 column->set_sort_column(param_model.type);
360         }
361         /*{     // --- T I M E   T R A C K --------------------------------------------
362                 Gtk::TreeView::Column* column = Gtk::manage( new Gtk::TreeView::Column(_("Time Track")) );
363                 column_time_track=column;
364
365                 // Set up the value-node cell-renderer
366                 cellrenderer_time_track=LayerParamTreeStore::add_cell_renderer_value_node(column);
367                 cellrenderer_time_track->property_mode()=Gtk::CELL_RENDERER_MODE_ACTIVATABLE;
368                 cellrenderer_time_track->signal_waypoint_clicked_cellrenderer().connect(sigc::mem_fun(*this, &studio::LayerTree::on_waypoint_clicked_layertree) );
369                 cellrenderer_time_track->signal_waypoint_changed().connect(sigc::mem_fun(*this, &studio::LayerTree::on_waypoint_changed) );
370                 column->add_attribute(cellrenderer_time_track->property_value_desc(), param_model.value_desc);
371                 column->add_attribute(cellrenderer_time_track->property_canvas(), param_model.canvas);
372                 //column->add_attribute(cellrenderer_time_track->property_visible(), model.is_value_node);
373
374                 //column->pack_start(*cellrenderer_time_track);
375
376                 // Finish setting up the column
377                 column->set_reorderable();
378                 column->set_resizable();
379                 column->set_min_width(200);
380                 //get_param_tree_view().append_column(*column);
381         }*/
382
383         // This makes things easier to read.
384         get_param_tree_view().set_rules_hint();
385
386         // Make us more sensitive to several events
387         get_param_tree_view().add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::BUTTON1_MOTION_MASK | Gdk::BUTTON2_MOTION_MASK|Gdk::POINTER_MOTION_MASK);
388
389         get_param_tree_view().signal_event().connect(sigc::mem_fun(*this, &studio::LayerTree::on_param_tree_event));
390         get_param_tree_view().show();
391
392         Gtk::ScrolledWindow *scroll = manage(new class Gtk::ScrolledWindow());
393         scroll->set_flags(Gtk::CAN_FOCUS);
394         scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
395         //scroll->add(get_param_tree_view());
396         scroll->set_shadow_type(Gtk::SHADOW_ETCHED_IN);
397         scroll->show();
398
399         //column_time_track->set_visible(false);
400
401         return scroll;
402 }
403
404 void
405 LayerTree::on_waypoint_changed( synfig::Waypoint waypoint , synfig::ValueNode::Handle value_node)
406 {
407         synfigapp::Action::ParamList param_list;
408         param_list.add("canvas",layer_tree_store_->canvas_interface()->get_canvas());
409         param_list.add("canvas_interface",layer_tree_store_->canvas_interface());
410         param_list.add("value_node",value_node);
411         param_list.add("waypoint",waypoint);
412 //      param_list.add("time",canvas_interface()->get_time());
413
414         etl::handle<studio::Instance>::cast_static(layer_tree_store_->canvas_interface()->get_instance())->process_action("waypoint_set_smart", param_list);
415 }
416
417 void
418 LayerTree::select_layer(synfig::Layer::Handle layer)
419 {
420         Gtk::TreeModel::Children::iterator iter;
421         if(layer_tree_store_->find_layer_row(layer,iter))
422         {
423                 if(sorted_layer_tree_store_)
424                         iter=sorted_layer_tree_store_->convert_child_iter_to_iter(iter);
425
426                 Gtk::TreePath path(iter);
427                 for(int i=path.get_depth();i;i--)
428                 {
429                         int j;
430                         path=Gtk::TreePath(iter);
431                         for(j=i;j;j--)
432                                 path.up();
433                         get_layer_tree_view().expand_row(path,false);
434                 }
435                 get_layer_tree_view().scroll_to_row(Gtk::TreePath(iter));
436                 get_layer_tree_view().get_selection()->select(iter);
437         }
438 }
439
440 void
441 LayerTree::select_all_children(Gtk::TreeModel::Children::iterator iter)
442 {
443         get_layer_tree_view().get_selection()->select(iter);
444         if((bool)(*iter)[layer_model.children_lock])
445                 return;
446         get_layer_tree_view().expand_row(layer_tree_store_->get_path(iter),false);
447         Gtk::TreeModel::Children children(iter->children());
448         for(iter=children.begin();iter!=children.end();++iter)
449                 select_all_children(iter);
450 }
451
452 void
453 LayerTree::select_all_children_layers(synfig::Layer::Handle layer)
454 {
455         Gtk::TreeModel::Children::iterator iter;
456         if(layer_tree_store_->find_layer_row(layer,iter))
457                 select_all_children(iter);
458 }
459
460 void
461 LayerTree::select_layers(const LayerList &layer_list)
462 {
463         LayerList::const_iterator iter;
464         for(iter = layer_list.begin(); iter != layer_list.end(); ++iter)
465                 select_layer(*iter);
466 }
467
468 static inline void __layer_grabber(const Gtk::TreeModel::iterator& iter, LayerTree::LayerList* ret)
469 {
470         const LayerTreeStore::Model layer_tree_model;
471         ret->push_back((Layer::Handle)(*iter)[layer_tree_model.layer]);
472 }
473
474 LayerTree::LayerList
475 LayerTree::get_selected_layers()const
476 {
477         Glib::RefPtr<Gtk::TreeSelection> selection=const_cast<Gtk::TreeView&>(get_layer_tree_view()).get_selection();
478
479         if(!selection)
480                 return LayerList();
481
482         LayerList ret;
483
484         selection->selected_foreach_iter(
485                 sigc::bind(
486                         sigc::ptr_fun(
487                                 &__layer_grabber
488                         ),
489                         &ret
490                 )
491         );
492
493         return ret;
494 }
495
496 synfig::Layer::Handle
497 LayerTree::get_selected_layer()const
498 {
499         LayerList layers(get_selected_layers());
500
501         if(layers.empty())
502                 return 0;
503
504         return *layers.begin();
505 }
506
507 void
508 LayerTree::clear_selected_layers()
509 {
510         get_layer_tree_view().get_selection()->unselect_all();
511 }
512
513 void
514 LayerTree::set_show_timetrack(bool x)
515 {
516         //column_time_track->set_visible(x);
517 //      column_time_track->set_visible(false);
518         column_z_depth->set_visible(x);
519 }
520
521 void
522 LayerTree::set_model(Glib::RefPtr<LayerTreeStore> layer_tree_store)
523 {
524         layer_tree_store_=layer_tree_store;
525
526         if(false)
527         {
528                 sorted_layer_tree_store_=Gtk::TreeModelSort::create(layer_tree_store);
529
530                 sorted_layer_tree_store_->set_default_sort_func(sigc::ptr_fun(&studio::LayerTreeStore::z_sorter));
531
532                 //sorted_store->set_sort_func(model.time.index(),sigc::mem_fun(&studio::KeyframeTreeStore::time_sorter));
533                 //sorted_store->set_sort_column(model.time.index(), Gtk::SORT_ASCENDING);
534
535                 get_layer_tree_view().set_model(sorted_layer_tree_store_);
536         }
537         else
538                 get_layer_tree_view().set_model(layer_tree_store_);
539
540         layer_tree_store_->canvas_interface()->signal_dirty_preview().connect(sigc::mem_fun(*this,&studio::LayerTree::on_dirty_preview));
541
542         //layer_tree_store_->canvas_interface()->signal_dirty_preview().connect(sigc::mem_fun(*this,&studio::LayerTree::on_dirty_preview));
543
544         layer_tree_store_->canvas_interface()->signal_time_changed().connect(
545                 sigc::mem_fun(
546                         &get_param_tree_view(),
547                         &Gtk::Widget::queue_draw
548                 )
549         );
550         if(!param_tree_store_)
551         {
552                 param_tree_store_=LayerParamTreeStore::create(layer_tree_store_->canvas_interface(), this);
553                 get_param_tree_view().set_model(param_tree_store_);
554         }
555
556 /*      if(cellrenderer_time_track && layer_tree_store_ && layer_tree_store_->canvas_interface())
557         {
558                 cellrenderer_time_track->set_canvas_interface(layer_tree_store_->canvas_interface());
559         }
560 */
561 }
562
563 void
564 LayerTree::set_time_adjustment(Gtk::Adjustment &adjustment)
565 {
566         //cellrenderer_time_track->set_adjustment(adjustment);
567         adjustment.signal_value_changed().connect(sigc::mem_fun(get_param_tree_view(),&Gtk::TreeView::queue_draw));
568         adjustment.signal_changed().connect(sigc::mem_fun(get_param_tree_view(),&Gtk::TreeView::queue_draw));
569 }
570
571 void
572 LayerTree::on_dirty_preview()
573 {
574 /*
575         if(quick_layer && !disable_amount_changed_signal)
576         {
577                 layer_amount_hscale->set_sensitive(true);
578                 disable_amount_changed_signal=true;
579                 layer_amount_adjustment_.set_value(quick_layer->get_param("amount").get(Real()));
580                 disable_amount_changed_signal=false;
581                 if(quick_layer->get_param("blend_method").is_valid())
582                 {
583                         blend_method_widget.set_sensitive(true);
584                         disable_amount_changed_signal=true;
585                         blend_method_widget.set_value(quick_layer->get_param("blend_method"));
586                         disable_amount_changed_signal=false;
587                 }
588         }
589 */
590 }
591
592 void
593 LayerTree::on_selection_changed()
594 {
595         synfigapp::SelectionManager::LayerList layer_list(get_selection_manager()->get_selected_layers());
596
597         Gtk::TreeIter iter;
598         if(last_top_selected_layer && !layer_tree_store_->find_layer_row(last_top_selected_layer,iter))
599         {
600                 if(layer_list.empty())
601                 {
602                         last_top_selected_layer=0;
603                         layer_tree_view_->get_selection()->select(last_top_selected_path);
604                         return;
605                 }
606         }
607
608         {
609                 if(!layer_list.empty())
610                 {
611                         last_top_selected_layer=layer_list.front();
612                         last_top_selected_path=*layer_tree_view_->get_selection()->get_selected_rows().begin();
613                 }
614                 else
615                 {
616                         last_top_selected_layer=0;
617                 }
618         }
619
620         if(layer_list.empty())
621         {
622                 button_raise->set_sensitive(false);
623                 button_lower->set_sensitive(false);
624                 button_duplicate->set_sensitive(false);
625                 button_encapsulate->set_sensitive(false);
626                 button_delete->set_sensitive(false);
627                 layer_amount_hscale->set_sensitive(false);
628                 blend_method_widget.set_sensitive(false);
629                 return;
630         }
631
632         button_raise->set_sensitive(true);
633         button_lower->set_sensitive(true);
634         button_duplicate->set_sensitive(true);
635         button_encapsulate->set_sensitive(true);
636         button_delete->set_sensitive(true);
637
638         if(layer_list.size()==1 && (*layer_list.begin())->get_param("amount").is_valid()&& (*layer_list.begin())->get_param("amount").same_type_as(Real()))
639         {
640                 quick_layer=*layer_list.begin();
641         }
642         else
643                 quick_layer=0;
644
645         if(quick_layer)
646         {
647                 layer_amount_hscale->set_sensitive(true);
648                 disable_amount_changed_signal=true;
649                 layer_amount_adjustment_.set_value(quick_layer->get_param("amount").get(Real()));
650                 disable_amount_changed_signal=false;
651                 if(quick_layer->get_param("blend_method").is_valid())
652                 {
653                         blend_method_widget.set_sensitive(true);
654                         disable_amount_changed_signal=true;
655                         blend_method_widget.set_value(quick_layer->get_param("blend_method"));
656                         disable_amount_changed_signal=false;
657                 }
658                 else
659                         blend_method_widget.set_sensitive(false);
660         }
661         else
662         {
663                 layer_amount_hscale->set_sensitive(false);
664                 blend_method_widget.set_sensitive(false);
665         }
666 }
667
668 void
669 LayerTree::on_blend_method_changed()
670 {
671         if(disable_amount_changed_signal)
672                 return;
673         if(!quick_layer)
674                 return;
675
676         if(quick_layer->get_param("blend_method").is_valid())
677         {
678                 disable_amount_changed_signal=true;
679                 signal_edited_value()(synfigapp::ValueDesc(quick_layer,"blend_method"),blend_method_widget.get_value());
680                 disable_amount_changed_signal=false;
681         }
682 }
683
684 void
685 LayerTree::on_amount_value_changed()
686 {
687         if(disable_amount_changed_signal)
688                 return;
689         if(!quick_layer)
690                 return;
691
692         disable_amount_changed_signal=true;
693         signal_edited_value()(synfigapp::ValueDesc(quick_layer,"amount"),synfig::ValueBase(layer_amount_adjustment_.get_value()));
694         disable_amount_changed_signal=false;
695 }
696
697 void
698 LayerTree::on_edited_value(const Glib::ustring&path_string,synfig::ValueBase value)
699 {
700         Gtk::TreePath path(path_string);
701
702         const Gtk::TreeRow row = *(get_param_tree_view().get_model()->get_iter(path));
703         if(!row)
704                 return;
705         row[param_model.value]=value;
706         //signal_edited_value()(row[param_model.value_desc],value);
707 }
708
709 void
710 LayerTree::on_layer_renamed(const Glib::ustring&path_string,const Glib::ustring& value)
711 {
712         Gtk::TreePath path(path_string);
713
714         const Gtk::TreeRow row = *(get_layer_tree_view().get_model()->get_iter(path));
715         if(!row)
716                 return;
717         row[layer_model.label]=value;
718         get_layer_tree_view().columns_autosize();
719 }
720
721 void
722 LayerTree::on_layer_toggle(const Glib::ustring& path_string)
723 {
724         Gtk::TreePath path(path_string);
725
726         const Gtk::TreeRow row = *(get_layer_tree_view().get_model()->get_iter(path));
727         bool active=static_cast<bool>(row[layer_model.active]);
728         row[layer_model.active]=!active;
729 }
730
731 void
732 LayerTree::on_waypoint_clicked_layertree(const etl::handle<synfig::Node>& node __attribute__ ((unused)),
733                                                                                  const synfig::Time& time __attribute__ ((unused)),
734                                                                                  const synfig::Time& time_offset __attribute__ ((unused)),
735                                                                                  int button __attribute__ ((unused)),
736                                                                                  synfig::Waypoint::Side side __attribute__ ((unused)))
737 {
738         //! \todo writeme
739
740         // synfigapp::ValueDesc value_desc;
741         // std::set<synfig::Waypoint, std::less<UniqueID> > waypoint_set;
742         // signal_waypoint_clicked_layertree()(value_desc,waypoint_set,button);
743 }
744
745 bool
746 LayerTree::on_layer_tree_event(GdkEvent *event)
747 {
748     switch(event->type)
749     {
750         case GDK_BUTTON_PRESS:
751                 {
752                         Gtk::TreeModel::Path path;
753                         Gtk::TreeViewColumn *column;
754                         int cell_x, cell_y;
755                         if(!get_layer_tree_view().get_path_at_pos(
756                                 int(event->button.x),int(event->button.y),      // x, y
757                                 path, // TreeModel::Path&
758                                 column, //TreeViewColumn*&
759                                 cell_x,cell_y //int&cell_x,int&cell_y
760                                 )
761                         ) break;
762                         const Gtk::TreeRow row = *(get_layer_tree_view().get_model()->get_iter(path));
763
764                         //if(column->get_first_cell_renderer()==cellrenderer_time_track)
765                         //      return signal_layer_user_click()(event->button.button,row,COLUMNID_TIME_TRACK);
766                         //else
767                                 if(column->get_first_cell_renderer()==cellrenderer_value)
768                                 return signal_layer_user_click()(event->button.button,row,COLUMNID_VALUE);
769                         else
770                                 return signal_layer_user_click()(event->button.button,row,COLUMNID_NAME);
771
772                 }
773                 break;
774
775         case GDK_MOTION_NOTIFY:
776                 {
777                         Gtk::TreeModel::Path path;
778                         Gtk::TreeViewColumn *column;
779                         int cell_x, cell_y;
780                         if(!get_layer_tree_view().get_path_at_pos(
781                                 (int)event->button.x,(int)event->button.y,      // x, y
782                                 path, // TreeModel::Path&
783                                 column, //TreeViewColumn*&
784                                 cell_x,cell_y //int&cell_x,int&cell_y
785                                 )
786                         ) break;
787
788                         if(!get_layer_tree_view().get_model()->get_iter(path))
789                                 break;
790
791                         Gtk::TreeRow row = *(get_layer_tree_view().get_model()->get_iter(path));
792
793                         /*
794                         if(cellrenderer_time_track==column->get_first_cell_renderer())
795                         {
796                                 // Movement on TimeLine
797                                 return true;
798                         }
799                         else
800                                 */
801                         if(last_tooltip_path.get_depth()<=0 || path!=last_tooltip_path)
802                         {
803                                 tooltips_.unset_tip(*this);
804                                 Glib::ustring tooltips_string(row[layer_model.tooltip]);
805                                 last_tooltip_path=path;
806                                 if(!tooltips_string.empty())
807                                 {
808                                         tooltips_.set_tip(*this,tooltips_string);
809                                         tooltips_.force_window();
810                                 }
811                         }
812                 }
813                 break;
814         case GDK_BUTTON_RELEASE:
815                 break;
816         default:
817                 break;
818         }
819         return false;
820 }
821
822 bool
823 LayerTree::on_param_tree_event(GdkEvent *event)
824 {
825     switch(event->type)
826     {
827         case GDK_BUTTON_PRESS:
828                 {
829                         Gtk::TreeModel::Path path;
830                         Gtk::TreeViewColumn *column;
831                         int cell_x, cell_y;
832                         if(!get_param_tree_view().get_path_at_pos(
833                                 int(event->button.x),int(event->button.y),      // x, y
834                                 path, // TreeModel::Path&
835                                 column, //TreeViewColumn*&
836                                 cell_x,cell_y //int&cell_x,int&cell_y
837                                 )
838                         ) break;
839                         const Gtk::TreeRow row = *(get_param_tree_view().get_model()->get_iter(path));
840
841 /*                      if(column && column->get_first_cell_renderer()==cellrenderer_time_track)
842                         {
843                                 Gdk::Rectangle rect;
844                                 get_param_tree_view().get_cell_area(path,*column,rect);
845                                 cellrenderer_time_track->property_value_desc()=row[param_model.value_desc];
846                                 cellrenderer_time_track->property_canvas()=row[param_model.canvas];
847                                 cellrenderer_time_track->activate(event,*this,path.to_string(),rect,rect,Gtk::CellRendererState());
848                                 get_param_tree_view().queue_draw_area(rect.get_x(),rect.get_y(),rect.get_width(),rect.get_height());
849                                 return true;
850                                 //return signal_param_user_click()(event->button.button,row,COLUMNID_TIME_TRACK);
851                         }
852                         else
853 */                      {
854                                 if(event->button.button==3)
855                                 {
856                                         LayerList layer_list(get_selected_layers());
857                                         if(layer_list.size()<=1)
858                                         {
859                                                 synfigapp::ValueDesc value_desc(row[param_model.value_desc]);
860                                                 Gtk::Menu* menu(manage(new Gtk::Menu()));
861                                                 menu->signal_hide().connect(sigc::bind(sigc::ptr_fun(&delete_widget), menu));
862                                                 App::get_instance(param_tree_store_->canvas_interface()->get_canvas())->make_param_menu(menu,param_tree_store_->canvas_interface()->get_canvas(),value_desc,0.5f);
863                                                 menu->popup(event->button.button,gtk_get_current_event_time());
864                                                 return true;
865                                         }
866                                         Gtk::Menu* menu(manage(new Gtk::Menu()));
867                                         menu->signal_hide().connect(sigc::bind(sigc::ptr_fun(&delete_widget), menu));
868                                         std::list<synfigapp::ValueDesc> value_desc_list;
869                                         ParamDesc param_desc(row[param_model.param_desc]);
870                                         for(;!layer_list.empty();layer_list.pop_back())
871                                                 value_desc_list.push_back(synfigapp::ValueDesc(layer_list.back(),param_desc.get_name()));
872                                         App::get_instance(param_tree_store_->canvas_interface()->get_canvas())->make_param_menu(menu,param_tree_store_->canvas_interface()->get_canvas(),value_desc_list);
873                                         menu->popup(event->button.button,gtk_get_current_event_time());
874                                         return true;
875                                 }
876                                 else
877                                 {
878                                         if(column->get_first_cell_renderer()==cellrenderer_value)
879                                                 return signal_param_user_click()(event->button.button,row,COLUMNID_VALUE);
880                                         else
881                                                 return signal_param_user_click()(event->button.button,row,COLUMNID_NAME);
882                                 }
883                         }
884                 }
885                 break;
886
887         case GDK_MOTION_NOTIFY:
888                 {
889                         Gtk::TreeModel::Path path;
890                         Gtk::TreeViewColumn *column;
891                         int cell_x, cell_y;
892                         if(!get_param_tree_view().get_path_at_pos(
893                                 (int)event->motion.x,(int)event->motion.y,      // x, y
894                                 path, // TreeModel::Path&
895                                 column, //TreeViewColumn*&
896                                 cell_x,cell_y //int&cell_x,int&cell_y
897                                 )
898                         ) break;
899
900                         if(!get_param_tree_view().get_model()->get_iter(path))
901                                 break;
902
903                         Gtk::TreeRow row = *(get_param_tree_view().get_model()->get_iter(path));
904
905 /*                      if((event->motion.state&GDK_BUTTON1_MASK ||event->motion.state&GDK_BUTTON3_MASK) && column && cellrenderer_time_track==column->get_first_cell_renderer())
906                         {
907                                 Gdk::Rectangle rect;
908                                 get_param_tree_view().get_cell_area(path,*column,rect);
909                                 cellrenderer_time_track->property_value_desc()=row[param_model.value_desc];
910                                 cellrenderer_time_track->property_canvas()=row[param_model.canvas];
911                                 cellrenderer_time_track->activate(event,*this,path.to_string(),rect,rect,Gtk::CellRendererState());
912                                 get_param_tree_view().queue_draw();
913                                 //get_param_tree_view().queue_draw_area(rect.get_x(),rect.get_y(),rect.get_width(),rect.get_height());
914                                 return true;
915                         }
916                         else
917 */                      if(last_tooltip_path.get_depth()<=0 || path!=last_tooltip_path)
918                         {
919                                 tooltips_.unset_tip(*this);
920                                 Glib::ustring tooltips_string(row[layer_model.tooltip]);
921                                 last_tooltip_path=path;
922                                 if(!tooltips_string.empty())
923                                 {
924                                         tooltips_.set_tip(*this,tooltips_string);
925                                         tooltips_.force_window();
926                                 }
927                         }
928                 }
929                 break;
930         case GDK_BUTTON_RELEASE:
931                 {
932                         Gtk::TreeModel::Path path;
933                         Gtk::TreeViewColumn *column;
934                         int cell_x, cell_y;
935                         if(!get_param_tree_view().get_path_at_pos(
936                                 (int)event->button.x,(int)event->button.y,      // x, y
937                                 path, // TreeModel::Path&
938                                 column, //TreeViewColumn*&
939                                 cell_x,cell_y //int&cell_x,int&cell_y
940                                 )
941                         ) break;
942
943                         if(!get_param_tree_view().get_model()->get_iter(path))
944                                 break;
945
946                         Gtk::TreeRow row = *(get_param_tree_view().get_model()->get_iter(path));
947
948 /*                      if(column && cellrenderer_time_track==column->get_first_cell_renderer())
949                         {
950                                 Gdk::Rectangle rect;
951                                 get_param_tree_view().get_cell_area(path,*column,rect);
952                                 cellrenderer_time_track->property_value_desc()=row[param_model.value_desc];
953                                 cellrenderer_time_track->property_canvas()=row[param_model.canvas];
954                                 cellrenderer_time_track->activate(event,*this,path.to_string(),rect,rect,Gtk::CellRendererState());
955                                 get_param_tree_view().queue_draw();
956                                 get_param_tree_view().queue_draw_area(rect.get_x(),rect.get_y(),rect.get_width(),rect.get_height());
957                                 return true;
958
959                         }
960 */
961                 }
962                 break;
963         default:
964                 break;
965         }
966         return false;
967 }
968
969 // void
970 // LayerTree::on_raise_pressed()
971 // {
972 //      synfigapp::Action::ParamList param_list;
973 //      param_list.add("time",layer_tree_store_->canvas_interface()->get_time());
974 //      param_list.add("canvas",layer_tree_store_->canvas_interface()->get_canvas());
975 //      param_list.add("canvas_interface",layer_tree_store_->canvas_interface());
976 //
977 //      {
978 //              synfigapp::SelectionManager::LayerList layer_list(get_selection_manager()->get_selected_layers());
979 //              synfigapp::SelectionManager::LayerList::iterator iter;
980 //
981 //              for(iter=layer_list.begin();iter!=layer_list.end();++iter)
982 //                      param_list.add("layer",Layer::Handle(*iter));
983 //      }
984 //      synfigapp::Action::Handle action(synfigapp::Action::create("layer_raise"));
985 //      action->set_param_list(param_list);
986 //      layer_tree_store_->canvas_interface()->get_instance()->perform_action(action);
987 // }
988
989 // void
990 // LayerTree::on_lower_pressed()
991 // {
992 //      synfigapp::Action::ParamList param_list;
993 //      param_list.add("time",layer_tree_store_->canvas_interface()->get_time());
994 //      param_list.add("canvas",layer_tree_store_->canvas_interface()->get_canvas());
995 //      param_list.add("canvas_interface",layer_tree_store_->canvas_interface());
996 //
997 //      {
998 //              synfigapp::SelectionManager::LayerList layer_list(get_selection_manager()->get_selected_layers());
999 //              synfigapp::SelectionManager::LayerList::iterator iter;
1000 //
1001 //              for(iter=layer_list.begin();iter!=layer_list.end();++iter)
1002 //                      param_list.add("layer",Layer::Handle(*iter));
1003 //      }
1004 //
1005 //      synfigapp::Action::Handle action(synfigapp::Action::create("layer_lower"));
1006 //      action->set_param_list(param_list);
1007 //      layer_tree_store_->canvas_interface()->get_instance()->perform_action(action);
1008 // }
1009
1010 // void
1011 // LayerTree::on_duplicate_pressed()
1012 // {
1013 //      synfigapp::Action::ParamList param_list;
1014 //      param_list.add("time",layer_tree_store_->canvas_interface()->get_time());
1015 //      param_list.add("canvas",layer_tree_store_->canvas_interface()->get_canvas());
1016 //      param_list.add("canvas_interface",layer_tree_store_->canvas_interface());
1017 //
1018 //      {
1019 //              synfigapp::SelectionManager::LayerList layer_list(get_selection_manager()->get_selected_layers());
1020 //              synfigapp::SelectionManager::LayerList::iterator iter;
1021 //
1022 //              for(iter=layer_list.begin();iter!=layer_list.end();++iter)
1023 //                      param_list.add("layer",Layer::Handle(*iter));
1024 //      }
1025 //
1026 //      synfigapp::Action::Handle action(synfigapp::Action::create("layer_duplicate"));
1027 //      action->set_param_list(param_list);
1028 //      layer_tree_store_->canvas_interface()->get_instance()->perform_action(action);
1029 // }
1030
1031 // void
1032 // LayerTree::on_encapsulate_pressed()
1033 // {
1034 //      synfigapp::Action::ParamList param_list;
1035 //      param_list.add("time",layer_tree_store_->canvas_interface()->get_time());
1036 //      param_list.add("canvas",layer_tree_store_->canvas_interface()->get_canvas());
1037 //      param_list.add("canvas_interface",layer_tree_store_->canvas_interface());
1038 //
1039 //      {
1040 //              synfigapp::SelectionManager::LayerList layer_list(get_selection_manager()->get_selected_layers());
1041 //              synfigapp::SelectionManager::LayerList::iterator iter;
1042 //
1043 //              for(iter=layer_list.begin();iter!=layer_list.end();++iter)
1044 //                      param_list.add("layer",Layer::Handle(*iter));
1045 //      }
1046 //
1047 //      synfigapp::Action::Handle action(synfigapp::Action::create("layer_encapsulate"));
1048 //      action->set_param_list(param_list);
1049 //      layer_tree_store_->canvas_interface()->get_instance()->perform_action(action);
1050 // }
1051
1052 // void
1053 // LayerTree::on_delete_pressed()
1054 // {
1055 //      synfigapp::Action::ParamList param_list;
1056 //      param_list.add("time",layer_tree_store_->canvas_interface()->get_time());
1057 //      param_list.add("canvas",layer_tree_store_->canvas_interface()->get_canvas());
1058 //      param_list.add("canvas_interface",layer_tree_store_->canvas_interface());
1059 //
1060 //      {
1061 //              synfigapp::SelectionManager::LayerList layer_list(get_selection_manager()->get_selected_layers());
1062 //              synfigapp::SelectionManager::LayerList::iterator iter;
1063 //
1064 //              for(iter=layer_list.begin();iter!=layer_list.end();++iter)
1065 //                      param_list.add("layer",Layer::Handle(*iter));
1066 //      }
1067 //
1068 //      synfigapp::Action::Handle action(synfigapp::Action::create("layer_remove"));
1069 //      action->set_param_list(param_list);
1070 //      layer_tree_store_->canvas_interface()->get_instance()->perform_action(action);
1071 // }
1072
1073 /*
1074 void
1075 LayerTree::on_drag_data_get(const Glib::RefPtr<Gdk::DragContext>&context, Gtk::SelectionData& selection_data, guint info, guint time)
1076 {
1077         synfig::info("Dragged data of type \"%s\"",selection_data.get_data_type());
1078         synfig::info("Dragged data of target \"%s\"",gdk_atom_name(selection_data->target));
1079         synfig::info("Dragged selection=\"%s\"",gdk_atom_name(selection_data->selection));
1080
1081         Gtk::TreeModel::Path path;
1082         Gtk::TreeViewColumn *column;
1083         int cell_x, cell_y;
1084         if(get_selection()
1085         Gtk::TreeRow row = *(get_selection()->get_selected());
1086
1087         if(synfig::String(gdk_atom_name(selection_data->target))=="LAYER" && (bool)row[model.is_layer])
1088         {
1089                 Layer* layer(((Layer::Handle)row[model.layer]).get());
1090                 assert(layer);
1091                 selection_data.set(8, reinterpret_cast<const guchar*>(&layer), sizeof(layer));
1092                 return;
1093         }
1094 }
1095
1096 void
1097 LayerTree::on_drop_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, Gtk::SelectionData& selection_data, guint info, guint time)
1098 {
1099         synfig::info("Dropped data of type \"%s\"",selection_data.get_data_type());
1100         synfig::info("Dropped data of target \"%s\"",gdk_atom_name(selection_data->target));
1101         synfig::info("Dropped selection=\"%s\"",gdk_atom_name(selection_data->selection));
1102         synfig::info("Dropped x=%d, y=%d",x,y);
1103         bool success=false;
1104         bool dropped_on_specific_row=false;
1105
1106         Gtk::TreeModel::Path path;
1107         Gtk::TreeViewColumn *column;
1108         int cell_x, cell_y;
1109         if(!get_path_at_pos(
1110                 x,y,    // x, y
1111                 path, // TreeModel::Path&
1112                 column, //TreeViewColumn*&
1113                 cell_x,cell_y //int&cell_x,int&cell_y
1114                 )
1115         )
1116         {
1117                 dropped_on_specific_row=false;
1118         }
1119         else
1120                 dropped_on_specific_row=true;
1121
1122         Gtk::TreeRow row = *(get_model()->get_iter(path));
1123
1124         if ((selection_data.get_length() >= 0) && (selection_data.get_format() == 8))
1125         {
1126                 if(synfig::String(selection_data.get_data_type())=="LAYER")do
1127                 {
1128                         Layer::Handle src(*reinterpret_cast<Layer**>(selection_data.get_data()));
1129                         assert(src);
1130
1131                         Canvas::Handle dest_canvas;
1132                         Layer::Handle dest_layer;
1133
1134                         if(dropped_on_specific_row)
1135                         {
1136                                 dest_canvas=(Canvas::Handle)(row[model.canvas]);
1137                                 dest_layer=(Layer::Handle)(row[model.layer]);
1138                                 assert(dest_canvas);
1139                         }
1140                         else
1141                                 dest_canvas=layer_tree_store_->canvas_interface()->get_canvas();
1142
1143                         // In this case, we are just moving.
1144                         if(dest_canvas==src->get_canvas())
1145                         {
1146                                 if(!dest_layer || dest_layer==src)
1147                                         break;
1148
1149                                 synfigapp::Action::Handle action(synfigapp::Action::create("layer_move"));
1150                                 action->set_param("canvas",dest_canvas);
1151                                 action->set_param("canvas_interface",layer_tree_store_->canvas_interface());
1152                                 action->set_param("layer",src);
1153                                 action->set_param("new_index",dest_canvas->get_depth(dest_layer));
1154                                 if(layer_tree_store_->canvas_interface()->get_instance()->perform_action(action))
1155                                         success=true;
1156                                 else
1157                                         success=false;
1158                                 break;
1159                         }
1160                 }while(0);
1161         }
1162
1163         // Finish the drag
1164         context->drag_finish(success, false, time);
1165 }
1166 */
1167
1168 /*bool
1169 LayerTree::on_drag_motion(const Glib::RefPtr<Gdk::DragContext>& context,int x, int    y, guint    time)
1170 {
1171         return get_layer_tree_view().on_drag_motion(context,x,y,time);
1172 }
1173
1174 void
1175 LayerTree::on_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, Gtk::SelectionData& selection_data, guint info, guint time)
1176 {
1177         get_layer_tree_view().on_drag_data_received(context,x,y,selection_data,info,time);
1178 */
1179 /*
1180         if(context->gobj()->source_window==context->gobj()->dest_window)
1181         {
1182                 Gtk::TreeView::on_drag_data_received(context,x,y,selection_data,info,time);
1183                 return;
1184         }
1185
1186         Gtk::TreeModel::Path path;
1187         Gtk::TreeViewColumn *column;
1188         int cell_x, cell_y;
1189         if(!get_path_at_pos(
1190                 x,y,    // x, y
1191                 path, // TreeModel::Path&
1192                 column, //TreeViewColumn*&
1193                 cell_x,cell_y //int&cell_x,int&cell_y
1194                 )
1195         )
1196         {
1197                 context->drag_finish(false, false, time);
1198         }
1199
1200         if(layer_tree_store_->row_drop_possible(path,selection_data))
1201         {
1202                 if(layer_tree_store_->drag_data_received(path,selection_data))
1203                         context->drag_finish(true, false, time);
1204         }
1205         context->drag_finish(false, false, time);
1206 }
1207 */