void print_child_canvases(const string& prefix, const Canvas::Handle& canvas) { const Canvas::Children& children(canvas->children()); for (Canvas::Children::const_iterator child_canvas = children.begin(); child_canvas != children.end(); child_canvas++) { cout << prefix.c_str() << ":" << (*child_canvas)->get_id().c_str() << endl; print_child_canvases(prefix + ":" + (*child_canvas)->get_id(), *child_canvas); } }
bool Instance::import_external_canvas(Canvas::Handle canvas, std::map<Canvas*, Canvas::Handle> &imported) { etl::handle<CanvasInterface> canvas_interface; for(IndependentContext i = canvas->get_independent_context(); *i; i++) { etl::handle<Layer_PasteCanvas> paste_canvas = etl::handle<Layer_PasteCanvas>::cast_dynamic(*i); if (!paste_canvas) continue; Canvas::Handle sub_canvas = paste_canvas->get_sub_canvas(); if (!sub_canvas) continue; if (!sub_canvas->is_root()) continue; if (imported.count(sub_canvas.get()) != 0) { // link already exported canvas Canvas::Handle new_canvas = imported[sub_canvas.get()]; if (!new_canvas) continue; // Action to link canvas try { Action::Handle action(Action::LayerParamSet::create()); if (!action) continue; canvas_interface = find_canvas_interface(canvas); action->set_param("canvas",canvas); action->set_param("canvas_interface",canvas_interface); action->set_param("layer",Layer::Handle(paste_canvas)); action->set_param("param","canvas"); action->set_param("new_value",ValueBase(new_canvas)); if(!action->is_ready()) continue; if(!perform_action(action)) continue; } catch(...) { continue; } } else { imported[sub_canvas.get()] = NULL; // 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 (canvas->value_node_list().count(name) == false) { found = true; for(std::list<Canvas::Handle>::const_iterator iter=canvas->children().begin();iter!=canvas->children().end();iter++) if(name==(*iter)->get_id()) { found = false; break; } if (found) break; } } if (!found) continue; // Action to import canvas try { Action::Handle action(Action::ValueDescExport::create()); if (!action) continue; canvas_interface = find_canvas_interface(canvas); action->set_param("canvas",canvas); action->set_param("canvas_interface",canvas_interface); action->set_param("value_desc",ValueDesc(Layer::Handle(paste_canvas),std::string("canvas"))); action->set_param("name",name); if(!action->is_ready()) continue; if(!perform_action(action)) continue; std::string warnings; imported[sub_canvas.get()] = canvas->find_canvas(name, warnings); } catch(...) { continue; } return true; } } for(std::list<Canvas::Handle>::const_iterator i = canvas->children().begin(); i != canvas->children().end(); i++) if (import_external_canvas(*i, imported)) return true; return false; }