New element panel can display the thumbnail of elements used in a project

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@4293 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
blacksun
2015-12-30 09:39:22 +00:00
parent 72c65f80ad
commit 313e4b9793
20 changed files with 462 additions and 126 deletions

View File

@@ -19,6 +19,9 @@
#include "qetapp.h"
#include "qetproject.h"
#include "elementscollectioncache.h"
#include "xmlelementcollection.h"
#include "elementfactory.h"
#include "element.h"
/**
* @brief ElementLocation::ElementLocation
@@ -34,6 +37,7 @@ ElementLocation::ElementLocation(QString path):
/**
* @brief ElementLocation::ElementLocation
* @param path : path of item embedded in @project
* The path must be in form : embed://dir/subdir/myElement.elmt
* @param project : project
*/
ElementLocation::ElementLocation(QString path, QETProject *project) :
@@ -58,116 +62,148 @@ bool ElementLocation::setPath(QString path)
{
QString tmp_path = path;
//The path is in file system
if (!m_project)
//There is a project, the path is for an embedded coolection.
if (m_project)
{
//The given path is relative to common or custom collection
if (path.startsWith("common://") || path.startsWith("custom://"))
if (path.startsWith("embed://"))
{
QString p;
if (path.startsWith("common://"))
{
tmp_path.remove("common://");
p = QETApp::commonElementsDir() + tmp_path;
}
else
{
tmp_path.remove("custom://");
p = QETApp::customElementsDir() + tmp_path;
}
m_collection_path = path;
return true;
}
else
return false;
}
//This is an element
if (path.endsWith(".elmt"))
//The path start with project, we get the project and the path from the string
else if (tmp_path.startsWith("project"))
{
QRegExp rx("^project([0-9]+)\\+(embed:\\/\\/.*)$", Qt::CaseInsensitive);
if (rx.exactMatch(tmp_path))
{
bool conv_ok;
uint project_id = rx.capturedTexts().at(1).toUInt(&conv_ok);
if (conv_ok)
{
QFile file(p);
if (file.exists())
QETProject *project = QETApp::project(project_id);
if (project)
{
m_file_system_path = p;
m_collection_path = path;
m_collection_path = rx.capturedTexts().at(2);
m_project = project;
return true;
}
return false;
}
//They must be a directory
else
{
QDir dir(p);
if(dir.exists())
{
m_file_system_path = p;
m_collection_path = path;
return true;
}
return false;
}
}
//In this case, the path is supposed to be relative to the file system.
return false;
}
//The path is in file system, the given path is relative to common or custom collection
else if (path.startsWith("common://") || path.startsWith("custom://"))
{
QString p;
if (path.startsWith("common://"))
{
tmp_path.remove("common://");
p = QETApp::commonElementsDir() + tmp_path;
}
else
{
if(path.endsWith(".elmt"))
tmp_path.remove("custom://");
p = QETApp::customElementsDir() + tmp_path;
}
//This is an element
if (path.endsWith(".elmt"))
{
QFile file(p);
if (file.exists())
{
QFile file(path);
if (file.exists())
{
m_file_system_path = path;
if (path.startsWith(QETApp::commonElementsDir()))
{
path.remove(QETApp::commonElementsDir());
path.prepend("common://");
m_collection_path = path;
}
else if (path.startsWith(QETApp::customElementsDir()))
{
path.remove(QETApp::customElementsDir());
path.prepend("custom://");
m_collection_path = path;
}
return true;
}
return false;
m_file_system_path = p;
m_collection_path = path;
return true;
}
else
return false;
}
//They must be a directory
else
{
QDir dir(p);
if(dir.exists())
{
QDir dir(path);
if (dir.exists())
{
m_file_system_path = path;
if (path.startsWith(QETApp::commonElementsDir()))
{
path.remove(QETApp::commonElementsDir());
path.prepend("common://");
m_collection_path = path;
}
else if (path.startsWith(QETApp::customElementsDir()))
{
path.remove(QETApp::customElementsDir());
path.prepend("custom://");
m_collection_path = path;
}
return true;
}
return false;
m_file_system_path = p;
m_collection_path = path;
return true;
}
return false;
}
}
//In this case, the path is supposed to be relative to the file system.
else
{
if(path.endsWith(".elmt"))
{
QFile file(path);
if (file.exists())
{
m_file_system_path = path;
if (path.startsWith(QETApp::commonElementsDir()))
{
path.remove(QETApp::commonElementsDir());
path.prepend("common://");
m_collection_path = path;
}
else if (path.startsWith(QETApp::customElementsDir()))
{
path.remove(QETApp::customElementsDir());
path.prepend("custom://");
m_collection_path = path;
}
return true;
}
return false;
}
else
{
QDir dir(path);
if (dir.exists())
{
m_file_system_path = path;
if (path.startsWith(QETApp::commonElementsDir()))
{
path.remove(QETApp::commonElementsDir());
path.prepend("common://");
m_collection_path = path;
}
else if (path.startsWith(QETApp::customElementsDir()))
{
path.remove(QETApp::customElementsDir());
path.prepend("custom://");
m_collection_path = path;
}
return true;
}
return false;
}
}
return false;
}
/**
* @brief ElementLocation::isNull
* @return True represent nothing
*/
bool ElementLocation::isNull() const
{
if (m_file_system_path.isEmpty())
return true;
else
return false;
if (!m_file_system_path.isEmpty()) return false;
else if (!m_collection_path.isEmpty()) return false;
else return true;
}
/**
* @brief ElementLocation::setProject
* @param project : set the project of this location to @project.
*/
void ElementLocation::setProject(QETProject *project)
{
void ElementLocation::setProject(QETProject *project) {
m_project = project;
}
@@ -233,6 +269,20 @@ QDomElement ElementLocation::xml()
if (docu.setContent(&file))
m_xml = docu.documentElement().cloneNode().toElement();
}
else
{
QString str = m_collection_path;
if (isElement())
{
QDomElement element = m_project->embeddedElementCollection()->element(str.remove("embed://"));
m_xml = element.firstChildElement("definition");
}
else
{
QDomElement element = m_project->embeddedElementCollection()->directory(str.remove("embed://"));
m_xml = element;
}
}
return m_xml;
}
@@ -254,22 +304,65 @@ QUuid ElementLocation::uuid()
return m_uuid;
}
/**
* @brief ElementLocation::icon
* @return The icon of the represented element.
* If icon can't be set, return a null QIcon
*/
QIcon ElementLocation::icon()
{
if (!m_icon.isNull()) return m_icon;
ElementsCollectionCache *cache = QETApp::collectionCache();
if (cache->fetchElement(*this))
m_icon = QIcon(cache->pixmap());
if (!m_project)
{
ElementsCollectionCache *cache = QETApp::collectionCache();
if (cache->fetchElement(*this))
m_icon = QIcon(cache->pixmap());
}
else
{
ElementFactory *factory = ElementFactory::Instance();
int state;
Element *elmt = factory->createElement(*this, 0, &state);
if (state == 0)
m_icon = QIcon(elmt->pixmap());
}
return m_icon;
}
/**
* @brief ElementLocation::name
* @return The name of the represented element in the current local
*/
QString ElementLocation::name()
{
ElementsCollectionCache *cache = QETApp::collectionCache();
if (cache->fetchElement(*this))
return cache->name();
if (!m_project)
{
ElementsCollectionCache *cache = QETApp::collectionCache();
if (cache->fetchElement(*this))
return cache->name();
else
return QString();
}
else
return QString();
{
NamesList nl;
nl.fromXml(xml());
return nl.name(fileName());
}
}
/**
* @brief ElementLocation::fileName
* @return Return the file name of this element whatever the storage system (file system, xml collection)
*/
QString ElementLocation::fileName() const
{
if (m_collection_path.isEmpty()) return QString();
QStringList qsl = m_collection_path.split("/");
if (qsl.isEmpty()) return QString();
else return qsl.last();
}

