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