Gestion de deux dossiers distincts pour les descriptions XML des elements ; amelioration du panel d'appareils.

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@6 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavierqet 2006-10-28 19:39:43 +00:00
parent 60fe06f126
commit f0c4be6a43
8 changed files with 83 additions and 47 deletions

View File

@ -7,8 +7,6 @@ ElementPerso::ElementPerso(QString &nom_fichier, QGraphicsItem *qgi, Schema *s,
elmt_etat = -1; elmt_etat = -1;
// le fichier doit exister // le fichier doit exister
QString chemin_elements = "elements/";
nomfichier = chemin_elements + nom_fichier;
if (!QFileInfo(nomfichier).exists()) { if (!QFileInfo(nomfichier).exists()) {
if (etat != NULL) *etat = 1; if (etat != NULL) *etat = 1;
elmt_etat = 1; elmt_etat = 1;

View File

@ -1,4 +1,3 @@
<!-- orientation : 4 lettres = nord/sud/est/ouest avec d = default, y = yes et n = no -->
<definition type="element" nom="contacteur" width="15" height="70" hotspot_x="10" hotspot_y="5" orientation="dnny"> <definition type="element" nom="contacteur" width="15" height="70" hotspot_x="10" hotspot_y="5" orientation="dnny">
<ligne x1="-5" y1="19" x2="0" y2="40" antialias="true" style="normal" /> <ligne x1="-5" y1="19" x2="0" y2="40" antialias="true" style="normal" />
<ligne x1="0" y1="0" x2="0" y2="20" antialias="false" style="normal" /> <ligne x1="0" y1="0" x2="0" y2="20" antialias="false" style="normal" />

View File

@ -4,51 +4,33 @@
/** /**
Constructeur Constructeur
@param parent Le QWidget parent du panel d'appareils @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 // selection unique
setSelectionMode(QAbstractItemView::SingleSelection); setSelectionMode(QAbstractItemView::SingleSelection);
setColumnCount(1);
setHeaderLabel("Elements");
// drag'n drop autorise // drag'n drop autorise
setDragEnabled(true); setDragEnabled(true);
setAcceptDrops(false); setAcceptDrops(false);
setDropIndicatorShown(false); setDropIndicatorShown(false);
// style, mouvement et taille des elements // taille des elements
setIconSize(QSize(50, 50)); setIconSize(QSize(50, 50));
setMovement(QListView::Free);
setViewMode(QListView::ListMode);
// donnees QTreeWidgetItem *elmts_qet = new QTreeWidgetItem(this, QStringList(tr("Collection QET")));
/*Element *del = new DEL(0,0); QTreeWidgetItem *elmts_perso = new QTreeWidgetItem(this, QStringList(tr("Collection utilisateur")));
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 ");
// remplissage de la liste // remplissage de la liste
QDir dossier_elements("elements/"); QDir dossier_elmts_qet(QETApp::commonElementsDir());
QStringList filtres; QDir dossier_elmts_perso(QETApp::customElementsDir());
filtres << "*.elmt"; QStringList filtres("*.elmt");
QStringList fichiers = dossier_elements.entryList(filtres, QDir::Files, QDir::Name); QStringList fichiers1 = dossier_elmts_qet.entryList(filtres, QDir::Files, QDir::Name);
foreach(QString fichier, fichiers) { foreach(QString fichier, fichiers1) ajouterFichier(elmts_qet, QETApp::commonElementsDir()+fichier);
int etat; QStringList fichiers2 = dossier_elmts_perso.entryList(filtres, QDir::Files, QDir::Name);
ElementPerso *elmt_perso = new ElementPerso(fichier, 0, 0, &etat); foreach(QString fichier, fichiers2) ajouterFichier(elmts_perso, QETApp::customElementsDir()+fichier);
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);
}
// force du noir sur une alternance de blanc (comme le schema) et de bleu clair // force du noir sur une alternance de blanc (comme le schema) et de bleu clair
QPalette qp = palette(); 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 @todo virer les lignes type «if ("tel appareil") construire TelAppareil» => trouver un moyen d'automatiser ca
*/ */
void PanelAppareils::startDrag(Qt::DropActions /*supportedActions*/) { 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 // objet QDrag pour realiser le drag'n drop
QDrag *drag = new QDrag(this); QDrag *drag = new QDrag(this);
@ -84,10 +70,8 @@ void PanelAppareils::startDrag(Qt::DropActions /*supportedActions*/) {
QMimeData *mimeData = new QMimeData(); QMimeData *mimeData = new QMimeData();
// appareil temporaire pour fournir un apercu // appareil temporaire pour fournir un apercu
Element *appar;
int etat; int etat;
QString nom_fichier = currentItem() -> data(42).toString(); Element *appar = new ElementPerso(nom_fichier, 0, 0, &etat);
appar = new ElementPerso(nom_fichier, 0, 0, &etat);
if (etat != 0) { if (etat != 0) {
delete appar; delete appar;
return; return;
@ -106,3 +90,26 @@ void PanelAppareils::startDrag(Qt::DropActions /*supportedActions*/) {
// suppression de l'appareil temporaire // suppression de l'appareil temporaire
delete appar; 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);
}

View File

@ -1,12 +1,13 @@
#ifndef PANELAPPAREILS_H #ifndef PANELAPPAREILS_H
#define PANELAPPAREILS_H #define PANELAPPAREILS_H
#include <QtGui> #include <QtGui>
#include "qetapp.h"
/** /**
Cette classe represente le panel d'appareils (en tant qu'element Cette classe represente le panel d'appareils (en tant qu'element
graphique) dans lequel l'utilisateur choisit les composants de graphique) dans lequel l'utilisateur choisit les composants de
son choix et les depose sur le schema par drag'n drop. son choix et les depose sur le schema par drag'n drop.
*/ */
class PanelAppareils : public QListWidget { class PanelAppareils : public QTreeWidget {
Q_OBJECT Q_OBJECT
public: public:
PanelAppareils(QWidget * = 0); PanelAppareils(QWidget * = 0);
@ -14,5 +15,7 @@
void dragMoveEvent(QDragMoveEvent *); void dragMoveEvent(QDragMoveEvent *);
void dropEvent(QDropEvent *); void dropEvent(QDropEvent *);
void startDrag(Qt::DropActions); void startDrag(Qt::DropActions);
private:
void ajouterFichier(QTreeWidgetItem *, QString);
}; };
#endif #endif

View File

@ -732,3 +732,25 @@ void QETApp::slot_updateMenuFenetres() {
windowMapper.setMapping(action, sv); 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
}

View File

@ -15,7 +15,9 @@
QETApp(QWidget *parent=0); QETApp(QWidget *parent=0);
void closeEvent(QCloseEvent * event ); void closeEvent(QCloseEvent * event );
void addSchemaVue(SchemaVue *); void addSchemaVue(SchemaVue *);
static QString commonElementsDir();
static QString customElementsDir();
static QString QETApp::configDir();
public slots: public slots:
void systray(QSystemTrayIcon::ActivationReason raison); void systray(QSystemTrayIcon::ActivationReason raison);
void systrayReduire(); void systrayReduire();

View File

@ -135,11 +135,17 @@ QDomDocument Schema::toXml(bool schema) {
// table de correspondance entre les adresses des bornes et leurs ids // table de correspondance entre les adresses des bornes et leurs ids
QHash<Borne *, int> table_adr_id; QHash<Borne *, int> table_adr_id;
QDomElement elements = document.createElement("elements"); QDomElement elements = document.createElement("elements");
QDir dossier_elmts_persos = QDir(QETApp::customElementsDir());
foreach(Element *elmt, liste_elements) { foreach(Element *elmt, liste_elements) {
QDomElement element = document.createElement("element"); QDomElement element = document.createElement("element");
// type, position, selection et orientation // type
element.setAttribute("type", QFileInfo(elmt -> typeId()).fileName()); 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("x", elmt -> pos().x());
element.setAttribute("y", elmt -> pos().y()); element.setAttribute("y", elmt -> pos().y());
if (elmt -> isSelected()) element.setAttribute("selected", "selected"); if (elmt -> isSelected()) element.setAttribute("selected", "selected");
@ -291,13 +297,11 @@ bool Schema::fromXml(QDomDocument &document, QPointF position) {
Element *Schema::elementFromXml(QDomElement &e, QHash<int, Borne *> &table_id_adr) { Element *Schema::elementFromXml(QDomElement &e, QHash<int, Borne *> &table_id_adr) {
// cree un element dont le type correspond à l'id type // cree un element dont le type correspond à l'id type
QString type = e.attribute("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; int etat;
Element *nvel_elmt = new ElementPerso(type, 0, 0, &etat); Element *nvel_elmt = new ElementPerso(chemin_fichier, 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;
}*/
if (etat != 0) return(false); if (etat != 0) return(false);
bool retour = nvel_elmt -> fromXml(e, table_id_adr); bool retour = nvel_elmt -> fromXml(e, table_id_adr);
if (!retour) { if (!retour) {

View File

@ -4,6 +4,7 @@
#define GRILLE_Y 10 #define GRILLE_Y 10
#include <QtGui> #include <QtGui>
#include <QtXml> #include <QtXml>
#include <qetapp.h>
class Element; class Element;
class Borne; class Borne;
class Schema : public QGraphicsScene { class Schema : public QGraphicsScene {