**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2007 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
return ValueBase(parse_canvas(element,canvas,true));
else
{
- DEBUGPOINT();
error_unexpected_element(element,element->get_name());
}
if(!value_node)
{
- error(element,strprintf(_("Unable to create <animated> with type \"%s\""),ValueBase::type_name(type).c_str()));
+ error(element,strprintf(_("Unable to create <animated> with type \"%s\""),ValueBase::type_local_name(type).c_str()));
return ValueNode_Animated::Handle();
}
else
error_unexpected_element(child,child->get_name());
}
+
+ // in canvas version 0.1, angles used to wrap, so to get from -179
+ // degrees to 180 degrees meant a 1 degree change
+ // in canvas version 0.2 they don't, so that's a 359 degree change
+
+ // when loading a version 0.1 canvas, modify constant angle
+ // waypoints to that they are within 180 degrees of the previous
+ // waypoint's value
+ if (type == ValueBase::TYPE_ANGLE)
+ {
+ Canvas::Handle parent = canvas;
+ while (!parent->is_root())
+ parent = parent->parent();
+
+ if (parent->get_version() == "0.1")
+ {
+ bool first = true;
+ Real angle, prev = 0;
+ WaypointList &wl = value_node->waypoint_list();
+ for (WaypointList::iterator iter = wl.begin(); iter != wl.end(); iter++)
+ {
+ angle = Angle::deg(iter->get_value(iter->get_time()).get(Angle())).get();
+ if (first)
+ first = false;
+ else if (iter->get_value_node()->get_name() == "constant")
+ if (angle - prev > 180)
+ {
+ while (angle - prev > 180) angle -= 360;
+ iter->set_value(Angle::deg(angle));
+ }
+ else if (prev - angle > 180)
+ {
+ while (prev - angle > 180) angle += 360;
+ iter->set_value(Angle::deg(angle));
+ }
+ prev = angle;
+ }
+ }
+ }
+
value_node->changed();
return value_node;
}
else
if(!value_node->set_link(index,link))
{
- //error(dynamic_cast<xmlpp::Element*>(*iter),strprintf("Unable to connect value node ('%s' of type '%s') to link %d",link->get_name().c_str(),ValueBase::type_name(link->get_type()).c_str(),index));
- error(element,strprintf("Unable to connect value node ('%s' of type '%s') to link %d",link->get_name().c_str(),ValueBase::type_name(link->get_type()).c_str(),index));
+ //error(dynamic_cast<xmlpp::Element*>(*iter),strprintf(_("Unable to connect value node ('%s' of type '%s') to link %d"),link->get_name().c_str(),ValueBase::type_local_name(link->get_type()).c_str(),index));
+ error(element,strprintf(_("Unable to connect value node ('%s' of type '%s') to link %d"),link->get_name().c_str(),ValueBase::type_local_name(link->get_type()).c_str(),index));
}
// \todo do a search for more elements and warn if they are found
return value_node;
}
- // If ValueBase::ident_type() recognises the name, then we know it's a ValueBase
+ // If ValueBase::ident_type() recognizes the name, then we know it's a ValueBase
if(element->get_name()!="canvas" && ValueBase::ident_type(element->get_name()))
{
ValueBase data=parse_value(element,canvas);
{
error_unexpected_element(element,element->get_name());
error(element, "Expected a ValueNode");
+ value_node=PlaceholderValueNode::create();
}
{
String version(element->get_attribute("version")->get_value());
if(version>layer->get_version())
- warning(element,_("Installed layer version is larger than layer version in file"));
+ warning(element,_("Installed layer version is smaller than layer version in file"));
if(version!=layer->get_version())
layer->set_version(version);
}
continue;
}
- // If we recognise the element name as a
+ // If we recognize the element name as a
// ValueBase, then treat is at one
if(/*(*iter)->get_name()!="canvas" && */ValueBase::ident_type((*iter)->get_name()) && !dynamic_cast<xmlpp::Element*>(*iter)->get_attribute("guid"))
{
canvas->set_guid(guid);
}
+ if(element->get_attribute("version"))
+ canvas->set_version(element->get_attribute("version")->get_value());
+
if(element->get_attribute("width"))
canvas->rend_desc().set_w(atoi(element->get_attribute("width")->get_value().c_str()));
// If we don't have any name, warn
if(list.empty())
- warning(child,_("blank \"name\" entitity"));
+ warning(child,_("blank \"name\" entity"));
string tmp;
for(xmlpp::Element::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter)
// If we don't have any description, warn
if(list.empty())
- warning(child,_("blank \"desc\" entitity"));
+ warning(child,_("blank \"desc\" entity"));
string tmp;
for(xmlpp::Element::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter)
// If we don't have any description, warn
if(list.empty())
- warning(child,_("blank \"author\" entitity"));
+ warning(child,_("blank \"author\" entity"));
string tmp;
for(xmlpp::Element::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter)
if(canvas->value_node_list().placeholder_count())
{
- error(element,strprintf(_("Canvas %s has undefined ValueNodes"),canvas->get_id().c_str()));
+ String nodes;
+ for (ValueNodeList::const_iterator iter = canvas->value_node_list().begin(); iter != canvas->value_node_list().end(); iter++)
+ if(PlaceholderValueNode::Handle::cast_dynamic(*iter))
+ {
+ if (nodes != "") nodes += ", ";
+ nodes += "'" + (*iter)->get_id() + "'";
+ }
+ error(element,strprintf(_("Canvas '%s' has undefined %s: %s"),
+ canvas->get_id().c_str(),
+ canvas->value_node_list().placeholder_count() == 1 ? _("ValueNode") : _("ValueNodes"),
+ nodes.c_str()));
}
+ canvas->set_version(CURRENT_CANVAS_VERSION);
return canvas;
}
Canvas::Handle
CanvasParser::parse_from_file_as(const String &file_,const String &as_)
{
- CHECK_EXPIRE_TIME();
try
{
ChangeLocale change_locale(LC_NUMERIC, "C");
Canvas::Handle
CanvasParser::parse_from_string(const String &data)
{
- CHECK_EXPIRE_TIME();
-
try
{
ChangeLocale change_locale(LC_NUMERIC, "C");