diff --git a/sources/customelement.cpp b/sources/customelement.cpp index 6b18e5a1f..ef9f6de88 100644 --- a/sources/customelement.cpp +++ b/sources/customelement.cpp @@ -209,6 +209,11 @@ QList CustomElement::conductors() const { return(conductors); } +/// @return la liste des textes de cet element +QList CustomElement::texts() const { + return(list_texts_); +} + /** @return Le nombre de bornes que l'element possede */ @@ -560,6 +565,9 @@ ElementTextItem *CustomElement::parseInput(QDomElement &e) { eti -> setPos(pos_x, pos_y); eti -> setOriginalPos(QPointF(pos_x, pos_y)); if (e.attribute("rotate") == "true") eti -> setFollowParentRotations(true); + + list_texts_ << eti; + return(eti); } diff --git a/sources/customelement.h b/sources/customelement.h index 5d70e5ba3..7629a79e4 100644 --- a/sources/customelement.h +++ b/sources/customelement.h @@ -49,11 +49,13 @@ class CustomElement : public FixedElement { ElementsLocation location_; QPicture drawing; QList list_terminals; + QList list_texts_; // methodes public: virtual QList terminals() const; virtual QList conductors() const; + virtual QList texts() const; virtual int terminalsCount() const; virtual void paint(QPainter *, const QStyleOptionGraphicsItem *); QString typeId() const; diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 180e19aa0..4fa9a8ec2 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -20,6 +20,7 @@ #include "conductor.h" #include "customelement.h" #include "diagram.h" +#include "elementtextitem.h" #include "exportdialog.h" #include "ghostelement.h" #include "diagramcommands.h" @@ -450,7 +451,7 @@ bool Diagram::fromXml(QDomElement &document, QPointF position, bool consider_inf // charge les caracteristiques de l'element if (nvel_elmt -> fromXml(e, table_adr_id)) { // ajout de l'element au schema et a la liste des elements ajoutes - addItem(nvel_elmt); + addElement(nvel_elmt); added_elements << nvel_elmt; } else { delete nvel_elmt; @@ -463,12 +464,7 @@ bool Diagram::fromXml(QDomElement &document, QPointF position, bool consider_inf foreach (QDomElement f, QET::findInDomElement(root, "inputs", "input")) { DiagramTextItem *dti = new DiagramTextItem(0, this); dti -> fromXml(f); - QObject::connect( - dti, - SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)), - this, - SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)) - ); + addDiagramTextItem(dti); added_texts << dti; } @@ -584,6 +580,121 @@ QDomElement Diagram::writeXml(QDomDocument &xml_doc) const { return(new_node.toElement()); } +/** + Ajoute un element sur le schema + @param element Element a ajouter +*/ +void Diagram::addElement(Element *element) { + if (!element || isReadOnly()) return; + + // ajoute l'element au schema + if (element -> scene() != this) { + addItem(element); + } + + // surveille les modifications de ses champs de texte + foreach(ElementTextItem *eti, element -> texts()) { + connect( + eti, + SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)), + this, + SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)) + ); + } +} + +/** + Ajoute un conducteur sur le schema + @param conductor Conducteur a ajouter +*/ +void Diagram::addConductor(Conductor *conductor) { + if (!conductor || isReadOnly()) return; + + // ajoute le conducteur au schema + if (conductor -> scene() != this) { + addItem(conductor); + conductor -> terminal1 -> addConductor(conductor); + conductor -> terminal2 -> addConductor(conductor); + } +} + +/** + Aoute un champ de texte independant sur le schema + @param dti Champ de texte a ajouter +*/ +void Diagram::addDiagramTextItem(DiagramTextItem *dti) { + if (!dti || isReadOnly()) return; + + // ajoute le champ de texte au schema + if (dti -> scene() != this) { + addItem(dti); + } + + // surveille les modifications apportees au champ de texte + connect( + dti, + SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)), + this, + SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)) + ); +} + + +/** + Enleve un element du schema + @param element Element a enlever +*/ +void Diagram::removeElement(Element *element) { + if (!element || isReadOnly()) return; + + // enleve l'element au schema + removeItem(element); + + // arrete la surveillance des modifications de ses champs de texte + foreach(ElementTextItem *eti, element -> texts()) { + disconnect( + eti, + SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)), + this, + SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)) + ); + } +} + +/** + Enleve un conducteur du schema + @param conductor Conducteur a enlever +*/ +void Diagram::removeConductor(Conductor *conductor) { + if (!conductor || isReadOnly()) return; + + // detache le conducteur sans le detruire + conductor -> terminal1 -> removeConductor(conductor); + conductor -> terminal2 -> removeConductor(conductor); + + // enleve le conducteur du schema + removeItem(conductor); +} + +/** + Enleve un champ de texte independant du schema + @param dti Champ de texte a enlever +*/ +void Diagram::removeDiagramTextItem(DiagramTextItem *dti) { + if (!dti || isReadOnly()) return; + + // enleve le champ de texte au schema + removeItem(dti); + + // arrete la surveillance des modifications apportees au champ de texte + disconnect( + dti, + SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)), + this, + SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)) + ); +} + /** Gere le fait qu'un texte du schema ait ete modifie @param text_item Texte modifie diff --git a/sources/diagram.h b/sources/diagram.h index faf6fa15c..3b11541b6 100644 --- a/sources/diagram.h +++ b/sources/diagram.h @@ -115,6 +115,15 @@ class Diagram : public QGraphicsScene { bool wasWritten() const; QDomElement writeXml(QDomDocument &) const; + // fonctions relative a l'ajout et a l'enlevement d'elements graphiques sur le schema + void addElement(Element *); + void addConductor(Conductor *); + void addDiagramTextItem(DiagramTextItem *); + + void removeElement(Element *); + void removeConductor(Conductor *); + void removeDiagramTextItem(DiagramTextItem *); + // fonctions relatives aux options graphiques void setDisplayGrid(bool); bool displayGrid(); diff --git a/sources/diagramcommands.cpp b/sources/diagramcommands.cpp index 3fab618c5..d25efb5e4 100644 --- a/sources/diagramcommands.cpp +++ b/sources/diagramcommands.cpp @@ -48,12 +48,12 @@ AddElementCommand::~AddElementCommand() { /// Annule l'ajout void AddElementCommand::undo() { - diagram -> removeItem(element); + diagram -> removeElement(element); } /// Refait l'ajout void AddElementCommand::redo() { - diagram -> addItem(element); + diagram -> addElement(element); element -> setPos(position); element -> setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); } @@ -81,24 +81,12 @@ AddTextCommand::~AddTextCommand() { /// Annule l'ajout void AddTextCommand::undo() { - QObject::disconnect( - textitem, - SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)), - diagram, - SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)) - ); - diagram -> removeItem(textitem); + diagram -> removeDiagramTextItem(textitem); } /// Refait l'ajour void AddTextCommand::redo() { - QObject::connect( - textitem, - SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)), - diagram, - SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)) - ); - diagram -> addItem(textitem); + diagram -> addDiagramTextItem(textitem); textitem -> setPos(position); } @@ -127,15 +115,12 @@ AddConductorCommand::~AddConductorCommand() { /// Annule l'ajout void AddConductorCommand::undo() { - // detache le conducteur sans le detruire - conductor -> terminal1 -> removeConductor(conductor); - conductor -> terminal2 -> removeConductor(conductor); - diagram -> removeItem(conductor); + diagram -> removeConductor(conductor); } /// Refait l'ajout void AddConductorCommand::redo() { - diagram -> addItem(conductor); + diagram -> addConductor(conductor); } /** @@ -173,19 +158,17 @@ DeleteElementsCommand::~DeleteElementsCommand() { void DeleteElementsCommand::undo() { // remet les elements foreach(Element *e, removed_content.elements) { - diagram -> addItem(e); + diagram -> addElement(e); } // remet les conducteurs foreach(Conductor *c, removed_content.conductors(DiagramContent::AnyConductor)) { - diagram -> addItem(c); - c -> terminal1 -> addConductor(c); - c -> terminal2 -> addConductor(c); + diagram -> addConductor(c); } // remet les textes foreach(DiagramTextItem *t, removed_content.textFields) { - diagram -> addItem(t); + diagram -> addDiagramTextItem(t); } } @@ -193,19 +176,17 @@ void DeleteElementsCommand::undo() { void DeleteElementsCommand::redo() { // enleve les conducteurs foreach(Conductor *c, removed_content.conductors(DiagramContent::AnyConductor)) { - c -> terminal1 -> removeConductor(c); - c -> terminal2 -> removeConductor(c); - diagram -> removeItem(c); + diagram -> removeConductor(c); } // enleve les elements foreach(Element *e, removed_content.elements) { - diagram -> removeItem(e); + diagram -> removeElement(e); } // enleve les textes foreach(DiagramTextItem *t, removed_content.textFields) { - diagram -> removeItem(t); + diagram -> removeDiagramTextItem(t); } } @@ -246,17 +227,13 @@ PasteDiagramCommand::~PasteDiagramCommand() { /// annule le coller void PasteDiagramCommand::undo() { // enleve les conducteurs - foreach(Conductor *c, content.conductorsToMove) { - c -> terminal1 -> removeConductor(c); - c -> terminal2 -> removeConductor(c); - diagram -> removeItem(c); - } + foreach(Conductor *c, content.conductorsToMove) diagram -> removeConductor(c); // enleve les elements - foreach(Element *e, content.elements) diagram -> removeItem(e); + foreach(Element *e, content.elements) diagram -> removeElement(e); // enleve les textes - foreach(DiagramTextItem *t, content.textFields) diagram -> removeItem(t); + foreach(DiagramTextItem *t, content.textFields) diagram -> removeDiagramTextItem(t); } /// refait le coller @@ -264,17 +241,13 @@ void PasteDiagramCommand::redo() { if (first_redo) first_redo = false; else { // pose les elements - foreach(Element *e, content.elements) diagram -> addItem(e); + foreach(Element *e, content.elements) diagram -> addElement(e); // pose les conducteurs - foreach(Conductor *c, content.conductorsToMove) { - diagram -> addItem(c); - c -> terminal1 -> addConductor(c); - c -> terminal2 -> addConductor(c); - } + foreach(Conductor *c, content.conductorsToMove) diagram -> addConductor(c); // pose les textes - foreach(DiagramTextItem *t, content.textFields) diagram -> addItem(t); + foreach(DiagramTextItem *t, content.textFields) diagram -> addDiagramTextItem(t); } foreach(Element *e, content.elements) e -> setSelected(true); foreach(Conductor *c, content.conductorsToMove) c -> setSelected(true); diff --git a/sources/element.cpp b/sources/element.cpp index dd2846adb..088122777 100644 --- a/sources/element.cpp +++ b/sources/element.cpp @@ -437,29 +437,21 @@ QDomElement Element::toXml(QDomDocument &document, QHash &table } // enregistrement des bornes de l'appareil - QDomElement terminals = document.createElement("terminals"); + QDomElement xml_terminals = document.createElement("terminals"); // pour chaque enfant de l'element - foreach(QGraphicsItem *child, childItems()) { - // si cet enfant est une borne - if (Terminal *t = qgraphicsitem_cast(child)) { - // alors on enregistre la borne - QDomElement terminal = t -> toXml(document); - terminal.setAttribute("id", id_terminal); - table_adr_id.insert(t, id_terminal ++); - terminals.appendChild(terminal); - } + foreach(Terminal *t, terminals()) { + // alors on enregistre la borne + QDomElement terminal = t -> toXml(document); + terminal.setAttribute("id", id_terminal); + table_adr_id.insert(t, id_terminal ++); + xml_terminals.appendChild(terminal); } - element.appendChild(terminals); + element.appendChild(xml_terminals); // enregistrement des champ de texte de l'appareil QDomElement inputs = document.createElement("inputs"); - // pour chaque enfant de l'element - foreach(QGraphicsItem *child, childItems()) { - // si cet enfant est un champ de texte - if (ElementTextItem *eti = qgraphicsitem_cast(child)) { - // alors on enregistre le champ de texte - inputs.appendChild(eti -> toXml(document)); - } + foreach(ElementTextItem *eti, texts()) { + inputs.appendChild(eti -> toXml(document)); } element.appendChild(inputs); diff --git a/sources/element.h b/sources/element.h index c33bbcf72..4550444ae 100644 --- a/sources/element.h +++ b/sources/element.h @@ -21,6 +21,7 @@ #include "terminal.h" #include "orientationset.h" class Diagram; +class ElementTextItem; /** Cette classe abstraite represente un element electrique. */ @@ -68,6 +69,8 @@ class Element : public QObject, public QGraphicsItem { virtual QList terminals() const = 0; /// @return la liste des conducteurs relies a cet element virtual QList conductors() const = 0; + /// @return la liste des champs de textes de cet element + virtual QList texts() const = 0; /// @return le nombre de bornes actuel de cet element virtual int terminalsCount() const = 0; /// @return le nombre de bornes minimum de cet element diff --git a/sources/elementtextitem.h b/sources/elementtextitem.h index ac34d53fa..9383b2252 100644 --- a/sources/elementtextitem.h +++ b/sources/elementtextitem.h @@ -26,6 +26,7 @@ class Diagram; malgre les rotations de son element parent. */ class ElementTextItem : public DiagramTextItem { + Q_OBJECT // constructeurs, destructeur public: ElementTextItem(QGraphicsItem * = 0, QGraphicsScene * = 0);