Example #1
0
void
Instance::update_references_in_canvas(synfig::Canvas::Handle canvas)
{
	for(std::list<Canvas::Handle>::const_iterator i = canvas->children().begin(); i != canvas->children().end(); i++)
		update_references_in_canvas(*i);

	for(IndependentContext c = canvas->get_independent_context(); *c; c++)
	{
		for(FileReferenceList::iterator j = save_canvas_references_.begin(); j != save_canvas_references_.end();)
		{
			if (*c == j->layer)
			{
				ValueBase value;
				value.set(j->new_filename);
				(*c)->set_param(j->param_name, value);
				(*c)->changed();
				find_canvas_interface(get_canvas())->signal_layer_param_changed()(*c,j->param_name);
				j = save_canvas_references_.erase(j);
			}
			else j++;
		}
	}
}
void
Action::LayerEmbed::prepare()
{
	if(!first_time())
		return;

	if (layer_pastecanvas) {
		Canvas::Handle sub_canvas = layer_pastecanvas->get_sub_canvas();

		// generate name
		std::string fname = filename_sans_extension(basename(sub_canvas->get_file_name()));
		static const char bad_chars[]=" :#@$^&()*";
		for(std::string::iterator j = fname.begin(); j != fname.end(); j++)
			for(const char *k = bad_chars; *k != 0; k++)
				if (*j == *k) { *j = '_'; break; }
		if (fname.empty()) fname = "canvas";
		if (fname[0]>='0' && fname[0]<='9')
			fname = "_" + fname;

		std::string name;
		bool found = false;
		for(int j = 1; j < 1000; j++)
		{
			name = j == 1 ? fname : strprintf("%s_%d", fname.c_str(), j);
			if (get_canvas()->value_node_list().count(name) == false)
			{
				found = true;
				for(std::list<Canvas::Handle>::const_iterator iter=get_canvas()->children().begin();iter!=get_canvas()->children().end();iter++)
					if(name==(*iter)->get_id())
						{ found = false; break; }
				if (found) break;
			}
		}
		if (!found)
			throw Error(_("Cannot generate valid name for new canvas"));

		// create action
		Action::Handle action(Action::create("ValueDescExport"));
		action->set_param("canvas",get_canvas());
		action->set_param("canvas_interface",get_canvas_interface());
		action->set_param("value_desc",ValueDesc(Layer::Handle(layer_pastecanvas),std::string("canvas")));
		action->set_param("name",name);
		add_action_front(action);
	}

	if (layer_import) {
		// TODO: "container:" and "images" literals
		std::string dir = "#images/";

		std::string filename = layer_import->get_param("filename").get(String());
		std::string src_dir = get_canvas()->get_file_path();
		if (!is_absolute_path(src_dir))
			src_dir = absolute_path(src_dir);

		std::string absolute_filename
			  =	filename.empty()           ? src_dir
			  : is_absolute_path(filename) ? filename
			  : cleanup_path(src_dir+ETL_DIRECTORY_SEPARATOR+filename);

		FileSystem::Handle file_system = get_canvas()->get_identifier().file_system;

		// try to create directory
		if (!file_system->directory_create(dir.substr(0,dir.size()-1)))
			throw Error(_("Cannot create directory in container"));

		// generate new filename
		int i = 0;
		std::string new_filename = basename(filename);
		while(file_system->is_exists(dir + new_filename))
		{
			new_filename = filename_sans_extension(basename(filename))
					     + strprintf("_%d", ++i)
					     + filename_extension(filename);
		}

		etl::loose_handle<synfigapp::Instance> instance =
			get_canvas_interface()->get_instance();
		etl::handle<Layer_Bitmap> layer_bitmap =
			etl::handle<Layer_Bitmap>::cast_dynamic(layer_import);
		if (layer_bitmap && instance->is_layer_registered_to_save(layer_bitmap)) {
			// save surface
			get_canvas_interface()->get_instance()->save_surface(layer_bitmap->surface, dir + new_filename);
		} else {
			// try to copy file
			if (!FileSystem::copy(file_system, absolute_filename, file_system, dir + new_filename))
				throw Error(_("Cannot copy file into container"));
		}

		// create action to change layer param
		ValueBase value;
		value.set("#" + new_filename);
		Action::Handle action(Action::create("LayerParamSet"));
		action->set_param("canvas",get_canvas());
		action->set_param("canvas_interface",get_canvas_interface());
		action->set_param("layer",layer_import);
		action->set_param("param","filename");
		action->set_param("new_value",value);
		add_action_front(action);
	}
}