From 371b8cb591e0a7f6d1a22563c8508cf717027e61 Mon Sep 17 00:00:00 2001 From: blacksun Date: Mon, 18 Jul 2016 17:37:02 +0000 Subject: [PATCH] Allow copy of elements from a project to another with the actions copy/paste git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@4581 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- .../elementcollectionhandler.cpp | 44 +++++++++++++++++++ .../elementcollectionhandler.h | 1 + .../xmlelementcollection.cpp | 17 +++++-- sources/diagram.cpp | 31 ++++++++++++- 4 files changed, 88 insertions(+), 5 deletions(-) diff --git a/sources/ElementsCollection/elementcollectionhandler.cpp b/sources/ElementsCollection/elementcollectionhandler.cpp index 6c6a8f583..efb69ee2f 100644 --- a/sources/ElementsCollection/elementcollectionhandler.cpp +++ b/sources/ElementsCollection/elementcollectionhandler.cpp @@ -18,6 +18,7 @@ #include "elementcollectionhandler.h" #include "renamedialog.h" #include "xmlelementcollection.h" +#include "qetproject.h" #include "qetxml.h" #include #include @@ -360,6 +361,49 @@ ElementsLocation ElementCollectionHandler::createDir(ElementsLocation &parent, c return ElementsLocation(); } +/** + * @brief ElementCollectionHandler::importFromProject + * Import the element represented by @location to the embedded collection of @project at the same path. + * @location must represente an element owned by a project embedded collection + * @param project : project where copy the element + * @param location : location to copy + * @return true if import with success + */ +bool ElementCollectionHandler::importFromProject(QETProject *project, ElementsLocation &location) +{ + if (!(location.isElement() && location.exist() && location.isProject())) return false; + + ElementsLocation destination(location.collectionPath(false), project); + if (destination.exist()) return true; + + QList names; + + //Get the parent of location and find if exist in embedded collection of project + ElementsLocation source = location.parent(); + names.append(location.fileName()); + + destination = ElementsLocation(source.collectionPath(), project); + + //Go back until to find an existing directory in destination + while (!destination.exist()) { + names.append(source.fileName()); + source = source.parent(); + destination = ElementsLocation(source.collectionPath(), project); + } + + XmlElementCollection *collection = project->embeddedElementCollection(); + + while (!names.isEmpty()) { + source.addToPath(names.takeLast()); + destination = collection->copy(source, destination, QString(), false); + + if (!destination.exist()) + return false; + } + + return true; +} + /** * @brief ElementCollectionHandler::setNames * Set the names stored in @name_list as the names of the item represented by location diff --git a/sources/ElementsCollection/elementcollectionhandler.h b/sources/ElementsCollection/elementcollectionhandler.h index cde781f48..676f5dea6 100644 --- a/sources/ElementsCollection/elementcollectionhandler.h +++ b/sources/ElementsCollection/elementcollectionhandler.h @@ -92,6 +92,7 @@ class ElementCollectionHandler ElementsLocation copy(ElementsLocation &source, ElementsLocation &destination); ElementsLocation createDir(ElementsLocation &parent, const QString &name, const NamesList &name_list); + bool importFromProject (QETProject *project, ElementsLocation &location); bool setNames(ElementsLocation &location, const NamesList &name_list); private: diff --git a/sources/ElementsCollection/xmlelementcollection.cpp b/sources/ElementsCollection/xmlelementcollection.cpp index d06732036..75ceef0ba 100644 --- a/sources/ElementsCollection/xmlelementcollection.cpp +++ b/sources/ElementsCollection/xmlelementcollection.cpp @@ -657,10 +657,10 @@ ElementsLocation XmlElementCollection::copyDirectory(ElementsLocation &source, E //Remove the previous directory with the same path QDomElement element = child(destination.collectionPath(false) + "/" + new_dir_name); - if (!element.isNull()) + if (!element.isNull()) { element.parentNode().removeChild(element); - - + emit directoryRemoved(destination.collectionPath(false) + "/" + new_dir_name); + } ElementsLocation created_location; @@ -703,7 +703,15 @@ ElementsLocation XmlElementCollection::copyDirectory(ElementsLocation &source, E { if (!source.projectCollection()) return ElementsLocation(); - QDomNode other_collection_node = source.projectCollection()->child(source.collectionPath(false)).cloneNode(true); + QDomNode other_collection_node = source.projectCollection()->child(source.collectionPath(false)).cloneNode(deep_copy); + + //We don't make a deep copy, but we must to get the local names of the copied directory + if (!deep_copy) { + QDomNode names = source.projectCollection()->child(source.collectionPath(false)).namedItem("names"); + if (!names.isNull() && names.isElement()) + other_collection_node.appendChild(names.cloneNode(true)); + } + if (other_collection_node.isNull()) return ElementsLocation(); QDomElement other_collection_dom_dir = other_collection_node.toElement(); @@ -713,6 +721,7 @@ ElementsLocation XmlElementCollection::copyDirectory(ElementsLocation &source, E created_location.setPath(destination.projectCollectionPath() + "/" + new_dir_name); } + emit directorieAdded(created_location.collectionPath(false)); return created_location; } diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 8c19d9ea2..dbf70e658 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -34,6 +34,8 @@ #include "terminal.h" #include "elementtextsmover.h" #include "diagrameventinterface.h" +#include "qetapp.h" +#include "elementcollectionhandler.h" const int Diagram::xGrid = 10; const int Diagram::yGrid = 10; @@ -466,6 +468,12 @@ QDomDocument Diagram::toXml(bool whole_content) { racine.setAttribute("conductorAutonum", m_conductors_autonum_name); } } + else { + //this method with whole_content to false, + //is often use to copy and paste the current selection + //so we add the id of the project where copy occur. + racine.setAttribute("projectId", QETApp::projectId(m_project)); + } document.appendChild(racine); // si le schema ne contient pas d'element (et donc pas de conducteurs), on retourne de suite le document XML @@ -659,7 +667,28 @@ bool Diagram::fromXml(QDomElement &document, QPointF position, bool consider_inf project_qet_version != -1 && project_qet_version < 0.3 && m_project -> state() == QETProject::ProjectParsingRunning ); - + + //If paste from another project + if (root.hasAttribute("projectId")) { + QETProject *other_project = QETApp::project(root.attribute("projectId", "-1").toInt()); + + //We try to paste from another project, then befor paste elements, + //we must to import the definition of the pasted elements (owned by other project) + //in the embedded collection of this project + if (other_project && other_project != m_project) { + ElementCollectionHandler ech; + foreach (QDomElement element_xml, QET::findInDomElement(root, "elements", "element")) { + if (!Element::valideXml(element_xml)) continue; + + QString type_id = element_xml.attribute("type"); + + if (type_id.startsWith("embed://")) { + ElementsLocation location(type_id, other_project); + ech.importFromProject(m_project, location); + } + } + } + } //Load all elements from the XML QList added_elements; QHash table_adr_id;