Fix bugs in previous commit that caused FTBFS in synfig and ETL FTBFS with older...
[synfig.git] / synfig-studio / tags / stable / src / gtkmm / layerparamtreestore.cpp
index c36abad..90a88c0 100644 (file)
@@ -1,20 +1,22 @@
-/* === S I N F G =========================================================== */
-/*!    \file childrentreestore.cpp
+/* === S Y N F I G ========================================================= */
+/*!    \file layerparamtreestore.cpp
 **     \brief Template File
 **
-**     $Id: layerparamtreestore.cpp,v 1.1.1.1 2005/01/07 03:34:36 darco Exp $
+**     $Id$
 **
 **     \legal
-**     Copyright (c) 2002 Robert B. Quattlebaum Jr.
+**     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2007, 2008 Chris Moore
 **
-**     This software and associated documentation
-**     are CONFIDENTIAL and PROPRIETARY property of
-**     the above-mentioned copyright holder.
+**     This package is free software; you can redistribute it and/or
+**     modify it under the terms of the GNU General Public License as
+**     published by the Free Software Foundation; either version 2 of
+**     the License, or (at your option) any later version.
 **
-**     You may not copy, print, publish, or in any
-**     other way distribute this software without
-**     a prior written agreement with
-**     the copyright holder.
+**     This package is distributed in the hope that it will be useful,
+**     but WITHOUT ANY WARRANTY; without even the implied warranty of
+**     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+**     General Public License for more details.
 **     \endlegal
 */
 /* ========================================================================= */
 #endif
 
 #include "layerparamtreestore.h"
-#include "iconcontroler.h"
+#include "iconcontroller.h"
 #include <gtkmm/button.h>
-#include <sinfg/paramdesc.h>
+#include <synfig/paramdesc.h>
 #include "layertree.h"
-#include <sinfgapp/action_system.h>
-#include <sinfgapp/instance.h>
+#include <synfigapp/action_system.h>
+#include <synfigapp/instance.h>
 #include "app.h"
 #include <ETL/clock>
 
+#include "general.h"
+
 #endif
 
 /* === U S I N G =========================================================== */
 
 using namespace std;
 using namespace etl;
-using namespace sinfg;
+using namespace synfig;
 using namespace studio;
 
 /* === M A C R O S ========================================================= */
@@ -54,7 +58,7 @@ class Profiler : private etl::clock
        const std::string name;
 public:
        Profiler(const std::string& name):name(name) { reset(); }
-       ~Profiler() { float time(operator()()); sinfg::info("%s: took %f msec",name.c_str(),time*1000); }
+       ~Profiler() { float time(operator()()); synfig::info("%s: took %f msec",name.c_str(),time*1000); }
 };
 
 /* === G L O B A L S ======================================================= */
@@ -70,7 +74,7 @@ static LayerParamTreeStore::Model& ModelHack()
        return *model;
 }
 
-LayerParamTreeStore::LayerParamTreeStore(etl::loose_handle<sinfgapp::CanvasInterface> canvas_interface_,LayerTree* layer_tree):
+LayerParamTreeStore::LayerParamTreeStore(etl::loose_handle<synfigapp::CanvasInterface> canvas_interface_,LayerTree* layer_tree):
        Gtk::TreeStore                  (ModelHack()),
        CanvasTreeStore                 (canvas_interface_),
        layer_tree                              (layer_tree)
@@ -78,6 +82,7 @@ LayerParamTreeStore::LayerParamTreeStore(etl::loose_handle<sinfgapp::CanvasInter
        queued=false;
        // Connect all the signals
        canvas_interface()->signal_value_node_changed().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_changed));
+       canvas_interface()->signal_value_node_renamed().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_renamed));
        canvas_interface()->signal_value_node_added().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_added));
        canvas_interface()->signal_value_node_deleted().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_deleted));
        canvas_interface()->signal_value_node_replaced().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_replaced));
