**
** \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
#include <synfig/gradient.h>
+#include "general.h"
+
#endif
/* === U S I N G =========================================================== */
/* === M E T H O D S ======================================================= */
-CanvasInterface::CanvasInterface(loose_handle<Instance> instance,handle<Canvas> canvas):
+CanvasInterface::CanvasInterface(etl::loose_handle<Instance> instance,etl::handle<synfig::Canvas> canvas):
instance_(instance),
canvas_(canvas),
cur_time_(canvas->rend_desc().get_frame_start()),
CanvasInterface::~CanvasInterface()
{
- synfig::info("synfigapp::CanvasInterface::~CanvasInterface(): Deleted");
+ if (getenv("SYNFIG_DEBUG_DESTRUCTORS"))
+ synfig::info("CanvasInterface::~CanvasInterface(): Deleted");
}
void
}
if(cur_time_.is_equal(x))
return;
- cur_time_=x;
+ get_canvas()->set_time(cur_time_=x);
+
+ // update the time in all the child canvases
+ Canvas::Children children = get_canvas()->get_root()->children();
+ handle<CanvasInterface> interface;
+ for (Canvas::Children::iterator iter = children.begin(); iter != children.end(); iter++)
+ if ((interface = get_instance()->find_canvas_interface(*iter)) != this)
+ interface->set_time(interface->get_canvas()->get_time());
signal_time_changed()();
signal_dirty_preview()();
}
etl::handle<CanvasInterface>
-CanvasInterface::create(loose_handle<Instance> instance,handle<Canvas> canvas)
+CanvasInterface::create(etl::loose_handle<Instance> instance, etl::handle<synfig::Canvas> canvas)
{
etl::handle<CanvasInterface> intrfc;
intrfc=new CanvasInterface(instance,canvas);
Layer::Handle
-CanvasInterface::add_layer_to(String name, Canvas::Handle canvas, int depth)
+CanvasInterface::add_layer_to(synfig::String name, synfig::Canvas::Handle canvas, int depth)
{
synfigapp::Action::PassiveGrouper group(get_instance().get(),_("Add Layer To"));
return 0;
}
+ // automatically export the Index parameter of new Duplicate layers
+ if (name == "duplicate")
+ for (int i = 1; ; i++)
+ {
+ String name = strprintf(_("Index %d"), i);
+ try
+ {
+ canvas->find_value_node(name);
+ }
+ catch (Exception::IDNotFound x)
+ {
+ add_value_node(layer->dynamic_param_list().find("index")->second, name);
+ break;
+ }
+ }
+
layer->set_canvas(canvas);
// Apply some defaults
layer->set_param("blend_method",synfigapp::Main::get_blend_method());
{
- // Grab the layer's list pf parameters
+ // Grab the layer's list of parameters
Layer::ParamList paramlist=layer->get_param_list();
Layer::ParamList::iterator iter;
for(iter=paramlist.begin();iter!=paramlist.end();++iter)
return 0;
}
- synfig::info("DEPTH=%d",depth);
+ // synfig::info("DEPTH=%d",depth);
+
// Action to move the layer (if necessary)
if(depth>0)
{
bool
-CanvasInterface::convert(ValueDesc value_desc, String type)
+CanvasInterface::convert(ValueDesc value_desc, synfig::String type)
{
Action::Handle action(Action::ValueDescConvert::create());
action->set_param("canvas_interface",etl::loose_handle<CanvasInterface>(this));
action->set_param("value_desc",value_desc);
action->set_param("type",type);
+ action->set_param("time",get_time());
if(!action->is_ready())
{
param_list.add("value_node",value_desc.get_value_node());
if(value_desc.is_const())
- param_list.add("value",value_desc.get_value());
+ {
+ // Fix 1868911: if we put a ValueBase holding a Canvas handle
+ // into the param_list and then export the canvas, the handle
+ // will miss out of having its reference count reduced,
+ // because by the time the handle is destructed the canvas
+ // will no longer be inline. So let's not propogate that
+ // ValueBase any further than here.
+ if (value_desc.get_value_type() == ValueBase::TYPE_CANVAS)
+ param_list.add("value",Canvas::LooseHandle(value_desc.get_value().get(Canvas::LooseHandle())));
+ else
+ param_list.add("value",value_desc.get_value());
+ }
if(value_desc.parent_is_layer_param())
{
}
bool
-CanvasInterface::set_name(const String &x)
+CanvasInterface::set_name(const synfig::String &x)
{
//! \todo This needs to be converted into an action
get_canvas()->set_name(x);
}
bool
-CanvasInterface::set_description(const String &x)
+CanvasInterface::set_description(const synfig::String &x)
{
//! \todo This needs to be converted into an action
get_canvas()->set_description(x);
}
bool
-CanvasInterface::set_id(const String &x)
+CanvasInterface::set_id(const synfig::String &x)
{
//! \todo This needs to be converted into an action
get_canvas()->set_id(x);
synfig::info("Attempting to import "+filename);
-
- if(find(filename.begin(),filename.end(),'.')==filename.end())
+ if (filename_extension(filename) == "")
{
- get_ui_interface()->error("Filename must have an extension!");
+ get_ui_interface()->error(_("Filename must have an extension!"));
return false;
}
- String ext(String(filename.begin()+filename.find_last_of('.')+1,filename.end()));
+ String ext(filename_extension(filename));
+ if (ext.size()) ext = ext.substr(1); // skip initial '.'
std::transform(ext.begin(),ext.end(),ext.begin(),&::tolower);
// If this is a SIF file, then we need to do things slightly differently
{
x[0]=size[0];
x[1]=size[0]/w*h;
- if(size[0]<0 ^ size[1]<0)
+ if((size[0]<0) ^ (size[1]<0))
x[1]=-x[1];
}
else
{
x[1]=size[1];
x[0]=size[1]/h*w;
- if(size[0]<0 ^ size[1]<0)
+ if((size[0]<0) ^ (size[1]<0))
x[0]=-x[0];
}
if(!layer->set_param("tl",ValueBase(-x/2)))
void
CanvasInterface::waypoint_duplicate(synfigapp::ValueDesc value_desc,synfig::Waypoint waypoint)
{
+ ValueNode::Handle value_node();
+ waypoint_duplicate(value_desc.get_value_node(), waypoint);
+}
+
+void
+CanvasInterface::waypoint_duplicate(ValueNode::Handle value_node,synfig::Waypoint waypoint)
+{
Action::Handle action(Action::create("waypoint_set_smart"));
assert(action);
waypoint.make_unique();
waypoint.set_time(get_time());
- ValueNode::Handle value_node(value_desc.get_value_node());
-
action->set_param("canvas",get_canvas());
action->set_param("canvas_interface",etl::loose_handle<CanvasInterface>(this));
action->set_param("waypoint",waypoint);
void
CanvasInterface::waypoint_remove(synfigapp::ValueDesc value_desc,synfig::Waypoint waypoint)
{
+ ValueNode::Handle value_node();
+ waypoint_remove(value_desc.get_value_node(), waypoint);
+}
+
+void
+CanvasInterface::waypoint_remove(ValueNode::Handle value_node,synfig::Waypoint waypoint)
+{
Action::Handle action(Action::create("waypoint_remove"));
assert(action);
if(!action)
return;
- ValueNode::Handle value_node(value_desc.get_value_node());
-
action->set_param("canvas",get_canvas());
action->set_param("canvas_interface",etl::loose_handle<CanvasInterface>(this));
action->set_param("waypoint",waypoint);
void
-CanvasInterface::auto_export(ValueNode::Handle /*value_node*/)
+CanvasInterface::auto_export(synfig::ValueNode::Handle /*value_node*/)
{
/*
// Check to see if we are already exported.