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