-/* === S I N F G =========================================================== */
-/*! \file template.cpp
+/* === S Y N F I G ========================================================= */
+/*! \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 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
*/
/* ========================================================================= */
#include "layeractionmanager.h"
#include "layertree.h"
-#include <sinfgapp/action_param.h>
+#include <synfig/context.h>
+#include <synfig/layer_pastecanvas.h>
+#include <synfigapp/action_param.h>
#include "instance.h"
-#include <sinfgapp/selectionmanager.h>
+#include <synfigapp/selectionmanager.h>
+
+#include "general.h"
#endif
using namespace std;
using namespace etl;
-using namespace sinfg;
+using namespace synfig;
using namespace studio;
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(
&LayerActionManager::paste
)
);
-
-
+
+
action_amount_inc_=Gtk::Action::create(
"amount-inc",
Gtk::StockID("gtk-add"),
_("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()
}
void
-LayerActionManager::set_canvas_interface(const etl::handle<sinfgapp::CanvasInterface> &x)
+LayerActionManager::set_canvas_interface(const etl::handle<synfigapp::CanvasInterface> &x)
{
canvas_interface_=x;
}
{
if(queued)
return;
-
+
//queue_refresh_connection.disconnect();
queue_refresh_connection=Glib::signal_idle().connect(
sigc::bind_return(
false
)
);
-
+
queued=true;
}
clear();
-
+
// Make sure we are ready
if(!ui_manager_ || !layer_tree_ || !canvas_interface_)
{
- sinfg::error("LayerActionManager::refresh(): Not ready!");
+ 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);
- sinfgapp::Action::ParamList param_list;
+ synfigapp::Action::ParamList param_list;
param_list.add("time",get_canvas_interface()->get_time());
param_list.add("canvas_interface",get_canvas_interface());
{
- sinfgapp::SelectionManager::LayerList layer_list(layer_tree_->get_selected_layers());
- sinfgapp::SelectionManager::LayerList::iterator iter;
+ synfigapp::SelectionManager::LayerList layer_list(layer_tree_->get_selected_layers());
+ synfigapp::SelectionManager::LayerList::iterator iter;
action_copy_->set_sensitive(!layer_list.empty());
action_cut_->set_sensitive(!layer_list.empty());
action_group_->add(action_copy_);
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(
sigc::mem_fun(*this, &LayerActionManager::queue_refresh)
)
);
-
+
if(!canvas_set)
{
param_list.add("canvas",Canvas::Handle((*iter)->get_canvas()));
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+="<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, sinfgapp::Action::CATEGORY_LAYER);
+ add_actions_to_group(action_group_, ui_info, param_list, synfigapp::Action::CATEGORY_LAYER);
}
}
-
- ui_info="<ui><menubar action='menu-main'><menu action='menu-layer'>"+ui_info+"<separator/><menuitem action='cut' /><menuitem action='copy' /><menuitem action='paste' /><separator/></menu></menubar></ui>";
- popup_id_=get_ui_manager()->add_ui_from_string(ui_info);
+
+ 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
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
LayerActionManager::copy()
{
- sinfgapp::SelectionManager::LayerList layer_list(layer_tree_->get_selected_layers());
+ synfigapp::SelectionManager::LayerList layer_list(layer_tree_->get_selected_layers());
clipboard_.clear();
- sinfg::GUID guid;
-
+ synfig::GUID guid;
+
while(!layer_list.empty())
{
clipboard_.push_back(layer_list.front()->clone(guid));
}
action_paste_->set_sensitive(!clipboard_.empty());
-
+
//queue_refresh();
}
void
LayerActionManager::paste()
{
- sinfg::GUID guid;
+ synfig::GUID guid;
// Create the action group
- sinfgapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Paste"));
+ synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("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)
depth=layer->get_depth();
canvas=layer->get_canvas();
}
-
- sinfgapp::SelectionManager::LayerList layer_selection;
-
- for(std::list<sinfg::Layer::Handle>::iterator iter=clipboard_.begin();iter!=clipboard_.end();++iter)
+
+ synfigapp::SelectionManager::LayerList layer_selection;
+
+ for(std::list<synfig::Layer::Handle>::iterator iter=clipboard_.begin();iter!=clipboard_.end();++iter)
{
layer=(*iter)->clone(guid);
layer_selection.push_back(layer);
- sinfgapp::Action::Handle action(sinfgapp::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<sinfgapp::CanvasInterface>(get_canvas_interface()));
+ action->set_param("canvas_interface",etl::loose_handle<synfigapp::CanvasInterface>(get_canvas_interface()));
action->set_param("new",layer);
-
+
if(!action->is_ready())
{
return;
}
-
+
if(!get_instance()->perform_action(action))
{
return;
}
-
- sinfg::info("DEPTH=%d",depth);
+
+ 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)
{
- sinfgapp::Action::Handle action(sinfgapp::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<sinfgapp::CanvasInterface>(get_canvas_interface()));
+ action->set_param("canvas_interface",etl::loose_handle<synfigapp::CanvasInterface>(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
- sinfgapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Decrease Amount"));
-
- if(adjust>0)
- group.set_name(_("Increase Amount"));
- sinfgapp::SelectionManager::LayerList layer_list(layer_tree_->get_selected_layers());
+ // 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()))
- {
- get_canvas_interface()->change_value(sinfgapp::ValueDesc(layer_list.front(),"amount"),value.get(Real())+adjust);
- }
- layer_list.pop_front();
+ if(value.same_type_as(Real()))
+ get_canvas_interface()->change_value(synfigapp::ValueDesc(layer_list.front(),"amount"),value.get(Real())+adjust);
}
}
LayerActionManager::amount_dec()
{
float adjust(-0.1);
-
- // Create the action group
- sinfgapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Decrease Amount"));
-
- if(adjust>0)
- group.set_name(_("Increase Amount"));
- sinfgapp::SelectionManager::LayerList layer_list(layer_tree_->get_selected_layers());
+ // Create the action group
+ synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Decrease 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()))
- {
- get_canvas_interface()->change_value(sinfgapp::ValueDesc(layer_list.front(),"amount"),value.get(Real())+adjust);
- }
- layer_list.pop_front();
+ if(value.same_type_as(Real()))
+ get_canvas_interface()->change_value(synfigapp::ValueDesc(layer_list.front(),"amount"),value.get(Real())+adjust);
}
}