Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-studio / trunk / src / gtkmm / layertreestore.cpp
index 74f41a3..16b7fc8 100644 (file)
@@ -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,6 +38,7 @@
 #include <synfigapp/instance.h>
 #include "app.h"
 #include "instance.h"
+#include <synfig/layer_pastecanvas.h>
 #include <synfigapp/action_system.h>
 
 #include <gtk/gtkversion.h>
@@ -69,6 +71,7 @@ static LayerTreeStore::Model& ModelHack()
 
 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);
@@ -306,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;
@@ -329,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;
@@ -348,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());
        }
 }
 
@@ -515,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);
@@ -534,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());
@@ -546,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);
@@ -559,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);
@@ -585,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<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---------");
@@ -596,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)
@@ -735,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<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())
@@ -757,6 +788,11 @@ LayerTreeStore::on_layer_added(synfig::Layer::Handle layer)
 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);