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 la liste des textes de cet element
QList<ElementTextItem *> 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);
}

View File

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

View File

@@ -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

View File

@@ -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();

View File

@@ -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);

View File

@@ -437,30 +437,22 @@ QDomElement Element::toXml(QDomDocument &document, QHash<Terminal *, int> &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<Terminal *>(child)) {
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 ++);
terminals.appendChild(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<ElementTextItem *>(child)) {
// alors on enregistre le champ de texte
foreach(ElementTextItem *eti, texts()) {
inputs.appendChild(eti -> toXml(document));
}
}
element.appendChild(inputs);
return(element);

View File

@@ -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<Terminal *> terminals() const = 0;
/// @return la liste des conducteurs relies a cet element
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
virtual int terminalsCount() const = 0;
/// @return le nombre de bornes minimum de cet element

View File

@@ -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);