mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-29 23:40:51 +01:00
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:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user