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