**
** \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
#include "layeractionmanager.h"
#include "layertree.h"
+#include <synfig/context.h>
#include <synfigapp/action_param.h>
#include "instance.h"
#include <synfigapp/selectionmanager.h>
_("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()
return;
}
-
String ui_info;
action_paste_->set_sensitive(!clipboard_.empty());
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
get_ui_manager()->insert_action_group(action_group_);
#endif
- DEBUGPOINT();
}
void
return;
}
- synfig::info("DEPTH=%d",depth);
+ // synfig::info("DEPTH=%d",depth);
+
// Action to move the layer (if necessary)
if(depth>0)
{
}
}
depth++;
+
+ // automatically export the Index parameter of Duplicate layers when pasting
+ 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();
}
}
// 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();
}
}