X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Fcanvas.cpp;h=1bc1a18afe34225a4a2f9b15232684521ad65677;hb=9eeed0ce9066de4b2e36885d5ec7b66ac8f14aa8;hp=66d3d06f094312e0e3ed6c305fb8e3f61e059cbe;hpb=4d2cf011c73551bbe67518097063e22ecdac7c7c;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/canvas.cpp b/synfig-core/trunk/src/synfig/canvas.cpp index 66d3d06..1bc1a18 100644 --- a/synfig-core/trunk/src/synfig/canvas.cpp +++ b/synfig-core/trunk/src/synfig/canvas.cpp @@ -6,7 +6,7 @@ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** Copyright (c) 2007 Chris Moore +** 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 @@ -47,7 +47,7 @@ using namespace synfig; using namespace etl; using namespace std; -namespace synfig { extern Canvas::Handle open_canvas(const String &filename); }; +namespace synfig { extern Canvas::Handle open_canvas(const String &filename, String &errors, String &warnings); }; /* === M A C R O S ========================================================= */ @@ -369,7 +369,6 @@ Canvas::_get_relative_id(etl::loose_handle x)const return id; } - ValueNode::Handle Canvas::find_value_node(const String &id) { @@ -400,7 +399,8 @@ Canvas::find_value_node(const String &id)const //synfig::warning("constfind:value_node_id: "+value_node_id); //synfig::warning("constfind:canvas_id: "+canvas_id); - return find_canvas(canvas_id)->value_node_list_.find(value_node_id); + String warnings; + return find_canvas(canvas_id, warnings)->value_node_list_.find(value_node_id); } ValueNode::Handle @@ -422,7 +422,8 @@ Canvas::surefind_value_node(const String &id) if(canvas_id.empty()) canvas_id=':'; - return surefind_canvas(canvas_id)->value_node_list_.surefind(value_node_id); + String warnings; + return surefind_canvas(canvas_id,warnings)->value_node_list_.surefind(value_node_id); } void @@ -507,12 +508,11 @@ Canvas::remove_value_node(ValueNode::Handle x) x->set_id(""); } - -etl::handle -Canvas::surefind_canvas(const String &id) +Canvas::Handle +Canvas::surefind_canvas(const String &id, String &warnings) { if(is_inline() && parent_) - return parent_->surefind_canvas(id); + return parent_->surefind_canvas(id,warnings); if(id.empty()) return this; @@ -524,7 +524,7 @@ Canvas::surefind_canvas(const String &id) // If '#' is the first character, remove it // and attempt to parse the ID again. if(id[0]=='#') - return surefind_canvas(String(id,1)); + return surefind_canvas(String(id,1),warnings); //! \todo This needs a lot more optimization String file_name(id,0,id.find_first_of('#')); @@ -539,17 +539,18 @@ Canvas::surefind_canvas(const String &id) external_canvas=externals_[file_name]; else { + String errors; if(is_absolute_path(file_name)) - external_canvas=open_canvas(file_name); + external_canvas=open_canvas(file_name, errors, warnings); else - external_canvas=open_canvas(get_file_path()+ETL_DIRECTORY_SEPARATOR+file_name); + external_canvas=open_canvas(get_file_path()+ETL_DIRECTORY_SEPARATOR+file_name, errors, warnings); if(!external_canvas) - throw Exception::FileNotFound(file_name); + throw runtime_error(errors); externals_[file_name]=external_canvas; } - return Handle::cast_const(external_canvas.constant()->find_canvas(external_id)); + return Handle::cast_const(external_canvas.constant()->find_canvas(external_id, warnings)); } // If we do not have any resolution, then we assume that the @@ -572,7 +573,7 @@ Canvas::surefind_canvas(const String &id) // If the first character is the separator, then // this references the root canvas. if(id[0]==':') - return get_root()->surefind_canvas(string(id,1)); + return get_root()->surefind_canvas(string(id,1),warnings); // Now we know that the requested Canvas is in a child // of this canvas. We have to find that canvas and @@ -580,24 +581,25 @@ Canvas::surefind_canvas(const String &id) String canvas_name=string(id,0,id.find_first_of(':')); - Canvas::Handle child_canvas=surefind_canvas(canvas_name); + Canvas::Handle child_canvas=surefind_canvas(canvas_name,warnings); - return child_canvas->surefind_canvas(string(id,id.find_first_of(':')+1)); + return child_canvas->surefind_canvas(string(id,id.find_first_of(':')+1),warnings); } Canvas::Handle -Canvas::find_canvas(const String &id) +Canvas::find_canvas(const String &id, String &warnings) { return Canvas::Handle::cast_const( - const_cast(this)->find_canvas(id) + const_cast(this)->find_canvas(id, warnings) ); } Canvas::ConstHandle -Canvas::find_canvas(const String &id)const +Canvas::find_canvas(const String &id, String &warnings)const { - if(is_inline() && parent_)return parent_->find_canvas(id); + if(is_inline() && parent_) + return parent_->find_canvas(id, warnings); if(id.empty()) return this; @@ -609,7 +611,7 @@ Canvas::find_canvas(const String &id)const // If '#' is the first character, remove it // and attempt to parse the ID again. if(id[0]=='#') - return find_canvas(String(id,1)); + return find_canvas(String(id,1), warnings); //! \todo This needs a lot more optimization String file_name(id,0,id.find_first_of('#')); @@ -624,17 +626,18 @@ Canvas::find_canvas(const String &id)const external_canvas=externals_[file_name]; else { + String errors, warnings; if(is_absolute_path(file_name)) - external_canvas=open_canvas(file_name); + external_canvas=open_canvas(file_name, errors, warnings); else - external_canvas=open_canvas(get_file_path()+ETL_DIRECTORY_SEPARATOR+file_name); + external_canvas=open_canvas(get_file_path()+ETL_DIRECTORY_SEPARATOR+file_name, errors, warnings); if(!external_canvas) - throw Exception::FileNotFound(file_name); + throw runtime_error(errors); externals_[file_name]=external_canvas; } - return Handle::cast_const(external_canvas.constant()->find_canvas(external_id)); + return Handle::cast_const(external_canvas.constant()->find_canvas(external_id, warnings)); } // If we do not have any resolution, then we assume that the @@ -654,8 +657,8 @@ Canvas::find_canvas(const String &id)const // If the first character is the separator, then // this references the root canvas. - if(id.find_first_of(':')==0) - return get_root()->find_canvas(string(id,1)); + if(id[0]==':') + return get_root()->find_canvas(string(id,1), warnings); // Now we know that the requested Canvas is in a child // of this canvas. We have to find that canvas and @@ -663,12 +666,11 @@ Canvas::find_canvas(const String &id)const String canvas_name=string(id,0,id.find_first_of(':')); - Canvas::ConstHandle child_canvas=find_canvas(canvas_name); + Canvas::ConstHandle child_canvas=find_canvas(canvas_name, warnings); - return child_canvas->find_canvas(string(id,id.find_first_of(':')+1)); + return child_canvas->find_canvas(string(id,id.find_first_of(':')+1), warnings); } - Canvas::Handle Canvas::create() { @@ -706,10 +708,8 @@ Canvas::insert(iterator iter,etl::handle x) x->set_canvas(this); - add_child(x.get()); - LooseHandle correct_canvas(this); //while(correct_canvas->is_inline())correct_canvas=correct_canvas->parent(); Layer::LooseHandle loose_layer(x); @@ -731,11 +731,9 @@ Canvas::insert(iterator iter,etl::handle x) &Canvas::remove_group_pair), loose_layer)))); - if(!x->get_group().empty()) add_group_pair(x->get_group(),x); - changed(); } @@ -795,6 +793,7 @@ Canvas::clone(const GUID& deriv_guid)const // it was failing to ascertain the absolute pathname of the imported image, since it needs the pathname // of the canvas to get that, which is stored in the parent canvas canvas->parent_=parent(); + canvas->rend_desc() = rend_desc(); //canvas->set_inline(parent()); } @@ -917,7 +916,8 @@ Canvas::add_child_canvas(Canvas::Handle child_canvas, const synfig::String& id) try { - find_canvas(id); + String warnings; + find_canvas(id, warnings); throw Exception::IDAlreadyExists(id); } catch(Exception::IDNotFound) @@ -986,7 +986,6 @@ Canvas::get_file_path()const return dirname(file_name_); } - String Canvas::get_meta_data(const String& key)const {