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