diff --git a/elementperso.cpp b/elementperso.cpp index bead7b794..056951465 100644 --- a/elementperso.cpp +++ b/elementperso.cpp @@ -7,8 +7,6 @@ ElementPerso::ElementPerso(QString &nom_fichier, QGraphicsItem *qgi, Schema *s, elmt_etat = -1; // le fichier doit exister - QString chemin_elements = "elements/"; - nomfichier = chemin_elements + nom_fichier; if (!QFileInfo(nomfichier).exists()) { if (etat != NULL) *etat = 1; elmt_etat = 1; diff --git a/elements/contacteur.elmt b/elements/contacteur.elmt index 0969a5ed1..30994bcab 100644 --- a/elements/contacteur.elmt +++ b/elements/contacteur.elmt @@ -1,4 +1,3 @@ - diff --git a/panelappareils.cpp b/panelappareils.cpp index 41cd4371f..8b071e80c 100644 --- a/panelappareils.cpp +++ b/panelappareils.cpp @@ -4,51 +4,33 @@ /** Constructeur @param parent Le QWidget parent du panel d'appareils - @todo : definir une classe heritant de QListWidgetItem et automatiser tout ca */ -PanelAppareils::PanelAppareils(QWidget *parent) : QListWidget(parent) { +PanelAppareils::PanelAppareils(QWidget *parent) : QTreeWidget(parent) { // selection unique setSelectionMode(QAbstractItemView::SingleSelection); + setColumnCount(1); + setHeaderLabel("Elements"); // drag'n drop autorise setDragEnabled(true); setAcceptDrops(false); setDropIndicatorShown(false); - // style, mouvement et taille des elements + // taille des elements setIconSize(QSize(50, 50)); - setMovement(QListView::Free); - setViewMode(QListView::ListMode); - // donnees - /*Element *del = new DEL(0,0); - Element *contacteur = new Contacteur(0,0); - Element *entree = new Entree(0, 0);*/ - - QListWidgetItem *qlwi; - QString whats_this = tr("Ceci est un \351l\351ment que vous pouvez ins\351rer dans votre sch\351ma par cliquer-d\351placer"); - QString tool_tip = tr("Cliquer-d\351posez cet \351l\351ment sur le sch\351ma pour ins\351rer un \351l\351ment "); + QTreeWidgetItem *elmts_qet = new QTreeWidgetItem(this, QStringList(tr("Collection QET"))); + QTreeWidgetItem *elmts_perso = new QTreeWidgetItem(this, QStringList(tr("Collection utilisateur"))); // remplissage de la liste - QDir dossier_elements("elements/"); - QStringList filtres; - filtres << "*.elmt"; - QStringList fichiers = dossier_elements.entryList(filtres, QDir::Files, QDir::Name); - foreach(QString fichier, fichiers) { - int etat; - ElementPerso *elmt_perso = new ElementPerso(fichier, 0, 0, &etat); - if (etat != 0) { - qDebug() << "Le chargement du composant" << fichier << "a echoue avec le code d'erreur" << etat; - continue; - } - qlwi = new QListWidgetItem(QIcon(elmt_perso -> pixmap()), elmt_perso -> nom(), this); - qlwi -> setStatusTip(tool_tip + "\253 " + elmt_perso -> nom() + " \273"); - qlwi -> setToolTip(elmt_perso -> nom()); - qlwi -> setWhatsThis(whats_this); - qlwi -> setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); - qlwi -> setData(42, fichier); - } + QDir dossier_elmts_qet(QETApp::commonElementsDir()); + QDir dossier_elmts_perso(QETApp::customElementsDir()); + QStringList filtres("*.elmt"); + QStringList fichiers1 = dossier_elmts_qet.entryList(filtres, QDir::Files, QDir::Name); + foreach(QString fichier, fichiers1) ajouterFichier(elmts_qet, QETApp::commonElementsDir()+fichier); + QStringList fichiers2 = dossier_elmts_perso.entryList(filtres, QDir::Files, QDir::Name); + foreach(QString fichier, fichiers2) ajouterFichier(elmts_perso, QETApp::customElementsDir()+fichier); // force du noir sur une alternance de blanc (comme le schema) et de bleu clair QPalette qp = palette(); @@ -77,6 +59,10 @@ void PanelAppareils::dropEvent(QDropEvent */*e*/) { @todo virer les lignes type «if ("tel appareil") construire TelAppareil» => trouver un moyen d'automatiser ca */ void PanelAppareils::startDrag(Qt::DropActions /*supportedActions*/) { + // recupere le nom du fichier decrivant l'element + QString nom_fichier = currentItem() -> data(0, 42).toString(); + if (nom_fichier == QString()) return; + // objet QDrag pour realiser le drag'n drop QDrag *drag = new QDrag(this); @@ -84,10 +70,8 @@ void PanelAppareils::startDrag(Qt::DropActions /*supportedActions*/) { QMimeData *mimeData = new QMimeData(); // appareil temporaire pour fournir un apercu - Element *appar; int etat; - QString nom_fichier = currentItem() -> data(42).toString(); - appar = new ElementPerso(nom_fichier, 0, 0, &etat); + Element *appar = new ElementPerso(nom_fichier, 0, 0, &etat); if (etat != 0) { delete appar; return; @@ -106,3 +90,26 @@ void PanelAppareils::startDrag(Qt::DropActions /*supportedActions*/) { // suppression de l'appareil temporaire delete appar; } + +/** + Methode privee permettant d'ajouter un element au panel d'appareils + @param qtwi_parent QTreeWidgetItem parent sous lequel sera insere l'element + @param fichier Chemin absolu du fichier XML decrivant l'element a inserer +*/ +void PanelAppareils::ajouterFichier(QTreeWidgetItem *qtwi_parent, QString fichier) { + QString whats_this = tr("Ceci est un \351l\351ment que vous pouvez ins\351rer dans votre sch\351ma par cliquer-d\351placer"); + QString tool_tip = tr("Cliquer-d\351posez cet \351l\351ment sur le sch\351ma pour ins\351rer un \351l\351ment "); + int etat; + ElementPerso *elmt_perso = new ElementPerso(fichier, 0, 0, &etat); + if (etat != 0) { + qDebug() << "Le chargement du composant" << fichier << "a echoue avec le code d'erreur" << etat; + return; + } + QTreeWidgetItem *qtwi = new QTreeWidgetItem(qtwi_parent, QStringList(elmt_perso -> nom())); + qtwi -> setStatusTip(0, tool_tip + "\253 " + elmt_perso -> nom() + " \273"); + qtwi -> setToolTip(0, elmt_perso -> nom()); + qtwi -> setWhatsThis(0, whats_this); + qtwi -> setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); + qtwi -> setIcon(0, QIcon(elmt_perso -> pixmap())); + qtwi -> setData(0, 42, fichier); +} diff --git a/panelappareils.h b/panelappareils.h index f8313c61a..80dd1fc22 100644 --- a/panelappareils.h +++ b/panelappareils.h @@ -1,12 +1,13 @@ #ifndef PANELAPPAREILS_H #define PANELAPPAREILS_H #include + #include "qetapp.h" /** Cette classe represente le panel d'appareils (en tant qu'element graphique) dans lequel l'utilisateur choisit les composants de son choix et les depose sur le schema par drag'n drop. */ - class PanelAppareils : public QListWidget { + class PanelAppareils : public QTreeWidget { Q_OBJECT public: PanelAppareils(QWidget * = 0); @@ -14,5 +15,7 @@ void dragMoveEvent(QDragMoveEvent *); void dropEvent(QDropEvent *); void startDrag(Qt::DropActions); + private: + void ajouterFichier(QTreeWidgetItem *, QString); }; #endif diff --git a/qetapp.cpp b/qetapp.cpp index 7a9f13c77..9aa313abe 100644 --- a/qetapp.cpp +++ b/qetapp.cpp @@ -732,3 +732,25 @@ void QETApp::slot_updateMenuFenetres() { windowMapper.setMapping(action, sv); } } + +/** + @return Le chemin du dossier dans lequel QET doit chercher les definitions XML des elements communs +*/ +QString QETApp::commonElementsDir() { + return(QDir::current().path() + "/elements/"); +} + +/** + @return Le chemin du dossier dans lequel QET doit chercher les definitions XML des elements propres a l'utilisateur +*/ +QString QETApp::customElementsDir() { + return(QETApp::configDir() + "elements/"); +} + +QString QETApp::configDir() { +#ifdef Q_OS_WIN32 + return(QDir::homePath() + "\Application Data\qet\\"); +#else + return(QDir::homePath() + "/.qet/"); +#endif +} diff --git a/qetapp.h b/qetapp.h index ef334cb60..aa6a4cfc3 100644 --- a/qetapp.h +++ b/qetapp.h @@ -15,7 +15,9 @@ QETApp(QWidget *parent=0); void closeEvent(QCloseEvent * event ); void addSchemaVue(SchemaVue *); - + static QString commonElementsDir(); + static QString customElementsDir(); + static QString QETApp::configDir(); public slots: void systray(QSystemTrayIcon::ActivationReason raison); void systrayReduire(); diff --git a/schema.cpp b/schema.cpp index 3b25ad58e..a4a364444 100644 --- a/schema.cpp +++ b/schema.cpp @@ -135,11 +135,17 @@ QDomDocument Schema::toXml(bool schema) { // table de correspondance entre les adresses des bornes et leurs ids QHash table_adr_id; QDomElement elements = document.createElement("elements"); + QDir dossier_elmts_persos = QDir(QETApp::customElementsDir()); foreach(Element *elmt, liste_elements) { QDomElement element = document.createElement("element"); - // type, position, selection et orientation - element.setAttribute("type", QFileInfo(elmt -> typeId()).fileName()); + // type + QString chemin_elmt = elmt -> typeId(); + QString type_elmt = QString(""); + if (QFileInfo(chemin_elmt).dir() == dossier_elmts_persos) type_elmt = "perso://"; + element.setAttribute("type", type_elmt + QFileInfo(chemin_elmt).fileName()); + + // position, selection et orientation element.setAttribute("x", elmt -> pos().x()); element.setAttribute("y", elmt -> pos().y()); if (elmt -> isSelected()) element.setAttribute("selected", "selected"); @@ -291,13 +297,11 @@ bool Schema::fromXml(QDomDocument &document, QPointF position) { Element *Schema::elementFromXml(QDomElement &e, QHash &table_id_adr) { // cree un element dont le type correspond à l'id type QString type = e.attribute("type"); + QString chemin_fichier; + if (type.startsWith("perso://")) chemin_fichier = QETApp::commonElementsDir() + type.right(type.size()-8); + else chemin_fichier = QETApp::commonElementsDir() + type; int etat; - Element *nvel_elmt = new ElementPerso(type, 0, 0, &etat); - /*switch(e.attribute("type").toInt()) { - case 0: nvel_elmt = new Contacteur(); break; - case 1: nvel_elmt = new DEL(); break; - case 2: nvel_elmt = new Entree(); break; - }*/ + Element *nvel_elmt = new ElementPerso(chemin_fichier, 0, 0, &etat); if (etat != 0) return(false); bool retour = nvel_elmt -> fromXml(e, table_id_adr); if (!retour) { diff --git a/schema.h b/schema.h index 693126691..3ba096997 100644 --- a/schema.h +++ b/schema.h @@ -4,6 +4,7 @@ #define GRILLE_Y 10 #include #include + #include class Element; class Borne; class Schema : public QGraphicsScene {