X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Floadcanvas.cpp;h=93dbd44cd7f4464217147eb17ce31921e37a4ccf;hb=9b60c394e7f36df4c48ca84d87c7796ea15dcdb8;hp=c0e3f6fc892061c101da7471b9486b015e52c00b;hpb=1b597586609b1c4df37d5ce9726f2ab27bfd64ea;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/loadcanvas.cpp b/synfig-core/trunk/src/synfig/loadcanvas.cpp index c0e3f6f..93dbd44 100644 --- a/synfig-core/trunk/src/synfig/loadcanvas.cpp +++ b/synfig-core/trunk/src/synfig/loadcanvas.cpp @@ -88,6 +88,8 @@ test_class test_class_instance; /* === M A C R O S ========================================================= */ +#define VALUENODE_COMPATIBILITY_URL "http://synfig.org/Convert#Compatibility" + inline bool is_whitespace(char x) { return ((x)=='\n' || (x)=='\t' || (x)==' '); } /* === P R O C E D U R E S ================================================= */ @@ -856,7 +858,6 @@ CanvasParser::parse_value(xmlpp::Element *element,Canvas::Handle canvas) return ValueBase(parse_canvas(element,canvas,true)); else { - DEBUGPOINT(); error_unexpected_element(element,element->get_name()); } @@ -889,7 +890,7 @@ CanvasParser::parse_animated(xmlpp::Element *element,Canvas::Handle canvas) if(!value_node) { - error(element,strprintf(_("Unable to create with type \"%s\""),ValueBase::type_name(type).c_str())); + error(element,strprintf(_("Unable to create with type \"%s\""),ValueBase::type_local_name(type).c_str())); return ValueNode_Animated::Handle(); } @@ -1068,7 +1069,7 @@ CanvasParser::parse_animated(xmlpp::Element *element,Canvas::Handle canvas) if (parent->get_version() == "0.1") { bool first = true; - Real angle, prev; + Real angle, prev = 0; WaypointList &wl = value_node->waypoint_list(); for (WaypointList::iterator iter = wl.begin(); iter != wl.end(); iter++) { @@ -1122,7 +1123,10 @@ CanvasParser::parse_linkable_value_node(xmlpp::Element *element,Canvas::Handle c if(!value_node) { - error(element,"Unknown ValueNode type "+element->get_name()); + error(element, strprintf(_("Error creating ValueNode <%s> with type '%s'. Refer to '%s'"), + element->get_name().c_str(), + ValueBase::type_local_name(type).c_str(), + VALUENODE_COMPATIBILITY_URL)); return 0; } @@ -1135,31 +1139,39 @@ CanvasParser::parse_linkable_value_node(xmlpp::Element *element,Canvas::Handle c value_node->set_root_canvas(canvas->get_root()); int i; - for(i=0;ilink_count();i++) + String id, name; + xmlpp::Element::AttributeList attrib_list(element->get_attributes()); + for(xmlpp::Element::AttributeList::iterator iter = attrib_list.begin(); iter != attrib_list.end(); iter++) { - if(element->get_attribute(value_node->link_name(i))) + name = (*iter)->get_name(); + id = (*iter)->get_value(); + + if (name == "guid" || name == "id" || name == "type") + continue; + try { - String id(element->get_attribute(value_node->link_name(i))->get_value()); - - if(!value_node->set_link(i, - canvas->surefind_value_node( - id - ) - ) - ) error(element,strprintf(_("Unable to set link \"%s\" to ValueNode \"%s\" (link #%d in \"%s\")"),value_node->link_name(i).c_str(),id.c_str(),i,value_node->get_name().c_str())); + i = value_node->get_link_index_from_name(name); + + if(!value_node->set_link(i, canvas->surefind_value_node(id))) + error(element,strprintf(_("Unable to set link \"%s\" to ValueNode \"%s\" (link #%d in \"%s\")"),value_node->link_name(i).c_str(),id.c_str(),i,value_node->get_name().c_str())); + else + printf(" composite: set '%s'\n", name.c_str()); + } + catch (Exception::BadLinkName) + { + error(element,"Bad link name " + name); } catch(Exception::IDNotFound) { - error(element,"Unable to resolve "+element->get_attribute(value_node->link_name(i))->get_value()); + error(element,"Unable to resolve " + id); } catch(Exception::FileNotFound) { - error(element,"Unable to open file referenced in "+element->get_attribute(value_node->link_name(i))->get_value()); + error(element,"Unable to open file referenced in " + id); } catch(...) { - error(element,strprintf(_("Unknown Exception thrown when referencing ValueNode \"%s\""), - element->get_attribute(value_node->link_name(i))->get_value().c_str())); + error(element,strprintf(_("Unknown Exception thrown when referencing ValueNode \"%s\""), id.c_str())); throw; } } @@ -1198,8 +1210,8 @@ CanvasParser::parse_linkable_value_node(xmlpp::Element *element,Canvas::Handle c else if(!value_node->set_link(index,link)) { - //error(dynamic_cast(*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(*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 @@ -1251,7 +1263,7 @@ CanvasParser::parse_composite(xmlpp::Element *element,Canvas::Handle canvas) for(i=0;ilink_count();i++) { - string name=strprintf("c%d",i+1); + string name=value_node->link_name(i); if(c[i]) { error(element,name+" was already defined in "); @@ -1278,15 +1290,22 @@ CanvasParser::parse_composite(xmlpp::Element *element,Canvas::Handle canvas) xmlpp::Element *child(dynamic_cast(*iter)); if(!child) continue; - else + + string child_name = child->get_name(); for(i=0;ilink_count();i++) { - string name=strprintf("c%d",i+1); - if(child->get_name()==name) + string name=value_node->link_name(i); + int old_index = -1; + + if (child_name.size() == 2 && child_name[0] == 'c') + old_index = child_name[1] - '1'; + + if ((old_index != -1 && old_index == i) || + (old_index == -1 && value_node->get_link_index_from_name(child_name) == i)) { if(c[i]) { - error(child,name+" was already defined in "); + error(child,child_name+" was already defined in "); break; } @@ -1299,7 +1318,7 @@ CanvasParser::parse_composite(xmlpp::Element *element,Canvas::Handle canvas) if(iter==list.end()) { - error(child,strprintf(_("<%s> is missing its contents"),name.c_str())); + error(child,strprintf(_("<%s> is missing its contents"),child_name.c_str())); break; } @@ -1307,13 +1326,13 @@ CanvasParser::parse_composite(xmlpp::Element *element,Canvas::Handle canvas) if(!c[i]) { - error((*iter),"Parse of "+name+" ValueNode failed"); + error((*iter),"Parse of "+child_name+" ValueNode failed"); break; } if(!value_node->set_link(i,c[i])) { - error(child,strprintf(_("<%s> has a bad value"),name.c_str())); + error(child,strprintf(_("<%s> has a bad value"),child_name.c_str())); break; } @@ -1322,7 +1341,7 @@ CanvasParser::parse_composite(xmlpp::Element *element,Canvas::Handle canvas) } } // somewhat of a hack, but it works - if(i==value_node->link_count()) error_unexpected_element(child,child->get_name()); + if(i==value_node->link_count()) error_unexpected_element(child,child_name); } switch(value_node->link_count()) @@ -1622,20 +1641,23 @@ CanvasParser::parse_value_node(xmlpp::Element *element,Canvas::Handle canvas) value_node=parse_dynamic_list(element,canvas); else if(LinkableValueNode::book().count(element->get_name())) + { value_node=parse_linkable_value_node(element,canvas); + if (!value_node) value_node = PlaceholderValueNode::create(); + } else if(element->get_name()=="canvas") value_node=ValueNode_Const::create(parse_canvas(element,canvas,true)); else { error_unexpected_element(element,element->get_name()); - error(element, "Expected a ValueNode"); + error(element, strprintf(_("Expected a ValueNode. Refer to '%s'"), + VALUENODE_COMPATIBILITY_URL)); + value_node=PlaceholderValueNode::create(); } - value_node->set_root_canvas(canvas->get_root()); - // If we were successful, and our element has // an ID attribute, go ahead and add it to the // value_node list