Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-studio / trunk / src / gtkmm / layeractionmanager.cpp
index 6903117..436271a 100644 (file)
@@ -6,7 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
-**     Copyright (c) 2007 Chris Moore
+**     Copyright (c) 2007, 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
@@ -32,6 +32,8 @@
 
 #include "layeractionmanager.h"
 #include "layertree.h"
+#include <synfig/context.h>
+#include <synfig/layer_pastecanvas.h>
 #include <synfigapp/action_param.h>
 #include "instance.h"
 #include <synfigapp/selectionmanager.h>
@@ -127,7 +129,12 @@ LayerActionManager::LayerActionManager():
                _("Amount"),_("Amount")
        );
 
-
+       action_select_all_child_layers_=Gtk::Action::create(
+               "select-all-child-layers",
+               Gtk::StockID("synfig-select_all_child_layers"),
+               _("Select All Child Layers"),_("Select All Child Layers")
+       );
+       action_select_all_child_layers_->set_sensitive(false);
 }
 
 LayerActionManager::~LayerActionManager()
@@ -230,7 +237,6 @@ LayerActionManager::refresh()
                return;
        }
 
-
        String ui_info;
 
        action_paste_->set_sensitive(!clipboard_.empty());
@@ -285,26 +291,38 @@ LayerActionManager::refresh()
 
                        if(!multiple_selected && layer->get_name()=="PasteCanvas")
                        {
-                               action_group_->add(Gtk::Action::create(
-                                       "select-all-child-layers",
-                                       _("Select All Child Layers")
-                               ),
-                                       sigc::bind(
-                                               sigc::mem_fun(
-                                                       *layer_tree_,
-                                                       &studio::LayerTree::select_all_children_layers
-                                               ),
-                                               Layer::LooseHandle(layer)
-                                       )
-                               );
+                               if (select_all_child_layers_connection)
+                                       select_all_child_layers_connection.disconnect();
+
+                               select_all_child_layers_connection = action_select_all_child_layers_->signal_activate().connect(
+                                       sigc::bind(sigc::mem_fun(*layer_tree_,
+                                                                                        &studio::LayerTree::select_all_children_layers),
+                                                          Layer::LooseHandle(layer)));
+
+                               action_select_all_child_layers_->set_sensitive(true);
+
                                ui_info+="<menuitem action='select-all-child-layers'/>";
                        }
+                       else
+                               action_select_all_child_layers_->set_sensitive(false);
+
                        handle<studio::Instance>::cast_static(get_canvas_interface()->get_instance())->
                                add_actions_to_group(action_group_, ui_info,   param_list, synfigapp::Action::CATEGORY_LAYER);
                }
        }
 
-       ui_info="<ui><popup action='menu-main'><menu action='menu-layer'>"+ui_info+"<separator/><menuitem action='cut' /><menuitem action='copy' /><menuitem action='paste' /><separator/></menu></popup></ui>";
+       ui_info=("<ui>"
+                          "<popup action='menu-main'>"
+                            "<menu action='menu-layer'>" +
+                                  ui_info +
+                                  "<separator/>"
+                              "<menuitem action='cut' />"
+                                  "<menuitem action='copy' />"
+                                  "<menuitem action='paste' />"
+                                  "<separator/>"
+                            "</menu>"
+                          "</popup>" +
+                        "</ui>");
        popup_id_=get_ui_manager()->add_ui_from_string(ui_info);
 #ifdef ONE_ACTION_GROUP
 #else
@@ -316,8 +334,8 @@ void
 LayerActionManager::cut()
 {
        copy();
-       if(action_group_->get_action("action-layer_remove"))
-               action_group_->get_action("action-layer_remove")->activate();
+       if(action_group_->get_action("action-LayerRemove"))
+               action_group_->get_action("action-LayerRemove")->activate();
 }
 
 void
@@ -363,7 +381,7 @@ LayerActionManager::paste()
        {
                layer=(*iter)->clone(guid);
                layer_selection.push_back(layer);
-               synfigapp::Action::Handle       action(synfigapp::Action::create("layer_add"));
+               synfigapp::Action::Handle       action(synfigapp::Action::create("LayerAdd"));
 
                assert(action);
                if(!action)
@@ -383,12 +401,15 @@ LayerActionManager::paste()
                        return;
                }
 
