Correction d'une regression : les annulations sont de nouveau disponibles pour les champs de texte des elements.

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@565 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavier
2009-04-04 21:47:07 +00:00
parent 020974148b
commit 2a6992083d
8 changed files with 169 additions and 70 deletions

View File

@@ -209,6 +209,11 @@ QList<Conductor *> CustomElement::conductors() const {
return(conductors); return(conductors);
} }
/// @return la liste des textes de cet element
QList<ElementTextItem *> CustomElement::texts() const {
return(list_texts_);
}
/** /**
@return Le nombre de bornes que l'element possede @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 -> setPos(pos_x, pos_y);
eti -> setOriginalPos(QPointF(pos_x, pos_y)); eti -> setOriginalPos(QPointF(pos_x, pos_y));
if (e.attribute("rotate") == "true") eti -> setFollowParentRotations(true); if (e.attribute("rotate") == "true") eti -> setFollowParentRotations(true);
list_texts_ << eti;
return(eti); return(eti);
} }

View File

@@ -49,11 +49,13 @@ class CustomElement : public FixedElement {
ElementsLocation location_; ElementsLocation location_;
QPicture drawing; QPicture drawing;
QList<Terminal *> list_terminals; QList<Terminal *> list_terminals;
QList<ElementTextItem *> list_texts_;
// methodes // methodes
public: public:
virtual QList<Terminal *> terminals() const; virtual QList<Terminal *> terminals() const;
virtual QList<Conductor *> conductors() const; virtual QList<Conductor *> conductors() const;
virtual QList<ElementTextItem *> texts() const;
virtual int terminalsCount() const; virtual int terminalsCount() const;
virtual void paint(QPainter *, const QStyleOptionGraphicsItem *); virtual void paint(QPainter *, const QStyleOptionGraphicsItem *);
QString typeId() const; QString typeId() const;

View File

@@ -20,6 +20,7 @@
#include "conductor.h" #include "conductor.h"
#include "customelement.h" #include "customelement.h"
#include "diagram.h" #include "diagram.h"
#include "elementtextitem.h"
#include "exportdialog.h" #include "exportdialog.h"
#include "ghostelement.h" #include "ghostelement.h"
#include "diagramcommands.h" #include "diagramcommands.h"
@@ -450,7 +451,7 @@ bool Diagram::fromXml(QDomElement &document, QPointF position, bool consider_inf
// charge les caracteristiques de l'element // charge les caracteristiques de l'element
if (nvel_elmt -> fromXml(e, table_adr_id)) { if (nvel_elmt -> fromXml(e, table_adr_id)) {
// ajout de l'element au schema et a la liste des elements ajoutes // ajout de l'element au schema et a la liste des elements ajoutes
addItem(nvel_elmt); addElement(nvel_elmt);
added_elements << nvel_elmt; added_elements << nvel_elmt;
} else { } else {
delete nvel_elmt; 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")) { foreach (QDomElement f, QET::findInDomElement(root, "inputs", "input")) {
DiagramTextItem *dti = new DiagramTextItem(0, this); DiagramTextItem *dti = new DiagramTextItem(0, this);
dti -> fromXml(f); dti -> fromXml(f);
QObject::connect( addDiagramTextItem(dti);
dti,
SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)),
this,
SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &))
);
added_texts << dti; added_texts << dti;
} }
@@ -584,6 +580,121 @@ QDomElement Diagram::writeXml(QDomDocument &xml_doc) const {
return(new_node.toElement()); 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 Gere le fait qu'un texte du schema ait ete modifie
@param text_item Texte modifie @param text_item Texte modifie

View File

@@ -115,6 +115,15 @@ class Diagram : public QGraphicsScene {
bool wasWritten() const; bool wasWritten() const;
QDomElement writeXml(QDomDocument &) 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 // fonctions relatives aux options graphiques
void setDisplayGrid(bool); void setDisplayGrid(bool);
bool displayGrid(); bool displayGrid();

View File

@@ -48,12 +48,12 @@ AddElementCommand::~AddElementCommand() {
/// Annule l'ajout /// Annule l'ajout
void AddElementCommand::undo() { void AddElementCommand::undo() {
diagram -> removeItem(element); diagram -> removeElement(element);
} }
/// Refait l'ajout /// Refait l'ajout
void AddElementCommand::redo() { void AddElementCommand::redo() {
diagram -> addItem(element); diagram -> addElement(element);
element -> setPos(position); element -> setPos(position);
element -> setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); element -> setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
} }
@@ -81,24 +81,12 @@ AddTextCommand::~AddTextCommand() {
/// Annule l'ajout /// Annule l'ajout
void AddTextCommand::undo() { void AddTextCommand::undo() {
QObject::disconnect( diagram -> removeDiagramTextItem(textitem);
textitem,
SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)),
diagram,
SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &))
);
diagram -> removeItem(textitem);
} }
/// Refait l'ajour /// Refait l'ajour
void AddTextCommand::redo() { void AddTextCommand::redo() {
QObject::connect( diagram -> addDiagramTextItem(textitem);
textitem,
SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)),
diagram,
SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &))
);
diagram -> addItem(textitem);
textitem -> setPos(position); textitem -> setPos(position);
} }
@@ -127,15 +115,12 @@ AddConductorCommand::~AddConductorCommand() {
/// Annule l'ajout /// Annule l'ajout
void AddConductorCommand::undo() { void AddConductorCommand::undo() {
// detache le conducteur sans le detruire diagram -> removeConductor(conductor);
conductor -> terminal1 -> removeConductor(conductor);
conductor -> terminal2 -> removeConductor(conductor);
diagram -> removeItem(conductor);
} }
/// Refait l'ajout /// Refait l'ajout
void AddConductorCommand::redo() { void AddConductorCommand::redo() {
diagram -> addItem(conductor); diagram -> addConductor(conductor);
} }
/** /**
@@ -173,19 +158,17 @@ DeleteElementsCommand::~DeleteElementsCommand() {
void DeleteElementsCommand::undo() { void DeleteElementsCommand::undo() {
// remet les elements // remet les elements
foreach(Element *e, removed_content.elements) { foreach(Element *e, removed_content.elements) {
diagram -> addItem(e); diagram -> addElement(e);
} }
// remet les conducteurs // remet les conducteurs
foreach(Conductor *c, removed_content.conductors(DiagramContent::AnyConductor)) { foreach(Conductor *c, removed_content.conductors(DiagramContent::AnyConductor)) {
diagram -> addItem(c); diagram -> addConductor(c);
c -> terminal1 -> addConductor(c);
c -> terminal2 -> addConductor(c);
} }
// remet les textes // remet les textes
foreach(DiagramTextItem *t, removed_content.textFields) { foreach(DiagramTextItem *t, removed_content.textFields) {
diagram -> addItem(t); diagram -> addDiagramTextItem(t);
} }
} }
@@ -193,19 +176,17 @@ void DeleteElementsCommand::undo() {
void DeleteElementsCommand::redo() { void DeleteElementsCommand::redo() {
// enleve les conducteurs // enleve les conducteurs
foreach(Conductor *c, removed_content.conductors(DiagramContent::AnyConductor)) { foreach(Conductor *c, removed_content.conductors(DiagramContent::AnyConductor)) {
c -> terminal1 -> removeConductor(c); diagram -> removeConductor(c);
c -> terminal2 -> removeConductor(c);
diagram -> removeItem(c);
} }
// enleve les elements // enleve les elements
foreach(Element *e, removed_content.elements) { foreach(Element *e, removed_content.elements) {
diagram -> removeItem(e); diagram -> removeElement(e);
} }
// enleve les textes // enleve les textes
foreach(DiagramTextItem *t, removed_content.textFields) { foreach(DiagramTextItem *t, removed_content.textFields) {
diagram -> removeItem(t); diagram -> removeDiagramTextItem(t);
} }
} }
@@ -246,17 +227,13 @@ PasteDiagramCommand::~PasteDiagramCommand() {
/// annule le coller /// annule le coller
void PasteDiagramCommand::undo() { void PasteDiagramCommand::undo() {
// enleve les conducteurs // enleve les conducteurs
foreach(Conductor *c, content.conductorsToMove) { foreach(Conductor *c, content.conductorsToMove) diagram -> removeConductor(c);
c -> terminal1 -> removeConductor(c);
c -> terminal2 -> removeConductor(c);
diagram -> removeItem(c);
}
// enleve les elements // enleve les elements
foreach(Element *e, content.elements) diagram -> removeItem(e); foreach(Element *e, content.elements) diagram -> removeElement(e);
// enleve les textes // enleve les textes
foreach(DiagramTextItem *t, content.textFields) diagram -> removeItem(t); foreach(DiagramTextItem *t, content.textFields) diagram -> removeDiagramTextItem(t);
} }
/// refait le coller /// refait le coller
@@ -264,17 +241,13 @@ void PasteDiagramCommand::redo() {
if (first_redo) first_redo = false; if (first_redo) first_redo = false;
else { else {
// pose les elements // pose les elements
foreach(Element *e, content.elements) diagram -> addItem(e); foreach(Element *e, content.elements) diagram -> addElement(e);
// pose les conducteurs // pose les conducteurs
foreach(Conductor *c, content.conductorsToMove) { foreach(Conductor *c, content.conductorsToMove) diagram -> addConductor(c);
diagram -> addItem(c);
c -> terminal1 -> addConductor(c);
c -> terminal2 -> addConductor(c);
}
// pose les textes // 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(Element *e, content.elements) e -> setSelected(true);
foreach(Conductor *c, content.conductorsToMove) c -> setSelected(true); foreach(Conductor *c, content.conductorsToMove) c -> setSelected(true);

View File

@@ -437,29 +437,21 @@ QDomElement Element::toXml(QDomDocument &document, QHash<Terminal *, int> &table
} }
// enregistrement des bornes de l'appareil // enregistrement des bornes de l'appareil
QDomElement terminals = document.createElement("terminals"); QDomElement xml_terminals = document.createElement("terminals");
// pour chaque enfant de l'element // pour chaque enfant de l'element
foreach(QGraphicsItem *child, childItems()) { foreach(Terminal *t, terminals()) {
// si cet enfant est une borne // alors on enregistre la borne
if (Terminal *t = qgraphicsitem_cast<Terminal *>(child)) { QDomElement terminal = t -> toXml(document);
// alors on enregistre la borne terminal.setAttribute("id", id_terminal);
QDomElement terminal = t -> toXml(document); table_adr_id.insert(t, id_terminal ++);
terminal.setAttribute("id", id_terminal); xml_terminals.appendChild(terminal);
table_adr_id.insert(t, id_terminal ++);
terminals.appendChild(terminal);
}
} }
element.appendChild(terminals); element.appendChild(xml_terminals);
// enregistrement des champ de texte de l'appareil // enregistrement des champ de texte de l'appareil
QDomElement inputs = document.createElement("inputs"); QDomElement inputs = document.createElement("inputs");
// pour chaque enfant de l'element foreach(ElementTextItem *eti, texts()) {
foreach(QGraphicsItem *child, childItems()) { inputs.appendChild(eti -> toXml(document));
// si cet enfant est un champ de texte
if (ElementTextItem *eti = qgraphicsitem_cast<ElementTextItem *>(child)) {
// alors on enregistre le champ de texte
inputs.appendChild(eti -> toXml(document));
}
} }
element.appendChild(inputs); element.appendChild(inputs);

View File

@@ -21,6 +21,7 @@
#include "terminal.h" #include "terminal.h"
#include "orientationset.h" #include "orientationset.h"
class Diagram; class Diagram;
class ElementTextItem;
/** /**
Cette classe abstraite represente un element electrique. Cette classe abstraite represente un element electrique.
*/ */
@@ -68,6 +69,8 @@ class Element : public QObject, public QGraphicsItem {
virtual QList<Terminal *> terminals() const = 0; virtual QList<Terminal *> terminals() const = 0;
/// @return la liste des conducteurs relies a cet element /// @return la liste des conducteurs relies a cet element
virtual QList<Conductor *> conductors() const = 0; virtual QList<Conductor *> conductors() const = 0;
/// @return la liste des champs de textes de cet element
virtual QList<ElementTextItem *> texts() const = 0;
/// @return le nombre de bornes actuel de cet element /// @return le nombre de bornes actuel de cet element
virtual int terminalsCount() const = 0; virtual int terminalsCount() const = 0;
/// @return le nombre de bornes minimum de cet element /// @return le nombre de bornes minimum de cet element

View File

@@ -26,6 +26,7 @@ class Diagram;
malgre les rotations de son element parent. malgre les rotations de son element parent.
*/ */
class ElementTextItem : public DiagramTextItem { class ElementTextItem : public DiagramTextItem {
Q_OBJECT
// constructeurs, destructeur // constructeurs, destructeur
public: public:
ElementTextItem(QGraphicsItem * = 0, QGraphicsScene * = 0); ElementTextItem(QGraphicsItem * = 0, QGraphicsScene * = 0);