[qet] [4375] New element panel : drag and drop an item from a project collection to a files system collection work. |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/qet Archives
]
Revision: 4375
Author: blacksun
Date: 2016-03-09 11:17:28 +0100 (Wed, 09 Mar 2016)
Log Message:
-----------
New element panel : drag and drop an item from a project collection to a files system collection work.
Modified Paths:
--------------
trunk/sources/ElementsCollection/elementcollectionhandler.cpp
trunk/sources/ElementsCollection/elementcollectionhandler.h
trunk/sources/ElementsCollection/xmlelementcollection.cpp
trunk/sources/ElementsCollection/xmlelementcollection.h
Modified: trunk/sources/ElementsCollection/elementcollectionhandler.cpp
===================================================================
--- trunk/sources/ElementsCollection/elementcollectionhandler.cpp 2016-03-06 22:51:47 UTC (rev 4374)
+++ trunk/sources/ElementsCollection/elementcollectionhandler.cpp 2016-03-09 10:17:28 UTC (rev 4375)
@@ -22,6 +22,8 @@
#include <QFile>
#include <QDir>
+/******************************************************/
+
ECHStrategy::ECHStrategy(ElementLocation &source, ElementLocation &destination) :
m_source(source),
m_destination (destination)
@@ -125,6 +127,115 @@
/******************************************************/
+ECHSXmlToFile::ECHSXmlToFile(ElementLocation &source, ElementLocation &destination) :
+ ECHStrategy(source, destination)
+{}
+
+ElementLocation ECHSXmlToFile::copy()
+{
+ //Check if the destination already have an item with the same name of the item to copy
+ ElementLocation location(m_destination.fileSystemPath() + "/" + m_source.fileName());
+ QString rename;
+ if (location.exist())
+ {
+ RenameDialog rd(location.fileSystemPath());
+ if (rd.exec() == QDialog::Accepted)
+ {
+ if (rd.selectedAction() == QET::Erase)
+ {
+ if (location.isDirectory())
+ {
+ QDir dir(location.fileSystemPath());
+ dir.removeRecursively();
+ }
+ else
+ {
+ QFile file(location.fileSystemPath());
+ file.remove();
+ }
+ }
+ else if (rd.selectedAction() == QET::Rename)
+ {
+ rename = rd.newName();
+ }
+ }
+ else
+ return ElementLocation();
+ }
+
+ if (m_source.isElement())
+ return copyElement(m_source, m_destination, rename);
+ else
+ return copyDirectory(m_source, m_destination, rename);
+}
+
+ElementLocation ECHSXmlToFile::copyDirectory(ElementLocation &source, ElementLocation &destination, QString rename)
+{
+ QDir destination_dir(destination.fileSystemPath());
+
+ if (!(destination_dir.exists() && source.exist())) return ElementLocation();
+
+ QString new_dir_name = rename.isEmpty() ? source.fileName() : rename;
+
+ //Create new dir
+ if (destination_dir.mkdir(new_dir_name))
+ {
+ QDir created_dir(destination_dir.canonicalPath() + "/" + new_dir_name);
+ ElementLocation created_location(created_dir.canonicalPath());
+
+ //Create the qet-directory file
+ QDomDocument document;
+ QDomElement root = document.createElement("qet-directory");
+ document.appendChild(root);
+ root.appendChild(source.nameList().toXml(document));
+
+ QString filepath = created_dir.canonicalPath() + "/qet_directory";
+ QET::writeXmlFile(document, filepath);
+
+ //Create all directory found in source to created_dir
+ XmlElementCollection *project_collection = source.projectCollection();
+
+ QStringList directories_names = project_collection->directoriesNames( project_collection->directory(source.collectionPath(false)) );
+ foreach(QString name, directories_names)
+ {
+ ElementLocation sub_source_dir(source.projectCollectionPath() + "/" + name);
+ copyDirectory(sub_source_dir, created_location);
+ }
+
+ //Create all elements found in source to destination
+ QStringList elements_names = project_collection->elementsNames( project_collection->directory(source.collectionPath(false))) ;
+ foreach (QString name, elements_names)
+ {
+ ElementLocation source_element(source.projectCollectionPath() + "/" + name);
+ copyElement(source_element, created_location);
+ }
+
+ return created_location;
+ }
+
+ return ElementLocation();
+}
+
+ElementLocation ECHSXmlToFile::copyElement(ElementLocation &source, ElementLocation &destination, QString rename)
+{
+ if (!(destination.exist() && source.exist())) return ElementLocation();
+
+ QString new_element_name = rename.isEmpty() ? source.fileName() : rename;
+
+ //Get the xml descrption of the element
+ QDomDocument document;
+ document.appendChild(document.importNode(source.xml(), true));
+
+ //Create the .elmt file
+ QString filepath = destination.fileSystemPath() + "/" + new_element_name;
+ if (QET::writeXmlFile(document, filepath))
+ return ElementLocation(filepath);
+ else
+ return ElementLocation();
+}
+
+/******************************************************/
+
ECHSToXml::ECHSToXml(ElementLocation &source, ElementLocation &destination) :
ECHStrategy(source, destination)
{}
@@ -152,6 +263,8 @@
return m_destination.projectCollection()->copy(m_source, m_destination, rename);
}
+/******************************************************/
+
/**
* @brief ElementCollectionHandler::ElementCollectionHandler
* @param widget
@@ -177,6 +290,7 @@
if (!source.exist() || !destination.exist() || destination.isElement()) return ElementLocation();
if (source.isFileSystem() && destination.isFileSystem()) m_strategy = new ECHSFileToFile(source, destination);
+ if (source.isProject() && destination.isFileSystem()) m_strategy = new ECHSXmlToFile(source, destination);
else if (destination.isProject()) m_strategy = new ECHSToXml(source, destination);
if (m_strategy)
Modified: trunk/sources/ElementsCollection/elementcollectionhandler.h
===================================================================
--- trunk/sources/ElementsCollection/elementcollectionhandler.h 2016-03-06 22:51:47 UTC (rev 4374)
+++ trunk/sources/ElementsCollection/elementcollectionhandler.h 2016-03-09 10:17:28 UTC (rev 4375)
@@ -39,7 +39,6 @@
/**
* @brief The ECHSFileToFile class
* Manage the copy of directory or element from a file system collection to another file system collection
- * (Work only if the source is the common collection and the destination is the custom collection)
*/
class ECHSFileToFile : public ECHStrategy
{
@@ -53,6 +52,21 @@
};
/**
+ * @brief The ECHSXmlToFile class
+ * Manage the copy of a directory or element from an xml collection to a file.
+ */
+class ECHSXmlToFile : public ECHStrategy
+{
+ public:
+ ECHSXmlToFile (ElementLocation &source, ElementLocation &destination);
+ ElementLocation copy();
+
+ private:
+ ElementLocation copyDirectory(ElementLocation &source, ElementLocation &destination, QString rename = QString());
+ ElementLocation copyElement(ElementLocation &source, ElementLocation &destination, QString rename = QString());
+};
+
+/**
* @brief The ECHSToXml class
* Manage the copy of a directory or element from a collection (no matter if the source is a file system collection or an xml collection)
* to an xml collection
Modified: trunk/sources/ElementsCollection/xmlelementcollection.cpp
===================================================================
--- trunk/sources/ElementsCollection/xmlelementcollection.cpp 2016-03-06 22:51:47 UTC (rev 4374)
+++ trunk/sources/ElementsCollection/xmlelementcollection.cpp 2016-03-09 10:17:28 UTC (rev 4375)
@@ -178,6 +178,26 @@
}
/**
+ * @brief XmlElementCollection::directoriesNames
+ * @param parent_element
+ * @return a list of names for every child directories of @parent_element
+ */
+QStringList XmlElementCollection::directoriesNames(const QDomElement &parent_element)
+{
+ QList <QDomElement> childs = directories(parent_element);
+ QStringList names;
+
+ foreach (QDomElement child, childs)
+ {
+ QString name = child.attribute("name");
+ if (!name.isEmpty())
+ names.append(name);
+ }
+
+ return names;
+}
+
+/**
* @brief XmlElementCollection::elements
* @param parent_element
* @return A list of element stored in @parent_element
@@ -199,6 +219,26 @@
}
/**
+ * @brief XmlElementCollection::elementsNames
+ * @param parent_element
+ * @return A list of names fr every childs element of @parent_element
+ */
+QStringList XmlElementCollection::elementsNames(const QDomElement &parent_element)
+{
+ QList <QDomElement> childs = elements(parent_element);
+ QStringList names;
+
+ foreach (QDomElement child, childs)
+ {
+ QString name = child.attribute("name");
+ if (!name.isEmpty())
+ names.append(name);
+ }
+
+ return names;
+}
+
+/**
* @brief XmlElementCollection::element
* @param path : path of element : the path must start by "import/",
* because import is the first directory of an xml collection
Modified: trunk/sources/ElementsCollection/xmlelementcollection.h
===================================================================
--- trunk/sources/ElementsCollection/xmlelementcollection.h 2016-03-06 22:51:47 UTC (rev 4374)
+++ trunk/sources/ElementsCollection/xmlelementcollection.h 2016-03-09 10:17:28 UTC (rev 4375)
@@ -41,7 +41,9 @@
QDomElement child(const QDomElement &parent_element, const QString &child_name) const;
QDomElement child(const QString &path) const;
QList<QDomElement> directories(const QDomElement &parent_element);
+ QStringList directoriesNames(const QDomElement &parent_element);
QList<QDomElement> elements(const QDomElement &parent_element);
+ QStringList elementsNames(const QDomElement &parent_element);
QDomElement element(const QString &path);
QDomElement directory(const QString &path);
QString addElement (const QString &path);