/*! \file layertreestore.cpp
** \brief Template File
**
-** $Id: layertreestore.cpp,v 1.2 2005/01/12 07:03:42 darco Exp $
+** $Id$
**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2008 Chris Moore
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
#endif
#include "layertreestore.h"
-#include "iconcontroler.h"
+#include "iconcontroller.h"
#include <gtkmm/button.h>
#include <synfig/paramdesc.h>
#include <synfigapp/action.h>
#include <synfigapp/instance.h>
#include "app.h"
#include "instance.h"
-#include "iconcontroler.h"
+#include <synfig/layer_pastecanvas.h>
#include <synfigapp/action_system.h>
#include <gtk/gtkversion.h>
#include <ETL/clock>
+#include "general.h"
+
#endif
/* === U S I N G =========================================================== */
LayerTreeStore::LayerTreeStore(etl::loose_handle<synfigapp::CanvasInterface> canvas_interface_):
Gtk::TreeStore (ModelHack()),
+ queued (false),
canvas_interface_ (canvas_interface_)
{
layer_icon=Gtk::Button().render_icon(Gtk::StockID("synfig-layer"),Gtk::ICON_SIZE_SMALL_TOOLBAR);
LayerTreeStore::~LayerTreeStore()
{
- synfig::info("LayerTreeStore::~LayerTreeStore()q: Deleted");
-
+ if (getenv("SYNFIG_DEBUG_DESTRUCTORS"))
+ synfig::info("LayerTreeStore::~LayerTreeStore(): Deleted");
}
int
g_value_init(value.gobj(),x.value_type());
g_value_copy(x.gobj(),value.gobj());
}
- else
- if(column==model.z_depth.index())
+ else if(column==model.z_depth.index())
{
synfig::Layer::Handle layer((*iter)[model.layer]);
g_value_init(value.gobj(),x.value_type());
g_value_copy(x.gobj(),value.gobj());
}
- else
- if(column==model.children_lock.index())
+ else if(column==model.children_lock.index())
{
synfig::Layer::Handle layer((*iter)[model.layer]);
x.set(false);
ValueBase v(layer->get_param("children_lock"));
- if(v.same_as(bool()))
+ if(v.same_type_as(bool()))
x.set(v.get(bool()));
g_value_init(value.gobj(),x.value_type());
g_value_copy(x.gobj(),value.gobj());
}
- else
- if(column==model.label.index())
+ else if(column==model.label.index())
{
synfig::Layer::Handle layer((*iter)[model.layer]);
Glib::Value<Glib::ustring> x;
g_value_init(x.gobj(),x.value_type());
-
- if(!layer->get_description().empty())
- x.set(layer->get_description());
- else
- x.set(layer->get_local_name());
+ x.set(layer->get_non_empty_description());
g_value_init(value.gobj(),x.value_type());
//g_value_copy(x.gobj(),value.gobj());
value=x;
}
- else
- if(column==model.tooltip.index())
+ else if(column==model.tooltip.index())
{
synfig::Layer::Handle layer((*iter)[model.layer]);
//g_value_copy(x.gobj(),value.gobj());
value=x;
}
- else
- if(column==model.canvas.index())
+ else if(column==model.canvas.index())
{
synfig::Layer::Handle layer((*iter)[model.layer]);
//g_value_copy(x.gobj(),value.gobj());
value=x;
}
- else
- if(column==model.active.index())
+ else if(column==model.active.index())
{
synfig::Layer::Handle layer((*iter)[model.layer]);
g_value_init(value.gobj(),x.value_type());
g_value_copy(x.gobj(),value.gobj());
}
- else
- if(column==model.icon.index())
+ else if(column==model.icon.index())
{
synfig::Layer::Handle layer((*iter)[model.layer]);
if(!layer)return;
if(new_desc==layer->get_description())
return;
- synfigapp::Action::Handle action(synfigapp::Action::create("layer_set_desc"));
+ synfigapp::Action::Handle action(synfigapp::Action::create("LayerSetDesc"));
if(!action)
return;
canvas_interface()->get_instance()->perform_action(action);
return;
}
- else
- if(column==model.active.index())
+ else if(column==model.active.index())
{
synfig::Layer::Handle layer((*iter)[model.layer]);
g_value_init(x.gobj(),model.active.type());
g_value_copy(value.gobj(),x.gobj());
- synfigapp::Action::Handle action(synfigapp::Action::create("layer_activate"));
+ synfigapp::Action::Handle action(synfigapp::Action::create("LayerActivate"));
if(!action)
return;
}
catch(std::exception x)
{
- g_warning(x.what());
+ g_warning("%s", x.what());
}
}
bool
-LayerTreeStore::row_draggable_vfunc (const TreeModel::Path& path)const
+LayerTreeStore::row_draggable_vfunc (const TreeModel::Path& /*path*/)const
{
//if(!get_iter(path)) return false;
// Gtk::TreeModel::Row row(*get_iter(path));
}
bool
-LayerTreeStore::drag_data_delete_vfunc (const TreeModel::Path& path)
+LayerTreeStore::drag_data_delete_vfunc (const TreeModel::Path& /*path*/)
{
return true;
}
//dest_canvas=(Canvas::Handle)(row[model.canvas]);
return true;
}
- else
- {
- if((bool)const_cast<LayerTreeStore*>(this)->get_iter(dest_parent))
- return (bool)(Canvas::Handle)(*const_cast<LayerTreeStore*>(this)->get_iter(dest_parent))[model.contained_canvas];
- else
- return false;
- }
+ else if((bool)const_cast<LayerTreeStore*>(this)->get_iter(dest_parent))
+ return (bool)(Canvas::Handle)(*const_cast<LayerTreeStore*>(this)->get_iter(dest_parent))[model.contained_canvas];
}
return false;
}
continue;
if(dest_canvas==src->get_canvas() && src->get_depth()<dest_layer_depth)
- {
dest_layer_depth--;
- }
// In this case, we are just moving.
// if(dest_canvas==src->get_canvas())
if(dest_canvas==src->get_canvas() && dest_layer_depth==src->get_depth())
continue;
- synfigapp::Action::Handle action(synfigapp::Action::create("layer_move"));
+ synfigapp::Action::Handle action(synfigapp::Action::create("LayerMove"));
action->set_param("canvas",dest_canvas);
action->set_param("canvas_interface",canvas_interface());
action->set_param("layer",src);
action->set_param("new_index",dest_layer_depth);
action->set_param("dest_canvas",dest_canvas);
if(canvas_interface()->get_instance()->perform_action(action))
- {
- //DEBUGPOINT();
ret=true;
- }
else
{
- //DEBUGPOINT();
passive_grouper.cancel();
return false;
}
{
synfigapp::Action::Handle action;
- action=synfigapp::Action::create("layer_remove");
+ action=synfigapp::Action::create("LayerRemove");
action->set_param("canvas",Canvas::Handle(src->get_canvas()));
if(!action->set_param("canvas_interface",App::get_instance(src->get_canvas())->find_canvas_interface(src->get_canvas())))
action->set_param("canvas_interface",canvas_interface());
return false;
}
- action=synfigapp::Action::create("layer_add");
+ action=synfigapp::Action::create("LayerAdd");
action->set_param("canvas",dest_canvas);
action->set_param("canvas_interface",canvas_interface());
action->set_param("new",src);
if(dest_layer_depth!=0)
{
- action=synfigapp::Action::create("layer_move");
+ action=synfigapp::Action::create("LayerMove");
action->set_param("canvas",dest_canvas);
action->set_param("canvas_interface",canvas_interface());
action->set_param("layer",src);
*/
}
}
- synfig::info("I suposidly moved %d layers",i);
+ synfig::info("I supposedly moved %d layers",i);
// Reselect the previously selected layers
canvas_interface()->get_selection_manager()->set_selected_layers(selected_layer_list);
return ret;
}
-
-
-
-
-
+void
+LayerTreeStore::queue_rebuild()
+{
+ if (queued) return;
+ queued = false;
+ queue_connection.disconnect();
+ queue_connection=Glib::signal_timeout().connect(
+ sigc::bind_return(
+ sigc::mem_fun(*this,&LayerTreeStore::rebuild),
+ false
+ )
+ ,150);
+}
void
LayerTreeStore::rebuild()
{
+ if (queued) queued = false;
+
+ // disconnect any subcanvas_changed connections
+ std::map<synfig::Layer::Handle, sigc::connection>::iterator iter;
+ for (iter = subcanvas_changed_connections.begin(); iter != subcanvas_changed_connections.end(); iter++)
+ iter->second.disconnect();
+ subcanvas_changed_connections.clear();
+
//etl::clock timer;timer.reset();
//synfig::warning("---------rebuilding layer table---------");
// Clear out the current list
clear();
- // Go ahead and and add all the layers
+ // Go ahead and add all the layers
std::for_each(
canvas_interface()->get_canvas()->rbegin(), canvas_interface()->get_canvas()->rend(),
sigc::mem_fun(*this, &studio::LayerTreeStore::on_layer_added)
continue;
}
-
/*
etl::handle<ValueNode> value_node;
if(handle.constant()->dynamic_param_list().count(iter->get_name()))
void
LayerTreeStore::on_layer_added(synfig::Layer::Handle layer)
{
+ if (etl::handle<Layer_PasteCanvas>::cast_dynamic(layer))
+ subcanvas_changed_connections[layer] =
+ (etl::handle<Layer_PasteCanvas>::cast_dynamic(layer))->signal_subcanvas_changed().connect(
+ sigc::mem_fun(*this,&studio::LayerTreeStore::queue_rebuild)
+ );
+
assert(layer);
Gtk::TreeRow row;
if(canvas_interface()->get_canvas()==layer->get_canvas())
void
LayerTreeStore::on_layer_removed(synfig::Layer::Handle handle)
{
+ if (etl::handle<Layer_PasteCanvas>::cast_dynamic(handle))
+ {
+ subcanvas_changed_connections[handle].disconnect();
+ subcanvas_changed_connections.erase(handle);
+ }
Gtk::TreeModel::Children::iterator iter;
if(find_layer_row(handle,iter))
erase(iter);
return;
}
-
Gtk::TreeModel::Children children_(children());
if(canvas_interface()->get_canvas()!=handle->get_canvas())
{
Gtk::TreeModel::Row row(*insert(iter));
set_row_layer(row,handle);
-
}
void
-LayerTreeStore::on_layer_status_changed(synfig::Layer::Handle handle,bool x)
+LayerTreeStore::on_layer_status_changed(synfig::Layer::Handle handle,bool /*x*/)
{
Gtk::TreeModel::Children::iterator iter;
if(find_layer_row(handle,iter))
}
void
-LayerTreeStore::on_layer_moved(synfig::Layer::Handle layer,int depth, synfig::Canvas::Handle canvas)
+LayerTreeStore::on_layer_moved(synfig::Layer::Handle layer,int depth, synfig::Canvas::Handle /*canvas*/)
{
on_layer_removed(layer);
on_layer_inserted(layer,depth);
}
/*
- //DEBUGPOINT();
Gtk::TreeModel::Children::iterator iter;
if(find_layer_row(handle,iter))
{
- //DEBUGPOINT();
Gtk::TreeModel::Children children(iter->children());
for(iter = children.begin(); iter && iter != children.end(); ++iter)
{
if((Glib::ustring)(*iter)[model.param_name]==param_name)
{
- //DEBUGPOINT();
Gtk::TreeRow row=*iter;
refresh_row(row);
return;
}
}
}
- //DEBUGPOINT();
rebuild();
*/
}
bool
-LayerTreeStore::find_layer_row_(const synfig::Layer::Handle &layer, synfig::Canvas::Handle canvas, Gtk::TreeModel::Children layers, Gtk::TreeModel::Children::iterator &iter, Gtk::TreeModel::Children::iterator &prev)
+LayerTreeStore::find_layer_row_(const synfig::Layer::Handle &layer, synfig::Canvas::Handle /*canvas*/, Gtk::TreeModel::Children layers, Gtk::TreeModel::Children::iterator &iter, Gtk::TreeModel::Children::iterator &prev)
{
assert(layer);
}
iter=children().end();
- //DEBUGPOINT();
//return false;
}