X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Flayeractionmanager.cpp;h=436271a6d57e6c5348ad5b839e952e5f9d95acf0;hb=9459638ad6797b8139f1e9f0715c96076dbf0890;hp=6d14b73460d5e7915c280bee4fe828e196568257;hpb=ce408de81ca266b1f334ee9bc6c8fb7ba1492ed4;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/layeractionmanager.cpp b/synfig-studio/trunk/src/gtkmm/layeractionmanager.cpp index 6d14b73..436271a 100644 --- a/synfig-studio/trunk/src/gtkmm/layeractionmanager.cpp +++ b/synfig-studio/trunk/src/gtkmm/layeractionmanager.cpp @@ -1,11 +1,12 @@ /* === S Y N F I G ========================================================= */ -/*! \file template.cpp +/*! \file layeractionmanager.cpp ** \brief Template File ** -** $Id: layeractionmanager.cpp,v 1.1.1.1 2005/01/07 03:34:36 darco Exp $ +** $Id$ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** 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 @@ -31,10 +32,14 @@ #include "layeractionmanager.h" #include "layertree.h" +#include +#include #include #include "instance.h" #include +#include "general.h" + #endif /* === U S I N G =========================================================== */ @@ -58,8 +63,8 @@ static const guint no_prev_popup((guint)-1); LayerActionManager::LayerActionManager(): action_group_(Gtk::ActionGroup::create()), - action_group_copy_paste(Gtk::ActionGroup::create()), popup_id_(no_prev_popup), + action_group_copy_paste(Gtk::ActionGroup::create()), queued(false) { action_cut_=Gtk::Action::create( @@ -92,8 +97,8 @@ LayerActionManager::LayerActionManager(): &LayerActionManager::paste ) ); - - + + action_amount_inc_=Gtk::Action::create( "amount-inc", Gtk::StockID("gtk-add"), @@ -124,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() @@ -196,7 +206,7 @@ LayerActionManager::queue_refresh() { if(queued) return; - + //queue_refresh_connection.disconnect(); queue_refresh_connection=Glib::signal_idle().connect( sigc::bind_return( @@ -204,7 +214,7 @@ LayerActionManager::queue_refresh() false ) ); - + queued=true; } @@ -219,25 +229,24 @@ LayerActionManager::refresh() clear(); - + // Make sure we are ready if(!ui_manager_ || !layer_tree_ || !canvas_interface_) { synfig::error("LayerActionManager::refresh(): Not ready!"); return; } - - + String ui_info; action_paste_->set_sensitive(!clipboard_.empty()); action_group_->add(action_paste_); - + if(layer_tree_->get_selection()->count_selected_rows()!=0) { bool multiple_selected(layer_tree_->get_selection()->count_selected_rows()>1); Layer::Handle layer(layer_tree_->get_selected_layer()); - + { bool canvas_set(false); synfigapp::Action::ParamList param_list; @@ -257,7 +266,7 @@ LayerActionManager::refresh() action_group_->add(action_amount_inc_); action_group_->add(action_amount_dec_); action_group_->add(action_amount_); - + for(iter=layer_list.begin();iter!=layer_list.end();++iter) { update_connection_list.push_back( @@ -265,7 +274,7 @@ LayerActionManager::refresh() sigc::mem_fun(*this, &LayerActionManager::queue_refresh) ) ); - + if(!canvas_set) { param_list.add("canvas",Canvas::Handle((*iter)->get_canvas())); @@ -279,43 +288,54 @@ LayerActionManager::refresh() param_list.add("layer",Layer::Handle(*iter)); } } - + 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+=""; } + else + action_select_all_child_layers_->set_sensitive(false); + handle::cast_static(get_canvas_interface()->get_instance())-> add_actions_to_group(action_group_, ui_info, param_list, synfigapp::Action::CATEGORY_LAYER); } } - - ui_info=""+ui_info+""; - popup_id_=get_ui_manager()->add_ui_from_string(ui_info); + + ui_info=("" + "" + "" + + ui_info + + "" + "" + "" + "" + "" + "" + "" + + ""); + 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 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 @@ -324,7 +344,7 @@ LayerActionManager::copy() synfigapp::SelectionManager::LayerList layer_list(layer_tree_->get_selected_layers()); clipboard_.clear(); synfig::GUID guid; - + while(!layer_list.empty()) { clipboard_.push_back(layer_list.front()->clone(guid)); @@ -332,7 +352,7 @@ LayerActionManager::copy() } action_paste_->set_sensitive(!clipboard_.empty()); - + //queue_refresh(); } @@ -346,7 +366,7 @@ LayerActionManager::paste() Canvas::Handle canvas(get_canvas_interface()->get_canvas()); int depth(0); - + // we are temporarily using the layer to hold something Layer::Handle layer(layer_tree_->get_selected_layer()); if(layer) @@ -354,89 +374,135 @@ LayerActionManager::paste() depth=layer->get_depth(); canvas=layer->get_canvas(); } - + synfigapp::SelectionManager::LayerList layer_selection; - + for(std::list::iterator iter=clipboard_.begin();iter!=clipboard_.end();++iter) { 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) return; - + action->set_param("canvas",canvas); action->set_param("canvas_interface",etl::loose_handle(get_canvas_interface())); action->set_param("new",layer); - + if(!action->is_ready()) { return; } - + if(!get_instance()->perform_action(action)) { return; } - - synfig::info("DEPTH=%d",depth); + + etl::handle paste = etl::handle::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) return; - + action->set_param("canvas",canvas); action->set_param("canvas_interface",etl::loose_handle(get_canvas_interface())); action->set_param("layer",layer); action->set_param("new_index",depth); - + if(!action->is_ready()) { - //get_ui_interface()->error(_("Move Action Not Ready")); + //get_ui_interface()->error(_("Move Action Not Ready")); //return 0; return; } - + if(!get_instance()->perform_action(action)) { - //get_ui_interface()->error(_("Move Action Not Ready")); + //get_ui_interface()->error(_("Move Action Not Ready")); //return 0; return; } - } + } 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")); + // Create the action group + 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_as(Real())) - { + 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(); } } @@ -444,22 +510,15 @@ void LayerActionManager::amount_dec() { 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::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_as(Real())) - { + 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(); } }