X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Flayertreestore.cpp;h=16b7fc8cb9f8687ffdcc5ca942f1c59309c410b7;hb=9459638ad6797b8139f1e9f0715c96076dbf0890;hp=fda384352061d9d045e51c78b7c9368552835c2d;hpb=449972484abe4b99beef5ac1ed918814e76041c6;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/layertreestore.cpp b/synfig-studio/trunk/src/gtkmm/layertreestore.cpp index fda3843..16b7fc8 100644 --- a/synfig-studio/trunk/src/gtkmm/layertreestore.cpp +++ b/synfig-studio/trunk/src/gtkmm/layertreestore.cpp @@ -6,6 +6,7 @@ ** ** \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 @@ -37,10 +38,13 @@ #include #include "app.h" #include "instance.h" +#include #include #include #include +#include "general.h" + #endif /* === U S I N G =========================================================== */ @@ -67,6 +71,7 @@ static LayerTreeStore::Model& ModelHack() LayerTreeStore::LayerTreeStore(etl::loose_handle 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); @@ -95,7 +100,8 @@ LayerTreeStore::LayerTreeStore(etl::loose_handle can LayerTreeStore::~LayerTreeStore() { - synfig::info("LayerTreeStore::~LayerTreeStore(): Deleted"); + if (getenv("SYNFIG_DEBUG_DESTRUCTORS")) + synfig::info("LayerTreeStore::~LayerTreeStore(): Deleted"); } int @@ -196,11 +202,7 @@ LayerTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int colum Glib::Value 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()); @@ -307,7 +309,7 @@ LayerTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int column, 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; @@ -330,7 +332,7 @@ LayerTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int column, 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; @@ -349,7 +351,7 @@ LayerTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int column, } catch(std::exception x) { - g_warning(x.what()); + g_warning("%s", x.what()); } } @@ -516,7 +518,7 @@ LayerTreeStore::drag_data_received_vfunc (const TreeModel::Path& dest, const Gtk 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); @@ -535,7 +537,7 @@ LayerTreeStore::drag_data_received_vfunc (const TreeModel::Path& dest, const Gtk { 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()); @@ -547,7 +549,7 @@ LayerTreeStore::drag_data_received_vfunc (const TreeModel::Path& dest, const Gtk 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); @@ -560,7 +562,7 @@ LayerTreeStore::drag_data_received_vfunc (const TreeModel::Path& dest, const Gtk 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); @@ -577,7 +579,7 @@ LayerTreeStore::drag_data_received_vfunc (const TreeModel::Path& dest, const Gtk */ } } - 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); @@ -586,8 +588,30 @@ LayerTreeStore::drag_data_received_vfunc (const TreeModel::Path& dest, const Gtk } 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::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---------"); @@ -597,7 +621,7 @@ LayerTreeStore::rebuild() // 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) @@ -736,6 +760,12 @@ LayerTreeStore::set_row_layer(Gtk::TreeRow &row,synfig::Layer::Handle &handle) void LayerTreeStore::on_layer_added(synfig::Layer::Handle layer) { + if (etl::handle::cast_dynamic(layer)) + subcanvas_changed_connections[layer] = + (etl::handle::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()) @@ -758,6 +788,11 @@ LayerTreeStore::on_layer_added(synfig::Layer::Handle layer) void LayerTreeStore::on_layer_removed(synfig::Layer::Handle handle) { + if (etl::handle::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); @@ -895,25 +930,21 @@ LayerTreeStore::on_layer_param_changed(synfig::Layer::Handle handle,synfig::Stri } /* - //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(); */ } @@ -1006,7 +1037,6 @@ LayerTreeStore::find_layer_row_(const synfig::Layer::Handle &layer, synfig::Canv } iter=children().end(); - //DEBUGPOINT(); //return false; }