View File

@@ -49,10 +49,11 @@ class ElementLocation
QETProject *project() const;
QDomElement xml();
QDomElement xml();
QUuid uuid();
QIcon icon();
QString name();
QString fileName() const;
private:
QString m_collection_path;

View File

@@ -16,12 +16,17 @@
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#include "xmlelementcollection.h"
#include "qdebug.h"
#include "nameslist.h"
/**
* @brief XmlElementCollection::XmlElementCollection
* Build an empty collection
* Build an empty collection.
* The collection start by :
* <collection>
* <category name="import>
* </category>
* </collection>
* All elements and category are stored as child of <category name="import>
* @param parent
*/
XmlElementCollection::XmlElementCollection(QObject *parent) :
@@ -130,3 +135,75 @@ QList<QDomElement> XmlElementCollection::elements(const QDomElement &parent_elem
return element_list;
}
/**
* @brief XmlElementCollection::element
* @param path : path of element : the path must start by "import/",
* because import is the first directory of an xml collection
* @return the QDomElement that represent the element at path @path
* or a null QDomElement if not found or doesn't represent an element
*/
QDomElement XmlElementCollection::element(const QString &path)
{
if (!path.endsWith(".elmt")) return QDomElement();
QStringList path_list = path.split("/");
QString element_name = path_list.last();
path_list.removeLast();
QDomElement dom_element = directory(path_list.join("/"));
if (dom_element.isNull()) return QDomElement();
QDomNodeList node_list = dom_element.elementsByTagName("element");
if (node_list.isEmpty()) return QDomElement();
for (int i=0 ; i <node_list.size() ; i++)
{
QDomNode node = node_list.at(i);
if (node.isElement())
{
QDomElement qde = node.toElement();
if (qde.attribute("name") == element_name)
return qde;
}
}
return QDomElement();
}
/**
* @brief XmlElementCollection::directory
* @param path : path of directory : the path must start by "import/",
* because import is the first directory of an xml collection
* @return the QDomElement that represent the directory at path @path
* or a null QDomElement if not found.
*/
QDomElement XmlElementCollection::directory(const QString &path)
{
QStringList path_list = path.split("/");
QDomElement dom_element = m_dom_document.documentElement();
for (int i=0 ; i<path_list.size() ; i++)
{
QDomNodeList node_list = dom_element.elementsByTagName("category");
if (node_list.isEmpty()) return QDomElement();
for (int j=0 ; j <node_list.size() ; j++)
{
QDomNode node = node_list.at(j);
if (node.isElement())
{
QDomElement qde = node.toElement();
if (qde.attribute("name") == path_list.at(i))
{
dom_element = node.toElement();
j = node_list.size(); //Use to go out of the for loop
}
else if (j == node_list.size()-1)
return QDomElement();
}
}
}
return dom_element;
}

