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