diff --git a/element.cpp b/element.cpp index ec910a4cb..10e71f609 100644 --- a/element.cpp +++ b/element.cpp @@ -298,19 +298,9 @@ bool Element::fromXml(QDomElement &e, QHash &table_id_adr) { les bornes vont maintenant etre recensees pour associer leurs id à leur adresse reelle ce recensement servira lors de la mise en place des fils */ - QList liste_terminals; - // parcours des enfants de l'element - for (QDomNode enfant = e.firstChild() ; !enfant.isNull() ; enfant = enfant.nextSibling()) { - // on s'interesse a l'element XML "bornes" - QDomElement terminals = enfant.toElement(); - if (terminals.isNull() || terminals.tagName() != "bornes") continue; - // parcours des enfants de l'element XML "bornes" - for (QDomNode node_terminal = terminals.firstChild() ; !node_terminal.isNull() ; node_terminal = node_terminal.nextSibling()) { - // on s'interesse a l'element XML "borne" - QDomElement terminal = node_terminal.toElement(); - if (!terminal.isNull() && Terminal::valideXml(terminal)) liste_terminals.append(terminal); - } + foreach(QDomElement qde, findInDomElement(e, "bornes", "borne")) { + if (Terminal::valideXml(qde)) liste_terminals << qde; } QHash priv_id_adr; @@ -345,6 +335,14 @@ bool Element::fromXml(QDomElement &e, QHash &table_id_adr) { } } + // importe les valeurs des champs de texte + QList inputs = findInDomElement(e, "inputs", "input"); + foreach(QGraphicsItem *qgi, children()) { + if (ElementTextItem *eti = qgraphicsitem_cast(qgi)) { + foreach(QDomElement input, inputs) eti -> fromXml(input); + } + } + // position, selection et orientation setPos(e.attribute("x").toDouble(), e.attribute("y").toDouble()); setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); @@ -404,5 +402,46 @@ QDomElement Element::toXml(QDomDocument &document, QHash &table } } element.appendChild(terminals); + + // enregistrement des champ de texte de l'appareil + QDomElement inputs = document.createElement("inputs"); + // pour chaque enfant de l'element + foreach(QGraphicsItem *child, children()) { + // 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)); + } + } + element.appendChild(inputs); + return(element); } + + +/** + Methode statique sans rapport direct avec la manipulation des elements. + Etant donne un element XML e, elle renvoie la liste de tous les elements + children imbriques dans les elements parent, eux-memes enfants de l'elememt e + @param e Element XML a explorer + @param parent tag XML intermediaire + @param children tag XML a rechercher + @return La liste des elements XML children +*/ +QList Element::findInDomElement(QDomElement e, QString parent, QString children) { + // recense les champs de texte + QList return_list; + // parcours des enfants de l'element + for (QDomNode enfant = e.firstChild() ; !enfant.isNull() ; enfant = enfant.nextSibling()) { + // on s'interesse a l'element XML "parent" + QDomElement parents = enfant.toElement(); + if (parents.isNull() || parents.tagName() != parent) continue; + // parcours des enfants de l'element XML "parent" + for (QDomNode node_children = parents.firstChild() ; !node_children.isNull() ; node_children = node_children.nextSibling()) { + // on s'interesse a l'element XML "children" + QDomElement children = node_children.toElement(); + if (!children.isNull()) return_list.append(children); + } + } + return(return_list); +} diff --git a/element.h b/element.h index 7370d80b9..0117748aa 100644 --- a/element.h +++ b/element.h @@ -87,6 +87,7 @@ if (o == Terminal::Nord) return(Terminal::Ouest); return((Terminal::Orientation)(o - 1)); } + static QList findInDomElement(QDomElement, QString, QString); QSize dimensions; QPoint hotspot_coord; diff --git a/elementtextitem.cpp b/elementtextitem.cpp index ddb716b99..de175fc63 100644 --- a/elementtextitem.cpp +++ b/elementtextitem.cpp @@ -21,7 +21,32 @@ void ElementTextItem::setPos(qreal x, qreal y) { } QPointF ElementTextItem::pos() const { - QPointF actual_pos = pos(); + QPointF actual_pos = QGraphicsTextItem::pos(); actual_pos += QPointF(0.0, boundingRect().height() / 2.0); return(actual_pos); } + +/** + Permet de lire le texte a mettre dans le champ a partir d'un element XML. + Cette methode se base sur la position du champ pour assigner ou non la + valeur a ce champ. + @param e L'element XML representant le champ de texte +*/ +void ElementTextItem::fromXml(QDomElement &e) { + QPointF _pos = pos(); + if (e.attribute("x").toDouble() == _pos.x() && e.attribute("y").toDouble() == _pos.y()) { + setPlainText(e.attribute("text")); + } +} + +/** + @param document Le document XML a utiliser + @return L'element XML representant ce champ de texte +*/ +QDomElement ElementTextItem::toXml(QDomDocument &document) { + QDomElement result = document.createElement("input"); + result.setAttribute("x", pos().x()); + result.setAttribute("y", pos().y()); + result.setAttribute("text", toPlainText()); + return(result); +} diff --git a/elementtextitem.h b/elementtextitem.h index 56e197d66..dd3ade6d7 100644 --- a/elementtextitem.h +++ b/elementtextitem.h @@ -1,6 +1,7 @@ #ifndef ELEMENT_TEXT_ITEM_H #define ELEMENT_TEXT_ITEM_H #include + #include class ElementTextItem : public QGraphicsTextItem { // constructeurs public: @@ -17,6 +18,8 @@ virtual int type() const { return Type; } inline bool followParentRotations() const { return(follow_parent_rotations); } inline void setFollowParentRotations(bool frp) { follow_parent_rotations = frp; } + void fromXml(QDomElement &); + QDomElement toXml(QDomDocument &); void setPos(const QPointF &); void setPos(qreal, qreal); QPointF pos() const;