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