1 /* === S I N F G =========================================================== */
2 /*! \file layertreestore.cpp
3 ** \brief Template File
5 ** $Id: layertreestore.cpp,v 1.2 2005/01/12 07:03:42 darco Exp $
8 ** Copyright (c) 2002 Robert B. Quattlebaum Jr.
10 ** This software and associated documentation
11 ** are CONFIDENTIAL and PROPRIETARY property of
12 ** the above-mentioned copyright holder.
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.
20 /* ========================================================================= */
22 /* === H E A D E R S ======================================================= */
31 #include "layertreestore.h"
32 #include "iconcontroler.h"
33 #include <gtkmm/button.h>
34 #include <sinfg/paramdesc.h>
35 #include <sinfgapp/action.h>
36 #include <sinfgapp/instance.h>
39 #include "iconcontroler.h"
40 #include <sinfgapp/action_system.h>
42 #include <gtk/gtkversion.h>
46 /* === U S I N G =========================================================== */
50 using namespace sinfg;
51 using namespace studio;
53 /* === M A C R O S ========================================================= */
55 /* === G L O B A L S ======================================================= */
57 /* === P R O C E D U R E S ================================================= */
59 /* === M E T H O D S ======================================================= */
61 static LayerTreeStore::Model& ModelHack()
63 static LayerTreeStore::Model* model(0);
64 if(!model)model=new LayerTreeStore::Model;
68 LayerTreeStore::LayerTreeStore(etl::loose_handle<sinfgapp::CanvasInterface> canvas_interface_):
69 Gtk::TreeStore (ModelHack()),
70 canvas_interface_ (canvas_interface_)
72 layer_icon=Gtk::Button().render_icon(Gtk::StockID("sinfg-layer"),Gtk::ICON_SIZE_SMALL_TOOLBAR);
74 // Connect Signals to Terminals
75 canvas_interface()->signal_layer_status_changed().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_status_changed));
76 canvas_interface()->signal_layer_lowered().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_lowered));
77 canvas_interface()->signal_layer_raised().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_raised));
78 canvas_interface()->signal_layer_removed().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_removed));
79 canvas_interface()->signal_layer_inserted().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_inserted));
80 canvas_interface()->signal_layer_moved().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_moved));
81 //canvas_interface()->signal_layer_param_changed().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_param_changed));
82 canvas_interface()->signal_layer_new_description().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_layer_new_description));
84 canvas_interface()->signal_time_changed().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::refresh));
86 //canvas_interface()->signal_value_node_changed().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_value_node_changed));
87 //canvas_interface()->signal_value_node_added().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_value_node_added));
88 //canvas_interface()->signal_value_node_deleted().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_value_node_deleted));
89 //canvas_interface()->signal_value_node_replaced().connect(sigc::mem_fun(*this,&studio::LayerTreeStore::on_value_node_replaced));
91 set_default_sort_func(sigc::ptr_fun(index_sorter));
96 LayerTreeStore::~LayerTreeStore()
98 sinfg::info("LayerTreeStore::~LayerTreeStore()q: Deleted");
103 LayerTreeStore::z_sorter(const Gtk::TreeModel::iterator &rhs,const Gtk::TreeModel::iterator &lhs)
107 float diff((float)(*rhs)[model.z_depth]-(float)(*lhs)[model.z_depth]);
117 LayerTreeStore::index_sorter(const Gtk::TreeModel::iterator &rhs,const Gtk::TreeModel::iterator &lhs)
121 return ((int)(*rhs)[model.index]-(int)(*lhs)[model.index]);
125 LayerTreeStore::search_func(const Glib::RefPtr<TreeModel>&,int,const Glib::ustring& x,const TreeModel::iterator& iter)
129 Glib::ustring substr(x.uppercase());
130 Glib::ustring label((*iter)[model.label]);
131 label=label.uppercase();
133 return label.find(substr)==Glib::ustring::npos;
137 Glib::RefPtr<LayerTreeStore>
138 LayerTreeStore::create(etl::loose_handle<sinfgapp::CanvasInterface> canvas_interface_)
140 return Glib::RefPtr<LayerTreeStore>(new LayerTreeStore(canvas_interface_));
144 LayerTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int column, Glib::ValueBase& value)const
146 if(column==model.index.index())
148 sinfg::Layer::Handle layer((*iter)[model.layer]);
153 g_value_init(x.gobj(),x.value_type());
155 x.set(layer->get_depth());
157 g_value_init(value.gobj(),x.value_type());
158 g_value_copy(x.gobj(),value.gobj());
161 if(column==model.z_depth.index())
163 sinfg::Layer::Handle layer((*iter)[model.layer]);
167 Glib::Value<float> x;
168 g_value_init(x.gobj(),x.value_type());
170 x.set(layer->get_z_depth(canvas_interface()->get_time())*1.0001+layer->get_depth());
172 g_value_init(value.gobj(),x.value_type());
173 g_value_copy(x.gobj(),value.gobj());
176 if(column==model.children_lock.index())
178 sinfg::Layer::Handle layer((*iter)[model.layer]);
183 g_value_init(x.gobj(),x.value_type());
186 ValueBase v(layer->get_param("children_lock"));
187 if(v.same_as(bool()))
188 x.set(v.get(bool()));
190 g_value_init(value.gobj(),x.value_type());
191 g_value_copy(x.gobj(),value.gobj());
194 if(column==model.label.index())
196 sinfg::Layer::Handle layer((*iter)[model.layer]);
200 Glib::Value<Glib::ustring> x;
201 g_value_init(x.gobj(),x.value_type());
204 if(!layer->get_description().empty())
205 x.set(layer->get_description());
207 x.set(layer->get_local_name());
209 g_value_init(value.gobj(),x.value_type());
210 //g_value_copy(x.gobj(),value.gobj());
214 if(column==model.tooltip.index())
216 sinfg::Layer::Handle layer((*iter)[model.layer]);
220 Glib::Value<Glib::ustring> x;
221 g_value_init(x.gobj(),x.value_type());
224 x.set(layer->get_local_name());
226 g_value_init(value.gobj(),x.value_type());
227 //g_value_copy(x.gobj(),value.gobj());
231 if(column==model.canvas.index())
233 sinfg::Layer::Handle layer((*iter)[model.layer]);
237 Glib::Value<Canvas::Handle> x;
238 g_value_init(x.gobj(),x.value_type());
241 x.set(layer->get_canvas());
243 g_value_init(value.gobj(),x.value_type());
244 //g_value_copy(x.gobj(),value.gobj());
248 if(column==model.active.index())
250 sinfg::Layer::Handle layer((*iter)[model.layer]);
255 g_value_init(x.gobj(),x.value_type());
257 x.set(layer->active());
259 g_value_init(value.gobj(),x.value_type());
260 g_value_copy(x.gobj(),value.gobj());
263 if(column==model.icon.index())
265 sinfg::Layer::Handle layer((*iter)[model.layer]);
268 Glib::Value<Glib::RefPtr<Gdk::Pixbuf> > x;
269 g_value_init(x.gobj(),x.value_type());
272 x.set(get_tree_pixbuf_layer(layer->get_name()));
274 g_value_init(value.gobj(),x.value_type());
275 g_value_copy(x.gobj(),value.gobj());
278 Gtk::TreeStore::get_value_vfunc(iter,column,value);
282 LayerTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int column, const Glib::ValueBase& value)
284 //if(!iterator_sane(row))
287 if(column>=get_n_columns_vfunc())
289 g_warning("LayerTreeStore::set_value_impl: Bad column (%d)",column);
293 if(!g_value_type_compatible(G_VALUE_TYPE(value.gobj()),get_column_type_vfunc(column)))
295 g_warning("LayerTreeStore::set_value_impl: Bad value type");
301 if(column==model.label.index())
303 Glib::Value<Glib::ustring> x;
304 g_value_init(x.gobj(),model.label.type());
305 g_value_copy(value.gobj(),x.gobj());
307 sinfg::Layer::Handle layer((*iter)[model.layer]);
310 sinfg::String new_desc(x.get());
312 if(new_desc==layer->get_local_name())
313 new_desc=sinfg::String();
315 if(new_desc==layer->get_description())
318 sinfgapp::Action::Handle action(sinfgapp::Action::create("layer_set_desc"));
323 action->set_param("canvas",canvas_interface()->get_canvas());
324 action->set_param("canvas_interface",canvas_interface());
325 action->set_param("layer",layer);
326 action->set_param("new_description",sinfg::String(x.get()));
328 canvas_interface()->get_instance()->perform_action(action);
332 if(column==model.active.index())
334 sinfg::Layer::Handle layer((*iter)[model.layer]);
339 g_value_init(x.gobj(),model.active.type());
340 g_value_copy(value.gobj(),x.gobj());
342 sinfgapp::Action::Handle action(sinfgapp::Action::create("layer_activate"));
347 action->set_param("canvas",canvas_interface()->get_canvas());
348 action->set_param("canvas_interface",canvas_interface());
349 action->set_param("layer",layer);
350 action->set_param("new_status",bool(x.get()));
352 canvas_interface()->get_instance()->perform_action(action);
356 Gtk::TreeStore::set_value_impl(iter,column, value);
359 catch(std::exception x)
369 LayerTreeStore::row_draggable_vfunc (const TreeModel::Path& path)const
371 //if(!get_iter(path)) return false;
372 // Gtk::TreeModel::Row row(*get_iter(path));
375 // return (bool)true;
379 LayerTreeStore::drag_data_get_vfunc (const TreeModel::Path& path, Gtk::SelectionData& selection_data)const
381 if(!const_cast<LayerTreeStore*>(this)->get_iter(path)) return false;
382 //sinfg::info("Dragged data of type \"%s\"",selection_data.get_data_type());
383 //sinfg::info("Dragged data of target \"%s\"",gdk_atom_name(selection_data->target));
384 //sinfg::info("Dragged selection=\"%s\"",gdk_atom_name(selection_data->selection));
386 Gtk::TreeModel::Row row(*const_cast<LayerTreeStore*>(this)->get_iter(path));
390 Layer* layer(((Layer::Handle)row[model.layer]).get());
392 bool included(false);
394 //gtk_selection_data_set (selection_data, gdk_atom_intern("LAYER",false), 8, reinterpret_cast<const guchar*>(&layer), sizeof(layer));
396 std::vector<Layer*> layers;
397 // The following is a hack for multiple row DND
399 sinfgapp::SelectionManager::LayerList bleh(get_canvas_interface()->get_selection_manager()->get_selected_layers());
402 selection_data.set("LAYER", 8, reinterpret_cast<const guchar*>(&layer), sizeof(layer));
407 if(bleh.back().get()==layer)
409 layers.push_back(bleh.back().get());
414 layers.push_back(layer);
415 selection_data.set("LAYER", 8, reinterpret_cast<const guchar*>(&layers.front()), sizeof(void*)*layers.size());
423 LayerTreeStore::drag_data_delete_vfunc (const TreeModel::Path& path)
429 LayerTreeStore::row_drop_possible_vfunc (const TreeModel::Path& dest, const Gtk::SelectionData& selection_data)const
431 //if(!const_cast<LayerTreeStore*>(this)->get_iter(dest)) return false;
433 //sinfg::info("possible_drop -- data of type \"%s\"",selection_data.get_data_type());
434 //sinfg::info("possible_drop -- data of target \"%s\"",gdk_atom_name(selection_data->target));
435 //sinfg::info("possible_drop -- selection=\"%s\"",gdk_atom_name(selection_data->selection));
437 //Gtk::TreeModel::Row row(*get_iter(dest));
439 if(sinfg::String(selection_data.get_data_type())=="LAYER" && (bool)true)
441 //Layer::Handle src(reinterpret_cast<Layer**>(const_cast<guint8*>(selection_data.get_data()))[i]);
445 TreeModel::Path dest_parent(dest);
446 if(!dest_parent.up() || dest.get_depth()==1)
448 //row=(*get_iter(dest));
449 //dest_canvas=(Canvas::Handle)(row[model.canvas]);
454 if((bool)const_cast<LayerTreeStore*>(this)->get_iter(dest_parent))
455 return (bool)(Canvas::Handle)(*const_cast<LayerTreeStore*>(this)->get_iter(dest_parent))[model.contained_canvas];
464 LayerTreeStore::drag_data_received_vfunc (const TreeModel::Path& dest, const Gtk::SelectionData& selection_data)
467 //if(!dest_parent.up() || !get_iter(dest)) return false;
473 //sinfg::info("Dropped data of type \"%s\"",selection_data.get_data_type());
474 //sinfg::info("Dropped data of target \"%s\"",gdk_atom_name(selection_data->target));
475 //sinfg::info("Dropped selection=\"%s\"",gdk_atom_name(selection_data->selection));
476 sinfgapp::Action::PassiveGrouper passive_grouper(canvas_interface()->get_instance().get(),_("Move Layers"));
478 // Save the selection data
479 sinfgapp::SelectionManager::LayerList selected_layer_list=canvas_interface()->get_selection_manager()->get_selected_layers();
481 if ((selection_data.get_length() >= 0) && (selection_data.get_format() == 8))
483 Gtk::TreeModel::Row row;
484 Canvas::Handle dest_canvas;
486 int dest_layer_depth=dest.back();
488 TreeModel::Path dest_parent(dest);
489 if(!dest_parent.up() || !get_iter(dest_parent))
491 TreeModel::Path dest(dest);
499 row=(*get_iter(dest));
500 dest_canvas=(Canvas::Handle)(row[model.canvas]);
505 row=(*get_iter(dest_parent));
506 dest_canvas=row[model.contained_canvas];
511 Layer::Handle dest_layer(row[model.layer]);
513 if(sinfg::String(selection_data.get_data_type())=="LAYER")for(unsigned int i=0;i<selection_data.get_length()/sizeof(void*);i++)
515 //sinfg::info("dest_layer_depth=%d",dest_layer_depth);
517 Layer::Handle src(reinterpret_cast<Layer**>(const_cast<guint8*>(selection_data.get_data()))[i]);
522 if(dest_canvas==src->get_canvas() && src->get_depth()<dest_layer_depth)
527 // In this case, we are just moving.
528 // if(dest_canvas==src->get_canvas())
530 //if(dest_canvas==src->get_canvas() && dest_layer_depth && dest_layer_depth>src->get_depth())
531 // dest_layer_depth--;
532 if(dest_canvas==src->get_canvas() && dest_layer_depth==src->get_depth())
535 sinfgapp::Action::Handle action(sinfgapp::Action::create("layer_move"));
536 action->set_param("canvas",dest_canvas);
537 action->set_param("canvas_interface",canvas_interface());
538 action->set_param("layer",src);
539 action->set_param("new_index",dest_layer_depth);
540 action->set_param("dest_canvas",dest_canvas);
541 if(canvas_interface()->get_instance()->perform_action(action))
549 passive_grouper.cancel();
554 /*else // In this case we need to remove and then add
557 sinfgapp::Action::Handle action;
558 action=sinfgapp::Action::create("layer_remove");
559 action->set_param("canvas",Canvas::Handle(src->get_canvas()));
560 if(!action->set_param("canvas_interface",App::get_instance(src->get_canvas())->find_canvas_interface(src->get_canvas())))
561 action->set_param("canvas_interface",canvas_interface());
562 action->set_param("layer",src);
563 if(!canvas_interface()->get_instance()->perform_action(action))
565 passive_grouper.cancel();
570 action=sinfgapp::Action::create("layer_add");
571 action->set_param("canvas",dest_canvas);
572 action->set_param("canvas_interface",canvas_interface());
573 action->set_param("new",src);
574 if(!canvas_interface()->get_instance()->perform_action(action))
576 passive_grouper.cancel();
581 if(dest_layer_depth!=0)
583 action=sinfgapp::Action::create("layer_move");
584 action->set_param("canvas",dest_canvas);
585 action->set_param("canvas_interface",canvas_interface());
586 action->set_param("layer",src);
587 action->set_param("new_index",dest_layer_depth);
588 if(!canvas_interface()->get_instance()->perform_action(action))
590 passive_grouper.cancel();
600 sinfg::info("I suposidly moved %d layers",i);
602 // Reselect the previously selected layers
603 canvas_interface()->get_selection_manager()->set_selected_layers(selected_layer_list);
615 LayerTreeStore::rebuild()
617 //etl::clock timer;timer.reset();
619 //sinfg::warning("---------rebuilding layer table---------");
620 // Save the selection data
621 sinfgapp::SelectionManager::LayerList layer_list=canvas_interface()->get_selection_manager()->get_selected_layers();
623 // Clear out the current list
626 // Go ahead and and add all the layers
628 canvas_interface()->get_canvas()->rbegin(), canvas_interface()->get_canvas()->rend(),
629 sigc::mem_fun(*this, &studio::LayerTreeStore::on_layer_added)
632 // Reselect the previously selected layers
633 if(!layer_list.empty())
634 canvas_interface()->get_selection_manager()->set_selected_layers(layer_list);
636 //sinfg::info("LayerTreeStore::rebuild() took %f seconds",float(timer()));
640 LayerTreeStore::refresh()
642 etl::clock timer;timer.reset();
644 Gtk::TreeModel::Children children_(children());
646 Gtk::TreeModel::Children::iterator iter;
648 if(!children_.empty())
649 for(iter = children_.begin(); iter && iter != children_.end(); ++iter)
651 Gtk::TreeRow row=*iter;
654 //sinfg::info("LayerTreeStore::refresh() took %f seconds",float(timer()));
658 LayerTreeStore::refresh_row(Gtk::TreeModel::Row &row)
660 Layer::Handle layer=row[model.layer];
663 row[model.name] = layer->get_local_name();
664 if(layer->get_description().empty())
666 row[model.label] = layer->get_local_name();
667 row[model.tooltip] = Glib::ustring("Layer");
671 row[model.label] = layer->get_description();
672 row[model.tooltip] = layer->get_local_name();
677 if(layer->dynamic_param_list().count("z_depth"))
678 row[model.z_depth]=Time::begin();
679 // row_changed(get_path(row),row);
681 Gtk::TreeModel::Children children = row.children();
682 Gtk::TreeModel::Children::iterator iter;
684 if(!children.empty())
685 for(iter = children.begin(); iter && iter != children.end(); ++iter)
687 Gtk::TreeRow row=*iter;
694 LayerTreeStore::set_row_layer(Gtk::TreeRow &row,sinfg::Layer::Handle &handle)
696 //row[model.id] = handle->get_name();
697 //row[model.name] = handle->get_local_name();
698 /*if(handle->get_description().empty())
700 //row[model.label] = handle->get_local_name();
701 row[model.tooltip] = Glib::ustring("Layer");
705 //row[model.label] = handle->get_description();
706 row[model.tooltip] = handle->get_local_name();
709 //row[model.active] = handle->active();
710 row[model.layer] = handle;
711 //row[model.canvas] = handle->get_canvas();
712 //row[model.icon] = layer_icon;
714 sinfg::Layer::ParamList paramlist=handle->get_param_list();
716 sinfg::Layer::Vocab vocab=handle->get_param_vocab();
717 sinfg::Layer::Vocab::iterator iter;
719 for(iter=vocab.begin();iter!=vocab.end();++iter)
721 if(iter->get_hidden())
723 if(handle->get_param(iter->get_name()).get_type()!=ValueBase::TYPE_CANVAS)
727 Canvas::Handle canvas;
728 canvas=handle->get_param(iter->get_name()).get(canvas);
732 Canvas::reverse_iterator iter;
733 row[model.contained_canvas]=canvas;
735 for(iter=canvas->rbegin();iter!=canvas->rend();++iter)
737 Gtk::TreeRow row_(*(prepend(row.children())));
738 set_row_layer(row_,*iter);
745 etl::handle<ValueNode> value_node;
746 if(handle.constant()->dynamic_param_list().count(iter->get_name()))
747 value_node=handle->dynamic_param_list()[iter->get_name()];
749 Gtk::TreeRow child_row = *(append(row.children()));
754 iter->get_local_name(),
755 paramlist[iter->get_name()],
764 LayerTreeStore::on_layer_added(sinfg::Layer::Handle layer)
768 if(canvas_interface()->get_canvas()==layer->get_canvas())
774 Gtk::TreeModel::Children::iterator iter;
775 if(!find_canvas_row(layer->get_canvas(),iter))
780 row=*(prepend(iter->children()));
782 set_row_layer(row,layer);
786 LayerTreeStore::on_layer_removed(sinfg::Layer::Handle handle)
788 Gtk::TreeModel::Children::iterator iter;
789 if(find_layer_row(handle,iter))
793 sinfg::error("LayerTreeStore::on_layer_removed():Unable to find layer to be removed, forced to rebuild...");
799 LayerTreeStore::on_layer_inserted(sinfg::Layer::Handle handle,int depth)
803 on_layer_added(handle);
808 Gtk::TreeModel::Children children_(children());
809 if(canvas_interface()->get_canvas()!=handle->get_canvas())
811 Gtk::TreeModel::Children::iterator iter;
812 if(!find_canvas_row(handle->get_canvas(),iter))
814 sinfg::error("LayerTreeStore::on_layer_inserted():Unable to find canvas row, forced to rebuild...");
818 children_=iter->children();
821 Gtk::TreeModel::Children::iterator iter(children_.begin());
822 while(depth-- && iter)
825 if(!iter || iter==children_.end())
827 sinfg::error("LayerTreeStore::on_layer_inserted():Unable to achieve desired depth, forced to rebuild...");
833 Gtk::TreeModel::Row row(*insert(iter));
834 set_row_layer(row,handle);
839 LayerTreeStore::on_layer_status_changed(sinfg::Layer::Handle handle,bool x)
841 Gtk::TreeModel::Children::iterator iter;
842 if(find_layer_row(handle,iter))
843 (*iter)[model.layer]=handle;
846 sinfg::warning("Couldn't find layer to be activated in layer list. Rebuilding index...");
852 LayerTreeStore::on_layer_lowered(sinfg::Layer::Handle layer)
854 Gtk::TreeModel::Children::iterator iter, iter2;
855 if(find_layer_row(layer,iter))
857 // Save the selection data
858 //sinfgapp::SelectionManager::LayerList layer_list=canvas_interface()->get_selection_manager()->get_selected_layers();
867 //Gtk::TreeModel::Row row(*iter);
868 Gtk::TreeModel::Row row2 = *iter2;
869 sinfg::Layer::Handle layer2=row2[model.layer];
873 set_row_layer(row2,layer2);
881 LayerTreeStore::on_layer_raised(sinfg::Layer::Handle layer)
883 Gtk::TreeModel::Children::iterator iter, iter2;
885 Gtk::TreeModel::Children children_(children());
887 if(find_layer_row_(layer, canvas_interface()->get_canvas(), children_, iter,iter2))
891 //Gtk::TreeModel::Row row = *iter;
892 Gtk::TreeModel::Row row2 = *iter2;
893 sinfg::Layer::Handle layer2=row2[model.layer];
898 set_row_layer(row2,layer2);
908 LayerTreeStore::on_layer_moved(sinfg::Layer::Handle layer,int depth, sinfg::Canvas::Handle canvas)
910 on_layer_removed(layer);
911 on_layer_inserted(layer,depth);
915 LayerTreeStore::on_layer_param_changed(sinfg::Layer::Handle handle,sinfg::String param_name)
917 if(param_name=="z_depth")
919 Gtk::TreeModel::Children::iterator iter;
920 if(find_layer_row(handle,iter))
922 (*iter)[model.z_depth]=Time::begin();
928 Gtk::TreeModel::Children::iterator iter;
929 if(find_layer_row(handle,iter))
932 Gtk::TreeModel::Children children(iter->children());
934 for(iter = children.begin(); iter && iter != children.end(); ++iter)
936 if((Glib::ustring)(*iter)[model.param_name]==param_name)
939 Gtk::TreeRow row=*iter;
951 LayerTreeStore::on_layer_new_description(sinfg::Layer::Handle handle,sinfg::String desc)
953 Gtk::TreeModel::Children::iterator iter;
954 if(find_layer_row(handle,iter))
956 Gtk::TreeRow row(*iter);
958 Layer::Handle layer(row[model.layer]);
962 //row[model.label]=layer->get_local_name();
963 row[model.tooltip]=Glib::ustring(_("Layer"));
966 //row[model.label]=layer->get_description();
967 row[model.tooltip]=layer->get_local_name();
976 LayerTreeStore::find_canvas_row_(sinfg::Canvas::Handle canvas, sinfg::Canvas::Handle parent, Gtk::TreeModel::Children layers, Gtk::TreeModel::Children::iterator &iter)
982 for(iter=layers.begin(); iter && iter != layers.end(); ++iter)
984 Gtk::TreeModel::Row row = *iter;
985 if(canvas==(sinfg::Canvas::Handle)row[model.contained_canvas])
989 iter=children().end();
993 Gtk::TreeModel::Children::iterator iter2;
994 //Gtk::TreeModel::Children::iterator iter3;
996 for(iter2 = layers.begin(); iter2 && iter2 != layers.end(); ++iter2)
998 Gtk::TreeModel::Row row = *iter2;
1001 if(row.children().empty())
1004 Canvas::Handle sub_canvas((*row.children().begin())[model.canvas]);
1008 if(find_canvas_row_(canvas,sub_canvas,iter2->children(),iter))
1012 iter=children().end();
1017 LayerTreeStore::find_canvas_row(sinfg::Canvas::Handle canvas, Gtk::TreeModel::Children::iterator &iter)
1019 return find_canvas_row_(canvas,canvas_interface()->get_canvas(),children(),iter);
1024 LayerTreeStore::find_layer_row_(const sinfg::Layer::Handle &layer, sinfg::Canvas::Handle canvas, Gtk::TreeModel::Children layers, Gtk::TreeModel::Children::iterator &iter, Gtk::TreeModel::Children::iterator &prev)
1028 //if(layer->get_canvas()==canvas)
1030 for(iter=prev=layers.begin(); iter && iter != layers.end(); prev=iter++)
1032 Gtk::TreeModel::Row row = *iter;
1033 if(layer==(sinfg::Layer::Handle)row[model.layer])
1037 iter=children().end();
1042 Gtk::TreeModel::Children::iterator iter2;
1044 for(iter2 = layers.begin(); iter2 && iter2 != layers.end(); ++iter2)
1046 Gtk::TreeModel::Row row = *iter2;
1049 if(row.children().empty())
1052 Canvas::Handle canvas((*row.children().begin())[model.canvas]);
1056 if(find_layer_row_(layer,canvas,iter2->children(),iter,prev))
1060 iter=children().end();
1065 LayerTreeStore::find_layer_row(const sinfg::Layer::Handle &layer, Gtk::TreeModel::Children::iterator &iter)
1067 Gtk::TreeModel::Children::iterator prev;
1068 return find_layer_row_(layer,canvas_interface()->get_canvas(),children(),iter,prev);
1072 LayerTreeStore::find_prev_layer_row(const sinfg::Layer::Handle &layer, Gtk::TreeModel::Children::iterator &prev)
1074 Gtk::TreeModel::Children::iterator iter;
1075 if(!find_layer_row_(layer,canvas_interface()->get_canvas(),children(),iter,prev))
1077 if(iter==children().begin())