diff --git a/diagram.cpp b/diagram.cpp index fcb76847a..6f21c660f 100644 --- a/diagram.cpp +++ b/diagram.cpp @@ -217,7 +217,6 @@ QDomDocument Diagram::toXml(bool diagram) { racine.setAttribute("cols", border_and_inset.nbColumn()); racine.setAttribute("colsize", border_and_inset.columnsWidth()); racine.setAttribute("height", border_and_inset.columnsHeight()); - racine.setAttribute("version", QET::version); // type de conducteur par defaut QDomElement default_conductor = document.createElement("defaultconductor"); diff --git a/diagramview.cpp b/diagramview.cpp index 752f2336d..7e2ac70b3 100644 --- a/diagramview.cpp +++ b/diagramview.cpp @@ -284,14 +284,78 @@ bool DiagramView::open(QString n_fichier, int *erreur) { } fichier.close(); - // construit le schema a partir du QDomDocument - QDomDocument &doc = document; - if (scene -> fromXml(doc)) { - if (erreur != NULL) *erreur = 0; - file_name = n_fichier; - scene -> undoStack().setClean(); - updateWindowTitle(); - return(true); + /** + La notion de projet (ensemble de documents [schemas, nomenclatures, + ...] et d'elements) n'est pas encore geree. + Toutefois, pour gerer au mieux la transition de la 0.1 a la 0.2, + les schemas enregistres (element XML "diagram") sont integres dans un + pseudo projet (element XML "project"). + S'il y a plusieurs schemas dans un projet, tous les schemas seront + ouverts comme etant des fichiers separes + */ + // repere les schemas dans le fichier + // cas 1 : l'element racine est un "diagram" : un seul schema, pas de probleme + if (document.documentElement().tagName() == "diagram") { + // construit le schema a partir du QDomDocument + QDomDocument &doc = document; + if (scene -> fromXml(doc)) { + if (erreur != NULL) *erreur = 0; + file_name = n_fichier; + scene -> undoStack().setClean(); + updateWindowTitle(); + return(true); + } else { + if (erreur != NULL) *erreur = 4; + return(false); + } + // cas 2 : l'element racine est un "project" + } else if (document.documentElement().tagName() == "project") { + // compte le nombre de schemas dans le projet + QList diagrams; + + QDomNodeList diagram_nodes = document.documentElement().elementsByTagName("diagram"); + for (uint i = 0 ; i < diagram_nodes.length() ; ++ i) { + if (diagram_nodes.at(i).isElement()) { + diagrams << diagram_nodes.at(i).toElement(); + } + } + + // il n'y aucun schema la-dedans + if (!diagrams.count()) { + if (erreur != NULL) *erreur = 4; + return(false); + } else { + + bool keep_doc_name = diagrams.count() == 1; + bool current_dv_loaded = false; + for (int i = 0 ; i < diagrams.count() ; ++ i) { + // cree un QDomDocument representant le schema + QDomDocument diagram_doc; + diagram_doc.appendChild(diagram_doc.importNode(diagrams[i], true)); + + // charge le premier schema valide et cree de nouveau DiagramView pour les suivants + if (!current_dv_loaded) { + if (scene -> fromXml(diagram_doc)) { + if (keep_doc_name) file_name = n_fichier; + scene -> undoStack().setClean(); + updateWindowTitle(); + current_dv_loaded = true; + } + } else { + DiagramView *new_dv = new DiagramView(parentWidget()); + if (new_dv -> scene -> fromXml(diagram_doc)) { + if (keep_doc_name) new_dv -> file_name = n_fichier; + new_dv -> scene -> undoStack().setClean(); + new_dv -> updateWindowTitle(); + diagramEditor() -> addDiagramView(new_dv); + } else { + delete(new_dv); + } + } + } + return(true); + } + } else { if (erreur != NULL) *erreur = 4; return(false); @@ -409,7 +473,15 @@ bool DiagramView::saveDiagramToFile(QString &n_fichier) { } QTextStream out(&fichier); out.setCodec("UTF-8"); - out << scene -> toXml().toString(4); + + // l'export XML du schema est encapsule dans un pseudo-projet + QDomDocument final_document; + QDomElement project_root = final_document.createElement("project"); + project_root.setAttribute("version", QET::version); + project_root.appendChild(final_document.importNode(scene -> toXml().documentElement(), true)); + final_document.appendChild(project_root); + + out << final_document.toString(4); fichier.close(); scene -> undoStack().setClean(); return(true); diff --git a/qetdiagrameditor.cpp b/qetdiagrameditor.cpp index cc12efc7f..48fa46293 100644 --- a/qetdiagrameditor.cpp +++ b/qetdiagrameditor.cpp @@ -27,20 +27,6 @@ QETDiagramEditor::QETDiagramEditor(const QStringList &files, QWidget *parent) : // mise en place du signalmapper connect(&windowMapper, SIGNAL(mapped(QWidget *)), &workspace, SLOT(setActiveWindow(QWidget *))); - // si des chemins de fichiers valides sont passes en arguments - QList diagram_views; - if (files.size()) { - // alors on ouvre ces fichiers - foreach(QString file, files) { - DiagramView *sv = new DiagramView(this); - if (sv -> open(file)) diagram_views << sv; - else delete sv; - } - } - - // si aucun schema n'a ete ouvert jusqu'a maintenant, on ouvre un nouveau schema - if (!diagram_views.size()) diagram_views << new DiagramView(this); - // titre de la fenetre setWindowTitle(tr("QElectroTech")); @@ -84,6 +70,20 @@ QETDiagramEditor::QETDiagramEditor(const QStringList &files, QWidget *parent) : setMinimumSize(QSize(500, 350)); setWindowState(Qt::WindowMaximized); + // si des chemins de fichiers valides sont passes en arguments + QList diagram_views; + if (files.size()) { + // alors on ouvre ces fichiers + foreach(QString file, files) { + DiagramView *sv = new DiagramView(this); + if (sv -> open(file)) diagram_views << sv; + else delete sv; + } + } + + // si aucun schema n'a ete ouvert jusqu'a maintenant, on ouvre un nouveau schema + if (!diagram_views.size()) diagram_views << new DiagramView(this); + // connexions signaux / slots pour une interface sensee connect(&workspace, SIGNAL(windowActivated(QWidget *)), this, SLOT(slot_updateWindowsMenu())); connect(&workspace, SIGNAL(windowActivated(QWidget *)), this, SLOT(slot_updateActions()));