1 /* === S I N F G =========================================================== */
2 /*! \file childrentreestore.cpp
3 ** \brief Template File
5 ** $Id: childrentreestore.cpp,v 1.1.1.1 2005/01/07 03:34:36 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 "childrentreestore.h"
32 #include "iconcontroler.h"
33 #include <gtkmm/button.h>
34 #include <sinfg/paramdesc.h>
37 class Profiler : private etl::clock
39 const std::string name;
41 Profiler(const std::string& name):name(name) { reset(); }
42 ~Profiler() { float time(operator()()); sinfg::info("%s: took %f msec",name.c_str(),time*1000); }
47 /* === U S I N G =========================================================== */
51 using namespace sinfg;
52 using namespace studio;
54 /* === M A C R O S ========================================================= */
56 /* === G L O B A L S ======================================================= */
58 /* === P R O C E D U R E S ================================================= */
60 /* === M E T H O D S ======================================================= */
62 static ChildrenTreeStore::Model& ModelHack()
64 static ChildrenTreeStore::Model* model(0);
65 if(!model)model=new ChildrenTreeStore::Model;
69 ChildrenTreeStore::ChildrenTreeStore(etl::loose_handle<sinfgapp::CanvasInterface> canvas_interface_):
70 Gtk::TreeStore (ModelHack()),
71 CanvasTreeStore (canvas_interface_)
74 canvas_row[model.label]=_("Canvases");
75 canvas_row[model.is_canvas] = false;
76 canvas_row[model.is_value_node] = false;
78 value_node_row=*append();
79 value_node_row[model.label]=_("ValueBase Nodes");
80 value_node_row[model.is_canvas] = false;
81 value_node_row[model.is_value_node] = false;
83 // Connect all the signals
84 canvas_interface()->signal_value_node_changed().connect(sigc::mem_fun(*this,&studio::ChildrenTreeStore::on_value_node_changed));
85 canvas_interface()->signal_value_node_added().connect(sigc::mem_fun(*this,&studio::ChildrenTreeStore::on_value_node_added));
86 canvas_interface()->signal_value_node_deleted().connect(sigc::mem_fun(*this,&studio::ChildrenTreeStore::on_value_node_deleted));
87 canvas_interface()->signal_value_node_replaced().connect(sigc::mem_fun(*this,&studio::ChildrenTreeStore::on_value_node_replaced));
88 canvas_interface()->signal_canvas_added().connect(sigc::mem_fun(*this,&studio::ChildrenTreeStore::on_canvas_added));
89 canvas_interface()->signal_canvas_removed().connect(sigc::mem_fun(*this,&studio::ChildrenTreeStore::on_canvas_removed));
94 ChildrenTreeStore::~ChildrenTreeStore()
98 Glib::RefPtr<ChildrenTreeStore>
99 ChildrenTreeStore::create(etl::loose_handle<sinfgapp::CanvasInterface> canvas_interface_)
101 return Glib::RefPtr<ChildrenTreeStore>(new ChildrenTreeStore(canvas_interface_));
105 ChildrenTreeStore::rebuild()
107 Profiler profiler("ChildrenTreeStore::rebuild()");
108 rebuild_value_nodes();
113 ChildrenTreeStore::refresh()
115 Profiler profiler("ChildrenTreeStore::refresh()");
116 refresh_value_nodes();
121 ChildrenTreeStore::rebuild_value_nodes()
123 Gtk::TreeModel::Children children(value_node_row.children());
125 while(!children.empty())erase(children.begin());
127 clear_changed_queue();
130 canvas_interface()->get_canvas()->value_node_list().rbegin(), canvas_interface()->get_canvas()->value_node_list().rend(),
131 sigc::mem_fun(*this, &studio::ChildrenTreeStore::on_value_node_added)
136 ChildrenTreeStore::refresh_value_nodes()
138 Gtk::TreeModel::Children children(value_node_row.children());
140 Gtk::TreeModel::Children::iterator iter;
142 if(!children.empty())
143 for(iter = children.begin(); iter != children.end(); ++iter)
145 Gtk::TreeRow row=*iter;
152 ChildrenTreeStore::rebuild_canvases()
154 Gtk::TreeModel::Children children(canvas_row.children());
156 while(!children.empty())erase(children.begin());
159 canvas_interface()->get_canvas()->children().rbegin(), canvas_interface()->get_canvas()->children().rend(),
160 sigc::mem_fun(*this, &studio::ChildrenTreeStore::on_canvas_added)
165 ChildrenTreeStore::refresh_canvases()
171 ChildrenTreeStore::refresh_row(Gtk::TreeModel::Row &row, bool do_children)
173 CanvasTreeStore::refresh_row(row,false);
175 if((bool)row[model.is_value_node])
177 changed_set_.erase(row[model.value_node]);
183 ChildrenTreeStore::on_canvas_added(Canvas::Handle canvas)
185 Gtk::TreeRow row = *(prepend(canvas_row.children()));
187 row[model.icon] = Gtk::Button().render_icon(Gtk::StockID("sinfg-canvas"),Gtk::ICON_SIZE_SMALL_TOOLBAR);
188 row[model.id] = canvas->get_id();
189 row[model.name] = canvas->get_name();
191 if(!canvas->get_id().empty())
192 row[model.label] = canvas->get_id();
194 if(!canvas->get_name().empty())
195 row[model.label] = canvas->get_name();
197 row[model.label] = _("[Unnamed]");
199 row[model.canvas] = canvas;
200 row[model.type] = _("Canvas");
201 //row[model.is_canvas] = true;
202 //row[model.is_value_node] = false;
206 ChildrenTreeStore::on_canvas_removed(Canvas::Handle canvas)
212 ChildrenTreeStore::on_value_node_added(ValueNode::Handle value_node)
214 // if(value_node->get_id().find("Unnamed")!=String::npos)
217 Gtk::TreeRow row = *prepend(value_node_row.children());
219 set_row(row,sinfgapp::ValueDesc(canvas_interface()->get_canvas(),value_node->get_id()),false);
223 ChildrenTreeStore::on_value_node_deleted(etl::handle<ValueNode> value_node)
228 if(find_first_value_node(value_node,iter))
232 //rebuild_value_nodes();
236 ChildrenTreeStore::execute_changed_value_nodes()
238 Profiler profiler("ChildrenTreeStore::execute_changed_value_nodes()");
240 if(!replaced_set_.empty())
241 rebuild_value_nodes();
246 while(!changed_set_.empty())
248 ValueNode::Handle value_node(*changed_set_.begin());
249 changed_set_.erase(value_node);
258 if(!value_node->is_exported() && find_first_value_node(value_node,iter))
260 rebuild_value_nodes();
264 if(value_node->is_exported() && find_first_value_node(value_node,iter)) do
266 Gtk::TreeRow row(*iter);
269 }while(find_next_value_node(value_node,iter));
273 refresh_value_nodes();
280 rebuild_value_nodes();
284 // If we are taking too long...
287 refresh_value_nodes();
296 ChildrenTreeStore::on_value_node_changed(etl::handle<ValueNode> value_node)
299 if(value_node->get_name()=="constant" || !value_node->is_exported())
301 changed_connection.disconnect();
302 // if(!execute_changed_queued())
303 // changed_connection=Glib::signal_idle().connect(sigc::mem_fun(*this,&ChildrenTreeStore::execute_changed_value_nodes));
304 changed_connection=Glib::signal_timeout().connect(sigc::mem_fun(*this,&ChildrenTreeStore::execute_changed_value_nodes),150);
306 changed_set_.insert(value_node);
312 while(find_next_value_node(value_node,iter))
314 Gtk::TreeRow row(*iter);
320 refresh_value_nodes();
325 rebuild_value_nodes();
331 ChildrenTreeStore::on_value_node_replaced(sinfg::ValueNode::Handle replaced_value_node,sinfg::ValueNode::Handle new_value_node)
333 changed_connection.disconnect();
334 //if(!execute_changed_queued())
335 // changed_connection=Glib::signal_idle().connect(sigc::mem_fun(*this,&ChildrenTreeStore::execute_changed_value_nodes));
336 changed_connection=Glib::signal_timeout().connect(sigc::mem_fun(*this,&ChildrenTreeStore::execute_changed_value_nodes),150);
338 replaced_set_.insert(replaced_value_node);
342 ChildrenTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int column, const Glib::ValueBase& value)
344 if(column>=get_n_columns_vfunc())
346 g_warning("LayerTreeStore::set_value_impl: Bad column (%d)",column);
350 if(!g_value_type_compatible(G_VALUE_TYPE(value.gobj()),get_column_type_vfunc(column)))
352 g_warning("LayerTreeStore::set_value_impl: Bad value type");
358 if(column==model.value.index())
360 Glib::Value<sinfg::ValueBase> x;
361 g_value_init(x.gobj(),model.value.type());
362 g_value_copy(value.gobj(),x.gobj());
364 sinfgapp::ValueDesc value_desc((*iter)[model.value_desc]);
367 canvas_interface()->change_value(value_desc,x.get());
368 row_changed(get_path(*iter),*iter);
374 CanvasTreeStore::set_value_impl(iter,column, value);
376 catch(std::exception x)