Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-studio / trunk / src / gtkmm / layertreestore.cpp
index 680d933..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
 #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 =========================================================== */
@@ -68,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);
@@ -96,8 +100,8 @@ LayerTreeStore::LayerTreeStore(etl::loose_handle<synfigapp::CanvasInterface> can
 
 LayerTreeStore::~LayerTreeStore()
 {
-       synfig::info("LayerTreeStore::~LayerTreeStore()q: Deleted");
-
+       if (getenv("SYNFIG_DEBUG_DESTRUCTORS"))
+               synfig::info("LayerTreeStore::~LayerTreeStore(): Deleted");
 }
 
 int
@@ -158,8 +162,7 @@ LayerTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int colum
                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]);
 
@@ -173,8 +176,7 @@ LayerTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int colum
                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]);
 
@@ -185,14 +187,13 @@ LayerTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int colum
                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]);
 
@@ -201,18 +202,13 @@ LayerTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int colum
                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]);
 
@@ -228,8 +224,7 @@ LayerTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int colum
                //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]);
 
@@ -245,8 +240,7 @@ LayerTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int colum
                //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]);
 
@@ -260,8 +254,7 @@ LayerTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int colum
                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;
@@ -316,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,8 +322,7 @@ LayerTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int column,
                        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]);
 
@@ -340,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;
@@ -359,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());
        }
 }
 
@@ -367,7 +359,7 @@ LayerTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int column,
 
 
 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));
@@ -421,7 +413,7 @@ LayerTreeStore::drag_data_get_vfunc (const TreeModel::Path& path, Gtk::Selection
 }
 
 bool
-LayerTreeStore::drag_data_delete_vfunc (const TreeModel::Path& path)
+LayerTreeStore::drag_data_delete_vfunc (const TreeModel::Path& /*path*/)
 {
        return true;
 }
@@ -450,13 +442,8 @@ LayerTreeStore::row_drop_possible_vfunc (const TreeModel::Path& dest, const Gtk:
                        //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;
 }
@@ -521,9 +508,7 @@ LayerTreeStore::drag_data_received_vfunc (const TreeModel::Path& dest, const Gtk
                                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())
@@ -533,20 +518,16 @@ 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);
                                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;
                                }
@@ -556,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());
@@ -568,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);
@@ -581,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);
@@ -598,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);
@@ -606,15 +587,31 @@ LayerTreeStore::drag_data_received_vfunc (const TreeModel::Path& dest, const Gtk
        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---------");
@@ -624,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)
@@ -741,7 +738,6 @@ LayerTreeStore::set_row_layer(Gtk::TreeRow &row,synfig::Layer::Handle &handle)
                        continue;
                }
 
-
                /*
                etl::handle<ValueNode> value_node;
                if(handle.constant()->dynamic_param_list().count(iter->get_name()))
@@ -764,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())
@@ -786,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);
@@ -805,7 +812,6 @@ LayerTreeStore::on_layer_inserted(synfig::Layer::Handle handle,int depth)
                return;
        }
 
-
        Gtk::TreeModel::Children children_(children());
        if(canvas_interface()->get_canvas()!=handle->get_canvas())
        {
@@ -833,11 +839,10 @@ LayerTreeStore::on_layer_inserted(synfig::Layer::Handle handle,int depth)
 
        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))
@@ -906,7 +911,7 @@ LayerTreeStore::on_layer_raised(synfig::Layer::Handle layer)
 }
 
 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);
@@ -925,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();
        */
 }
@@ -1022,7 +1023,7 @@ LayerTreeStore::find_canvas_row(synfig::Canvas::Handle canvas, Gtk::TreeModel::C
 
 
 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);
 
@@ -1036,7 +1037,6 @@ LayerTreeStore::find_layer_row_(const synfig::Layer::Handle &layer, synfig::Canv
                }
 
                iter=children().end();
-               //DEBUGPOINT();
                //return false;
        }