View File

@@ -23,6 +23,10 @@
class QDomElement;
/**
* @brief The XmlElementCollection class
* This class represent a collection of elements stored to xml
*/
class XmlElementCollection : public QObject
{
Q_OBJECT
@@ -33,6 +37,8 @@ class XmlElementCollection : public QObject
QDomNodeList childs(const QDomElement &parent_element);
QList<QDomElement> directory(const QDomElement &parent_element);
QList<QDomElement> elements(const QDomElement &parent_element);
QDomElement element(const QString &path);
QDomElement directory(const QString &path);
signals:

View File

@@ -21,6 +21,7 @@
#include "xmlelementcollection.h"
#include "nameslist.h"
#include "qetapp.h"
#include "elementlocation.h"
#include <algorithm>
/**
@@ -81,7 +82,14 @@ QVariant XmlProjectElementCollectionItem::data(int column, int role)
else if (isDir())
return QET::Icons::Folder;
else
return QET::Icons::Element;
{
if (m_icon.isNull())
{
ElementLocation loc(embeddedPath(), m_project);
m_icon = loc.icon();
}
return m_icon;
}
break;
case Qt::ToolTipRole:
if (isCollectionRoot())
@@ -151,23 +159,8 @@ QString XmlProjectElementCollectionItem::name()
}
else
{
NamesList nl;
if (isDir())
{
nl.fromXml(m_dom_element);
if (nl.name().isEmpty())
m_name = m_dom_element.attribute("name");
else
m_name = nl.name();
}
else
{
nl.fromXml(m_dom_element.firstChildElement("definition"));
if (nl.name().isEmpty())
m_name = m_dom_element.attribute("name");
else
m_name = nl.name();
}
ElementLocation location (embeddedPath(), m_project);
m_name = location.name();
return m_name;
}
}
@@ -210,7 +203,8 @@ bool XmlProjectElementCollectionItem::isElement() const
/**
* @brief XmlProjectElementCollectionItem::collectionPath
* @return The collection path of this item
* @return The collection path of this item.
* The path is in form : project0+embed://dir/subdir/myElement.elmt
*/
QString XmlProjectElementCollectionItem::collectionPath() const
{
@@ -230,6 +224,28 @@ QString XmlProjectElementCollectionItem::collectionPath() const
}
}
/**
* @brief XmlProjectElementCollectionItem::embeddedPath
* @return The embedde path of this item
* The path is in form : embed://dir/subdir/myElement.elmt
*/
QString XmlProjectElementCollectionItem::embeddedPath() const
{
if (isCollectionRoot())
{
return "embed://";
}
else
{
XmlProjectElementCollectionItem *parent = static_cast<XmlProjectElementCollectionItem *>(m_parent_item);
if (parent->isCollectionRoot())
return parent->embeddedPath() + m_dom_element.attribute("name");
else
return parent->embeddedPath() + "/" + m_dom_element.attribute("name");
}
}
/**
* @brief XmlProjectElementCollectionItem::populate
* Populate this item

View File

@@ -21,6 +21,7 @@
#include "elementcollectionitem.h"
#include <QDomElement>
#include <QIcon>
class QETProject;
@@ -51,6 +52,7 @@ class XmlProjectElementCollectionItem : public ElementCollectionItem
virtual bool isDir() const;
virtual bool isElement() const;
QString collectionPath() const;
QString embeddedPath() const;
private:
void populate();
@@ -58,6 +60,7 @@ class XmlProjectElementCollectionItem : public ElementCollectionItem
private:
QETProject *m_project;
QDomElement m_dom_element;
QIcon m_icon;
};
#endif // XMLPROJECTELEMENTCOLLECTIONITEM_H