@@ -85,10 +90,10 @@ LayerParamTreeStore::LayerParamTreeStore(etl::loose_handle<sinfgapp::CanvasInter
 
        canvas_interface()->signal_value_node_child_added().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_child_added));
        canvas_interface()->signal_value_node_child_removed().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_child_removed));
-       
-       
+
+
        layer_tree->get_selection()->signal_changed().connect(sigc::mem_fun(*this,&LayerParamTreeStore::queue_rebuild));
-       
+
        signal_changed().connect(sigc::mem_fun(*this,&LayerParamTreeStore::queue_refresh));
        rebuild();
 }
@@ -100,11 +105,13 @@ LayerParamTreeStore::~LayerParamTreeStore()
                changed_connection_list.back().disconnect();
                changed_connection_list.pop_back();
        }
-       sinfg::info("LayerParamTreeStore::~LayerParamTreeStore(): Deleted");
+
+       if (getenv("SYNFIG_DEBUG_DESTRUCTORS"))
+               synfig::info("LayerParamTreeStore::~LayerParamTreeStore(): Deleted");
 }
 
 Glib::RefPtr<LayerParamTreeStore>
-LayerParamTreeStore::create(etl::loose_handle<sinfgapp::CanvasInterface> canvas_interface_, LayerTree*layer_tree)
+LayerParamTreeStore::create(etl::loose_handle<synfigapp::CanvasInterface> canvas_interface_, LayerTree*layer_tree)
 {
        return Glib::RefPtr<LayerParamTreeStore>(new LayerParamTreeStore(canvas_interface_,layer_tree));
 }
@@ -116,25 +123,21 @@ LayerParamTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int
 {
        if(column<0)
        {
-               sinfg::error("LayerParamTreeStore::get_value_vfunc(): Bad column!");
+               synfig::error("LayerParamTreeStore::get_value_vfunc(): Bad column!");
                return;
        }
-       
+
 /*     if(column==model.label.index())
        {
-               sinfg::Layer::Handle layer((*iter)[model.layer]);
+               synfig::Layer::Handle layer((*iter)[model.layer]);
 
                if(!layer)return;
 
                Glib::Value<Glib::ustring> x;
                g_value_init(x.gobj(),x.value_type());
 
+               x.set(layer->get_non_empty_description());
 
-               if(!layer->get_description().empty())
-                       x.set(layer->get_description());
-               else
-                       x.set(layer->get_local_name());
-               
                g_value_init(value.gobj(),x.value_type());
                g_value_copy(x.gobj(),value.gobj());
        }
@@ -142,25 +145,25 @@ LayerParamTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int
 */
        if(column==model.label.index())
        {
-               sinfgapp::ValueDesc value_desc((*iter)[model.value_desc]);
+               synfigapp::ValueDesc value_desc((*iter)[model.value_desc]);
                Glib::ustring label;
-               
+
                if(!(*iter)[model.is_toplevel])
                        return CanvasTreeStore::get_value_vfunc(iter,column,value);
-               sinfg::ParamDesc param_desc((*iter)[model.param_desc]);
+               synfig::ParamDesc param_desc((*iter)[model.param_desc]);
                label=param_desc.get_local_name();
-               
+
                if(!(*iter)[model.is_inconsistent])
                if(value_desc.is_value_node() && value_desc.get_value_node()->is_exported())
                {
                        label+=strprintf(" (%s)",value_desc.get_value_node()->get_id().c_str());
                }
-               
+
                Glib::Value<Glib::ustring> x;
                g_value_init(x.gobj(),x.value_type());
 
                x.set(label);
-               
+
                g_value_init(value.gobj(),x.value_type());
                g_value_copy(x.gobj(),value.gobj());
        }
@@ -171,9 +174,9 @@ LayerParamTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int
                g_value_init(x.gobj(),x.value_type());
 
                TreeModel::Path path(get_path(iter));
-               
+
                x.set(path.get_depth()<=1);
-               
+
                g_value_init(value.gobj(),x.value_type());
                g_value_copy(x.gobj(),value.gobj());
        }