+               etl::handle<Layer_PasteCanvas> paste = etl::handle<Layer_PasteCanvas>::cast_dynamic(layer);
+               if (paste) paste->update_renddesc();
+
                // synfig::info("DEPTH=%d",depth);
 
                // Action to move the layer (if necessary)
                if(depth>0)
                {
-                       synfigapp::Action::Handle       action(synfigapp::Action::create("layer_move"));
+                       synfigapp::Action::Handle       action(synfigapp::Action::create("LayerMove"));
 
                        assert(action);
                        if(!action)
@@ -416,46 +437,72 @@ LayerActionManager::paste()
                depth++;
 
                // automatically export the Index parameter of Duplicate layers when pasting
-               if (layer->get_name() == "duplicate")
-                       for (int i = 1; ; i++)
-                       {
-                               String name = strprintf(_("Index %d"), i);
-                               try
-                               {
-                                       canvas->find_value_node(name);
-                               }
-                               catch (Exception::IDNotFound x)
-                               {
-                                       get_canvas_interface()->add_value_node(layer->dynamic_param_list().find("index")->second, name);
-                                       break;
-                               }
-                       }
+               int index = 1;
+               export_dup_nodes(layer, canvas, index);
        }
        get_canvas_interface()->get_selection_manager()->clear_selected_layers();
        get_canvas_interface()->get_selection_manager()->set_selected_layers(layer_selection);
 }
 
 void
+LayerActionManager::export_dup_nodes(synfig::Layer::Handle layer, Canvas::Handle canvas, int &index)
+{
+       // automatically export the Index parameter of Duplicate layers when pasting
+       if (layer->get_name() == "duplicate")
+               while (true)
+               {
+                       String name = strprintf(_("Index %d"), index++);
+                       try
+                       {
+                               canvas->find_value_node(name);
+                       }
+                       catch (Exception::IDNotFound x)
+                       {
+                               get_canvas_interface()->add_value_node(layer->dynamic_param_list().find("index")->second, name);
+                               break;
+                       }
+               }
+       else
+       {
+               Layer::ParamList param_list(layer->get_param_list());
+               for (Layer::ParamList::const_iterator iter(param_list.begin())
+                                ; iter != param_list.end()
+                                ; iter++)
+                       if (layer->dynamic_param_list().count(iter->first)==0 && iter->second.get_type()==ValueBase::TYPE_CANVAS)
+                       {
+                               Canvas::Handle subcanvas(iter->second.get(Canvas::Handle()));
+                               if (subcanvas && subcanvas->is_inline())
+                                       for (Context iter = subcanvas->get_context(); iter != subcanvas->end(); iter++)
+                                               export_dup_nodes(*iter, canvas, index);
+                       }
+
+               for (Layer::DynamicParamList::const_iterator iter(layer->dynamic_param_list().begin())
+                                ; iter != layer->dynamic_param_list().end()
+                                ; iter++)
+                       if (iter->second->get_type()==ValueBase::TYPE_CANVAS)
+                       {
+                               Canvas::Handle canvas((*iter->second)(0).get(Canvas::Handle()));
+                               if (canvas->is_inline())
+                                       //! \todo do we need to implement this?  and if so, shouldn't we check all canvases, not just the one at t=0s?
+                                       warning("%s:%d not yet implemented - do we need to export duplicate valuenodes in dynamic canvas parameters?", __FILE__, __LINE__);
+                       }
+       }
+}
+
+void
 LayerActionManager::amount_inc()
 {
        float adjust(0.1);
 
        // Create the action group
-       synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Decrease Amount"));
-
-       if(adjust>0)
-               group.set_name(_("Increase Amount"));
-
+       synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Increase Amount"));
        synfigapp::SelectionManager::LayerList layer_list(layer_tree_->get_selected_layers());
 
-       while(!layer_list.empty())
+       for (; !layer_list.empty(); layer_list.pop_front())
        {
                ValueBase value(layer_list.front()->get_param("amount"));
                if(value.same_type_as(Real()))
-               {
                        get_canvas_interface()->change_value(synfigapp::ValueDesc(layer_list.front(),"amount"),value.get(Real())+adjust);
-               }
-               layer_list.pop_front();
        }
 }
 
@@ -466,19 +513,12 @@ LayerActionManager::amount_dec()
 
        // Create the action group
        synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Decrease Amount"));
-
-       if(adjust>0)
-               group.set_name(_("Increase Amount"));
-
        synfigapp::SelectionManager::LayerList layer_list(layer_tree_->get_selected_layers());
 
-       while(!layer_list.empty())
+       for (; !layer_list.empty(); layer_list.pop_front())
        {
                ValueBase value(layer_list.front()->get_param("amount"));
                if(value.same_type_as(Real()))
-               {
                        get_canvas_interface()->change_value(synfigapp::ValueDesc(layer_list.front(),"amount"),value.get(Real())+adjust);
-               }
-               layer_list.pop_front();
        }
 }