@@ -185,12 +188,12 @@ LayerParamTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int
                        CanvasTreeStore::get_value_vfunc(iter,column,value);
                        return;
                }
-               
+
                Glib::Value<bool> x;
                g_value_init(x.gobj(),x.value_type());
 
                x.set(false);
-               
+
                g_value_init(value.gobj(),x.value_type());
                g_value_copy(x.gobj(),value.gobj());
        }
@@ -222,26 +225,26 @@ LayerParamTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int co
        {
                if(column==model.value.index())
                {
-                       Glib::Value<sinfg::ValueBase> x;
+                       Glib::Value<synfig::ValueBase> x;
                        g_value_init(x.gobj(),model.value.type());
                        g_value_copy(value.gobj(),x.gobj());
-                       
+
                        if((bool)(*iter)[model.is_toplevel])
                        {
-                               sinfgapp::Action::PassiveGrouper group(canvas_interface()->get_instance().get(),_("Set Layer Params"));
+                               synfigapp::Action::PassiveGrouper group(canvas_interface()->get_instance().get(),_("Set Layer Params"));
 
-                               sinfg::ParamDesc param_desc((*iter)[model.param_desc]);
+                               synfig::ParamDesc param_desc((*iter)[model.param_desc]);
 
                                LayerList::iterator iter2(layer_list.begin());
-                               
+
                                for(;iter2!=layer_list.end();++iter2)
                                {
-                                       if(!canvas_interface()->change_value(sinfgapp::ValueDesc(*iter2,param_desc.get_name()),x.get()))
+                                       if(!canvas_interface()->change_value(synfigapp::ValueDesc(*iter2,param_desc.get_name()),x.get()))
                                        {
                                                // ERROR!
                                                group.cancel();
                                                App::dialog_error_blocking(_("Error"),_("Unable to set all layer parameters."));
-                                               
+
                                                return;
                                        }
                                }
@@ -256,24 +259,24 @@ LayerParamTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int co
 /*
                if(column==model.active.index())
                {
-                       sinfg::Layer::Handle layer((*iter)[model.layer]);
-                       
+                       synfig::Layer::Handle layer((*iter)[model.layer]);
+
                        if(!layer)return;
 
                        Glib::Value<bool> x;
                        g_value_init(x.gobj(),model.active.type());
                        g_value_copy(value.gobj(),x.gobj());
-                       
-                       sinfgapp::Action::Handle action(sinfgapp::Action::create("layer_activate"));
-                       
+
+                       synfigapp::Action::Handle action(synfigapp::Action::create("layer_activate"));
+
                        if(!action)
                                return;
-                       
+
                        action->set_param("canvas",canvas_interface()->get_canvas());
                        action->set_param("canvas_interface",canvas_interface());
                        action->set_param("layer",layer);
                        action->set_param("new_status",bool(x.get()));
-                       
+
                        canvas_interface()->get_instance()->perform_action(action);
                        return;
                }
@@ -284,7 +287,7 @@ LayerParamTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int co
        catch(std::exception x)
        {
                g_warning(x.what());
-       }       
+       }
 }
 
 
@@ -299,14 +302,14 @@ LayerParamTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int co
 void
 LayerParamTreeStore::rebuild()
 {
-       Profiler profiler("LayerParamTreeStore::rebuild()");
+       // Profiler profiler("LayerParamTreeStore::rebuild()");
        if(queued)queued=false;
        clear();
        layer_list=layer_tree->get_selected_layers();
-       
+
        if(layer_list.size()<=0)
                return;
-       
+
        // Get rid of all the connections,
        // and clear the connection map.
        //while(!connection_map.empty())connection_map.begin()->second.disconnect(),connection_map.erase(connection_map.begin());
@@ -319,25 +322,29 @@ LayerParamTreeStore::rebuild()
        struct REBUILD_HELPER
        {
                ParamVocab vocab;
+               Layer::Handle layer_0;
 
-               static ParamVocab::iterator find_param_desc(ParamVocab& vocab, const sinfg::String& x)
+               static ParamVocab::iterator find_param_desc(ParamVocab& vocab, const synfig::String& x)
                {
                        ParamVocab::iterator iter;
-       
+
                        for(iter=vocab.begin();iter!=vocab.end();++iter)
                                if(iter->get_name()==x)
                                        break;
                        return iter;
                }
-               
-               void process_vocab(ParamVocab x)
+
+               void process_vocab(synfig::Layer::Handle layer_n)
                {
+                       ParamVocab x = layer_n->get_param_vocab();
                        ParamVocab::iterator iter;
-       
+
                        for(iter=vocab.begin();iter!=vocab.end();++iter)
                        {
-                               ParamVocab::iterator iter2(find_param_desc(x,iter->get_name()));
-                               if(iter2==x.end())
+                               String name(iter->get_name());
+                               ParamVocab::iterator iter2(find_param_desc(x,name));
+                               if(iter2==x.end() ||
+                                  layer_0->get_param(name).get_type() != layer_n->get_param(name).get_type())
                                {
                                        // remove it and start over
                                        vocab.erase(iter);
@@ -347,17 +354,18 @@ LayerParamTreeStore::rebuild()
                                }
                        }
                }
-               
+
        } rebuild_helper;
 
-       
+
        {
                LayerList::iterator iter(layer_list.begin());
                rebuild_helper.vocab=(*iter)->get_param_vocab();
-               
+               rebuild_helper.layer_0=*iter;
+
                for(++iter;iter!=layer_list.end();++iter)
                {
-                       rebuild_helper.process_vocab((*iter)->get_param_vocab());
+                       rebuild_helper.process_vocab(*iter);
                        changed_connection_list.push_back(
                                (*iter)->signal_changed().connect(
                                        sigc::mem_fun(
@@ -368,13 +376,13 @@ LayerParamTreeStore::rebuild()
                        );
                }
        }
-       
+
        ParamVocab::iterator iter;
        for(iter=rebuild_helper.vocab.begin();iter!=rebuild_helper.vocab.end();++iter)
        {
                if(iter->get_hidden())
                        continue;
-               
+
                /*
                if(iter->get_animation_only())
                {
@@ -384,7 +392,7 @@ LayerParamTreeStore::rebuild()
                }
                */
                Gtk::TreeRow row(*(append()));
-               sinfgapp::ValueDesc value_desc(layer_list.front(),iter->get_name());
+               synfigapp::ValueDesc value_desc(layer_list.front(),iter->get_name());
                CanvasTreeStore::set_row(row,value_desc);
                if(value_desc.is_value_node())
                {
@@ -399,8 +407,9 @@ LayerParamTreeStore::rebuild()
                }
                if(value_desc.get_value_type()==ValueBase::TYPE_CANVAS)
                {
-                       changed_connection_list.push_back(
-                               value_desc.get_value().get(Canvas::Handle())->signal_changed().connect(
+                       Canvas::Handle canvas_handle = value_desc.get_value().get(Canvas::Handle());
+                       if(canvas_handle) changed_connection_list.push_back(
+                               canvas_handle->signal_changed().connect(
                                        sigc::mem_fun(
                                                this,
                                                &LayerParamTreeStore::changed
@@ -422,11 +431,12 @@ LayerParamTreeStore::rebuild()
                        if(value!=((*iter2)->get_param(iter->get_name())))
                        {
                                row[model.is_inconsistent] = true;
-                               while(!row.children().empty() && erase(row.children().begin()));
+                               while(!row.children().empty() && erase(row.children().begin()))
+                                       ;
                                break;
-                       }       
+                       }
                }
-       }       
+       }
 }
 
 void
@@ -465,11 +475,11 @@ void
 LayerParamTreeStore::refresh()
 {
        if(queued)queued=false;
-       
+
        Gtk::TreeModel::Children children_(children());
-       
+
        Gtk::TreeModel::Children::iterator iter;
-       
+
        if(!children_.empty())
                for(iter = children_.begin(); iter && iter != children_.end(); ++iter)
                {
@@ -485,7 +495,7 @@ LayerParamTreeStore::refresh_row(Gtk::TreeModel::Row &row)
        {
                row[model.is_inconsistent] = false;
                ParamDesc param_desc(row[model.param_desc]);
-               
+
                LayerList::iterator iter2(layer_list.begin());
                ValueBase value((*iter2)->get_param(param_desc.get_name()));
                for(++iter2;iter2!=layer_list.end();++iter2)
@@ -493,9 +503,10 @@ LayerParamTreeStore::refresh_row(Gtk::TreeModel::Row &row)
                        if(value!=((*iter2)->get_param(param_desc.get_name())))
                        {
                                row[model.is_inconsistent] = true;
-                               while(!row.children().empty() && erase(row.children().begin()));
+                               while(!row.children().empty() && erase(row.children().begin()))
+                                       ;
                                return;
-                       }       
+                       }
                }
        }
 
@@ -508,52 +519,59 @@ LayerParamTreeStore::refresh_row(Gtk::TreeModel::Row &row)
 }
 
 void
-LayerParamTreeStore::set_row(Gtk::TreeRow row,sinfgapp::ValueDesc value_desc)
+LayerParamTreeStore::set_row(Gtk::TreeRow row,synfigapp::ValueDesc value_desc)
 {
        Gtk::TreeModel::Children children = row.children();
-       while(!children.empty() && erase(children.begin()));
+       while(!children.empty() && erase(children.begin()))
+               ;
 
        CanvasTreeStore::set_row(row,value_desc);
 }
 
 void
-LayerParamTreeStore::on_value_node_added(ValueNode::Handle value_node)
+LayerParamTreeStore::on_value_node_added(synfig::ValueNode::Handle /*value_node*/)
 {
 //     queue_refresh();
 }
 
 void
-LayerParamTreeStore::on_value_node_deleted(etl::handle<ValueNode> value_node)
+LayerParamTreeStore::on_value_node_deleted(synfig::ValueNode::Handle /*value_node*/)
 {
 //     queue_refresh();
 }
 
 void
-LayerParamTreeStore::on_value_node_child_added(sinfg::ValueNode::Handle value_node,sinfg::ValueNode::Handle child)
+LayerParamTreeStore::on_value_node_child_added(synfig::ValueNode::Handle /*value_node*/,synfig::ValueNode::Handle /*child*/)
 {
        queue_rebuild();
 }
 
 void
-LayerParamTreeStore::on_value_node_child_removed(sinfg::ValueNode::Handle value_node,sinfg::ValueNode::Handle child)
+LayerParamTreeStore::on_value_node_child_removed(synfig::ValueNode::Handle /*value_node*/,synfig::ValueNode::Handle /*child*/)
 {
-       queue_rebuild();
+       rebuild();
 }
 
 void
-LayerParamTreeStore::on_value_node_changed(etl::handle<ValueNode> value_node)
+LayerParamTreeStore::on_value_node_changed(synfig::ValueNode::Handle /*value_node*/)
 {
        queue_refresh();
 }
 
 void
-LayerParamTreeStore::on_value_node_replaced(sinfg::ValueNode::Handle replaced_value_node,sinfg::ValueNode::Handle new_value_node)
+LayerParamTreeStore::on_value_node_renamed(synfig::ValueNode::Handle /*value_node*/)
+{
+       rebuild();
+}
+
+void
+LayerParamTreeStore::on_value_node_replaced(synfig::ValueNode::Handle /*replaced_value_node*/,synfig::ValueNode::Handle /*new_value_node*/)
 {
        queue_rebuild();
 }
 
 void
-LayerParamTreeStore::on_layer_param_changed(sinfg::Layer::Handle handle,sinfg::String param_name)
+LayerParamTreeStore::on_layer_param_changed(synfig::Layer::Handle /*handle*/,synfig::String /*param_name*/)
 {
        queue_refresh();
 }