From c5f17057458c2cc51bdab5b72bac869a1164b0fc Mon Sep 17 00:00:00 2001 From: Martin Marmsoler Date: Tue, 25 Aug 2020 20:14:38 +0200 Subject: [PATCH] go on with the work --- sources/borderproperties.cpp | 12 +- sources/borderproperties.h | 2 +- sources/bordertitleblock.cpp | 4 +- sources/bordertitleblock.h | 2 +- sources/conductorproperties.cpp | 193 +++++++++++------ sources/conductorproperties.h | 14 +- sources/diagram.cpp | 11 +- sources/diagram.h | 2 +- sources/diagramcontext.cpp | 10 +- sources/diagramcontext.h | 2 +- sources/editor/graphicspart/partarc.cpp | 12 ++ sources/editor/graphicspart/partarc.h | 1 + .../graphicspart/partdynamictextfield.cpp | 34 ++- .../graphicspart/partdynamictextfield.h | 1 + sources/editor/graphicspart/partellipse.cpp | 20 ++ sources/editor/graphicspart/partellipse.h | 1 + sources/editor/graphicspart/partline.cpp | 14 ++ sources/editor/graphicspart/partline.h | 1 + sources/editor/graphicspart/partpolygon.cpp | 5 + sources/editor/graphicspart/partpolygon.h | 2 + sources/editor/graphicspart/partrectangle.cpp | 12 ++ sources/editor/graphicspart/partrectangle.h | 1 + sources/editor/graphicspart/partterminal.cpp | 4 + sources/editor/graphicspart/partterminal.h | 2 + sources/editor/graphicspart/parttext.cpp | 24 +++ sources/editor/graphicspart/parttext.h | 1 + sources/properties/propertiesinterface.cpp | 42 +++- sources/properties/propertiesinterface.h | 15 +- sources/properties/terminaldata.cpp | 20 +- sources/properties/terminaldata.h | 22 +- sources/properties/xrefproperties.cpp | 5 - sources/properties/xrefproperties.h | 1 - sources/qetgraphicsitem/conductor.cpp | 199 ++++++++++-------- sources/qetgraphicsitem/conductor.h | 8 +- sources/qetgraphicsitem/element.h | 2 +- .../qetgraphicsitem/elementtextitemgroup.h | 2 +- sources/qetgraphicsitem/terminal.cpp | 24 +-- sources/qetgraphicsitem/terminal.h | 2 +- sources/titleblockproperties.cpp | 45 ++-- sources/titleblockproperties.h | 4 +- 40 files changed, 520 insertions(+), 258 deletions(-) diff --git a/sources/borderproperties.cpp b/sources/borderproperties.cpp index 8c87933b7..57e0de57a 100644 --- a/sources/borderproperties.cpp +++ b/sources/borderproperties.cpp @@ -128,13 +128,13 @@ bool BorderProperties::fromXml(const QDomElement &e) { return true; } -bool BorderProperties::valideXml(QDomElement& e) const { +bool BorderProperties::valideXml(QDomElement& e) { - if (propertyInteger(e, "cols") == PropertyFlags::Success && - propertyDouble(e, "colsize") == PropertyFlags::Success && - propertyInteger(e, "rows") == PropertyFlags::Success && - propertyDouble(e, "rowsize") == PropertyFlags::Success && - propertyBool(e, "displaycols") == PropertyFlags::Success && + if (propertyInteger(e, "cols") == PropertyFlags::Success || + propertyDouble(e, "colsize") == PropertyFlags::Success || + propertyInteger(e, "rows") == PropertyFlags::Success || + propertyDouble(e, "rowsize") == PropertyFlags::Success || + propertyBool(e, "displaycols") == PropertyFlags::Success || propertyBool(e, "displayrows") == PropertyFlags::Success) return true; } diff --git a/sources/borderproperties.h b/sources/borderproperties.h index 93d72c78b..3fdde4d2a 100644 --- a/sources/borderproperties.h +++ b/sources/borderproperties.h @@ -39,7 +39,7 @@ class BorderProperties : public PropertiesInterface { QDomElement toXml(QDomDocument &dom_doc) const override; bool fromXml(const QDomElement &) override; - bool valideXml(QDomElement& e) const override; + static bool valideXml(QDomElement& e); void toSettings(QSettings &, const QString & = QString()) const override; void fromSettings(const QSettings &, const QString & = QString()) override; diff --git a/sources/bordertitleblock.cpp b/sources/bordertitleblock.cpp index ede0f5ccd..9d954c9fd 100644 --- a/sources/bordertitleblock.cpp +++ b/sources/bordertitleblock.cpp @@ -168,8 +168,8 @@ QRectF BorderTitleBlock::insideBorderRect() const Exports the title block current values to XML. @param xml_elmt the XML element attributes will be added to */ -void BorderTitleBlock::titleBlockToXml(QDomElement &xml_elmt) { - exportTitleBlock().toXml(xml_elmt); +void BorderTitleBlock::titleBlockToXml(QDomDocument& doc) { + exportTitleBlock().toXml(doc); } /** diff --git a/sources/bordertitleblock.h b/sources/bordertitleblock.h index 67fe22691..9a892e931 100644 --- a/sources/bordertitleblock.h +++ b/sources/bordertitleblock.h @@ -152,7 +152,7 @@ class BorderTitleBlock : public QObject void setPreviousFolioNum(const QString &previous); void setNextFolioNum(const QString &next); - void titleBlockToXml(QDomElement &); + void titleBlockToXml(QDomDocument &doc); void titleBlockFromXml(const QDomElement &); void borderToXml(QDomElement &); void borderFromXml(const QDomElement &); diff --git a/sources/conductorproperties.cpp b/sources/conductorproperties.cpp index 76f401c20..f70e7b2db 100644 --- a/sources/conductorproperties.cpp +++ b/sources/conductorproperties.cpp @@ -196,11 +196,17 @@ void SingleLineProperties::drawPen(QPainter *painter, QET::ConductorSegmentType ajoutes a l'element e. @param e Element XML auquel seront ajoutes des attributs */ -void SingleLineProperties::toXml(QDomElement &e) const { - e.setAttribute("ground", hasGround ? "true" : "false"); - e.setAttribute("neutral", hasNeutral ? "true" : "false"); - e.setAttribute("phase", phases); - if (isPen()) e.setAttribute("pen", "true"); +QDomElement SingleLineProperties::toXml(QDomDocument &doc) const { + + QDomElement e = doc.createElement("SingleLine"); + e.appendChild(createXmlProperty(doc, "ground", hasGround)); + e.appendChild(createXmlProperty(doc, "neutral", hasNeutral)); + e.appendChild(createXmlProperty(doc, "phase", phases)); + + if (isPen()) + e.appendChild(createXmlProperty(doc, "pen", true)); + + return e; } /** @@ -208,11 +214,36 @@ void SingleLineProperties::toXml(QDomElement &e) const { de l'element e @param e Element XML dont les attributs seront lus */ -void SingleLineProperties::fromXml(QDomElement &e) { - hasGround = e.attribute("ground") == "true"; - hasNeutral = e.attribute("neutral") == "true"; - setPhasesCount(e.attribute("phase").toInt()); - is_pen = (hasGround && hasNeutral && e.attribute("pen", "false") == "true"); +bool SingleLineProperties::fromXml(const QDomElement &e) { + if (propertyBool(e, "ground", &hasGround) != PropertyFlags::Success || + propertyBool(e, "neutral", &hasNeutral) != PropertyFlags::Success) + return false; + + int phase; + if (propertyInteger(e, "phase", &phase) != PropertyFlags::Success) + return false; + setPhasesCount(phase); + + bool pen; + if (propertyBool(e, "pen", &pen) != PropertyFlags::Success) + return false; + is_pen = (hasGround && hasNeutral && pen); + + return true; +} + +bool SingleLineProperties::valideXml(QDomElement& e) { + if (propertyBool(e, "ground") != PropertyFlags::Success || + propertyBool(e, "neutral") != PropertyFlags::Success) + return false; + + if (propertyInteger(e, "phase") != PropertyFlags::Success) + return false; + + if (propertyBool(e, "pen") != PropertyFlags::Success) + return false; + + return true; } /** @@ -245,43 +276,46 @@ ConductorProperties::~ConductorProperties() { * Export conductor propertie, in the XML element 'e' * @param e the xml element */ -void ConductorProperties::toXml(QDomDocument& doc) const +QDomElement ConductorProperties::toXml(QDomDocument& doc) const { - QDomElement conductor_elmt = xml_document.createElement("conductors"); - e.setAttribute("type", typeToString(type)); + QDomElement e = doc.createElement("defaultconductor"); + + e.appendChild(createXmlProperty(doc, "type", typeToString(type))); if (color != QColor(Qt::black)) - e.setAttribute("color", color.name()); - - e.setAttribute("bicolor", m_bicolor? "true" : "false"); - e.setAttribute("color2", m_color_2.name()); - e.setAttribute("dash-size", QString::number(m_dash_size)); + e.appendChild(createXmlProperty(doc, "color", color)); + + e.appendChild(createXmlProperty(doc, "bicolor", m_bicolor)); + e.appendChild(createXmlProperty(doc, "color2", m_color_2)); + e.appendChild(createXmlProperty(doc, "dash-size", m_dash_size)); if (type == Single) - singleLineProperties.toXml(e); + e.appendChild(singleLineProperties.toXml(doc)); - e.setAttribute("num", text); - e.setAttribute("text_color", text_color.name()); - e.setAttribute("formula", m_formula); - e.setAttribute("function", m_function); - e.setAttribute("tension_protocol", m_tension_protocol); - e.setAttribute("conductor_color", m_wire_color); - e.setAttribute("conductor_section", m_wire_section); - e.setAttribute("numsize", QString::number(text_size)); - e.setAttribute("condsize", QString::number(cond_size)); - e.setAttribute("displaytext", m_show_text); - e.setAttribute("onetextperfolio", m_one_text_per_folio); - e.setAttribute("vertirotatetext", QString::number(verti_rotate_text)); - e.setAttribute("horizrotatetext", QString::number(horiz_rotate_text)); + e.appendChild(createXmlProperty(doc, "num", text)); + e.appendChild(createXmlProperty(doc, "text_color", text_color.name())); + e.appendChild(createXmlProperty(doc, "formula", m_formula)); + e.appendChild(createXmlProperty(doc, "function", m_function)); + e.appendChild(createXmlProperty(doc, "tension_protocol", m_tension_protocol)); + e.appendChild(createXmlProperty(doc, "conductor_color", m_wire_color)); + e.appendChild(createXmlProperty(doc, "conductor_section", m_wire_section)); + e.appendChild(createXmlProperty(doc, "numsize", text_size)); + e.appendChild(createXmlProperty(doc, "condsize", cond_size)); + e.appendChild(createXmlProperty(doc, "displaytext", m_show_text)); + e.appendChild(createXmlProperty(doc, "onetextperfolio", m_one_text_per_folio)); + e.appendChild(createXmlProperty(doc, "onetextperfolio", verti_rotate_text)); + e.appendChild(createXmlProperty(doc, "horizrotatetext", horiz_rotate_text)); QMetaEnum me = QMetaEnum::fromType(); - e.setAttribute("horizontal-alignment", me.valueToKey(m_horizontal_alignment)); - e.setAttribute("vertical-alignment", me.valueToKey(m_vertical_alignment)); + e.appendChild(createXmlProperty(doc, "horizontal-alignment", me.valueToKey(m_horizontal_alignment))); + e.appendChild(createXmlProperty(doc, "vertical-alignment", me.valueToKey(m_vertical_alignment))); QString conductor_style = writeStyle(); if (!conductor_style.isEmpty()) - e.setAttribute("style", conductor_style); + e.appendChild(createXmlProperty(doc, "style", conductor_style)); + + return e; } @@ -290,24 +324,21 @@ void ConductorProperties::toXml(QDomDocument& doc) const * Import conductor propertie, from the attribute of the xml element 'e' * @param e the xml document */ -void ConductorProperties::fromXml(QDomElement &e) +bool ConductorProperties::fromXml(const QDomElement &e) { // get conductor color - QColor xml_color= QColor(e.attribute("color")); - color = (xml_color.isValid()? xml_color : QColor(Qt::black)); - - QString bicolor_str = e.attribute("bicolor", "false"); - m_bicolor = bicolor_str == "true"? true : false; - - QColor xml_color_2 = QColor(e.attribute("color2")); - m_color_2 = xml_color_2.isValid()? xml_color_2 : QColor(Qt::black); - - m_dash_size = e.attribute("dash-size", QString::number(1)).toInt(); + propertyColor(e, "color", &color); + propertyBool(e, "bicolor", &m_bicolor, false); + propertyColor(e, "color2", &m_color_2); + propertyInteger(e, "dash-size", &m_dash_size, 1); // read style of conductor readStyle(e.attribute("style")); + + QString type_t; + propertyString(e, "type", &type_t); - if (e.attribute("type") == typeToString(Single)) + if (type_t == typeToString(Single)) { // get specific properties for single conductor singleLineProperties.fromXml(e); @@ -316,30 +347,60 @@ void ConductorProperties::fromXml(QDomElement &e) else type = Multi; - text = e.attribute("num"); + propertyString(e, "num", &text); + // get text color - QColor xml_text_color= QColor(e.attribute("text_color")); - text_color = (xml_text_color.isValid()? xml_text_color : QColor(Qt::black)); - m_formula = e.attribute("formula"); - m_function = e.attribute("function"); - m_tension_protocol = e.attribute("tension_protocol"); - m_wire_color = e.attribute("conductor_color"); - m_wire_section = e.attribute("conductor_section"); - text_size = e.attribute("numsize", QString::number(9)).toInt(); - cond_size = e.attribute("condsize", QString::number(1)).toDouble(); - m_show_text = e.attribute("displaytext", QString::number(1)).toInt(); - m_one_text_per_folio = e.attribute("onetextperfolio", QString::number(0)).toInt(); - verti_rotate_text = e.attribute("vertirotatetext").toDouble(); - horiz_rotate_text = e.attribute("horizrotatetext").toDouble(); + propertyColor(e, "text_color", &text_color); + propertyString(e, "formula", &m_formula); + propertyString(e, "function", &m_function); + propertyString(e, "tension_protocol", &m_tension_protocol); + propertyString(e, "conductor_color", &m_wire_color); + propertyString(e, "conductor_section", &m_wire_section); + propertyInteger(e, "numsize", &text_size, 9); + propertyDouble(e, "condsize", &cond_size, 1); + propertyBool(e, "displaytext", &m_show_text, true); + propertyBool(e, "onetextperfolio", &m_one_text_per_folio, 0); + propertyDouble(e, "vertirotatetext", &verti_rotate_text); + propertyDouble(e, "horizrotatetext", &horiz_rotate_text); QMetaEnum me = QMetaEnum::fromType(); - m_horizontal_alignment = Qt::Alignment(me.keyToValue(e.attribute("horizontal-alignment", "AlignBottom").toStdString().data())); - m_vertical_alignment = Qt::Alignment(me.keyToValue(e.attribute("vertical-alignment", "AlignRight").toStdString().data())); + + QString alinment_temp; + propertyString(e, "horizontal-alignment", &alinment_temp, "AlignBottom"); + m_horizontal_alignment = Qt::Alignment(me.keyToValue(alinment_temp.toStdString().data())); + propertyString(e, "vertical-alignment", &alinment_temp, "AlignRight"); + m_vertical_alignment = Qt::Alignment(me.keyToValue(alinment_temp.toStdString().data())); //Keep retrocompatible with version older than 0,4 //If the propertie @type is simple (removed since QET 0,4), we set text no visible. //@TODO remove this code for qet 0.6 or later - if (e.attribute("type") == "simple") m_show_text = false; + + if (type_t == "simple") m_show_text = false; +} + +bool ConductorProperties::valideXml(QDomElement& e) { + if (propertyColor(e, "color") || + propertyBool(e, "bicolor") || + propertyColor(e, "color2") || + propertyInteger(e, "dash-size") || + propertyString(e, "type") || + propertyString(e, "num") || + propertyColor(e, "text_color") || + propertyString(e, "formula") || + propertyString(e, "function") || + propertyString(e, "tension_protocol") || + propertyString(e, "conductor_color") || + propertyString(e, "conductor_section") || + propertyInteger(e, "numsize") || + propertyDouble(e, "condsize") || + propertyBool(e, "displaytext") || + propertyBool(e, "onetextperfolio") || + propertyDouble(e, "vertirotatetext") || + propertyDouble(e, "horizrotatetext") || + propertyString(e, "horizontal-alignment") || + propertyString(e, "vertical-alignment")) + return false; + return true; } /** @@ -379,7 +440,7 @@ void ConductorProperties::toSettings(QSettings &settings, const QString &prefix) @param settings Parametres a lire @param prefix prefixe a ajouter devant les noms des parametres */ -void ConductorProperties::fromSettings(QSettings &settings, const QString &prefix) +void ConductorProperties::fromSettings(const QSettings &settings, const QString &prefix) { QColor settings_color = QColor(settings.value(prefix + "color").toString()); color = (settings_color.isValid()? settings_color : QColor(Qt::black)); @@ -823,7 +884,7 @@ void SingleLineProperties::toSettings(QSettings &settings, const QString &prefix @param settings Parametres a lire @param prefix prefix a ajouter devant les noms des parametres */ -void SingleLineProperties::fromSettings(QSettings &settings, const QString &prefix) { +void SingleLineProperties::fromSettings(const QSettings &settings, const QString &prefix) { hasGround = settings.value(prefix + "hasGround", true).toBool(); hasNeutral = settings.value(prefix + "hasNeutral", true).toBool(); phases = settings.value(prefix + "phases", 1).toInt(); diff --git a/sources/conductorproperties.h b/sources/conductorproperties.h index 396933f0b..6435e15d6 100644 --- a/sources/conductorproperties.h +++ b/sources/conductorproperties.h @@ -38,10 +38,11 @@ class SingleLineProperties: public PropertiesInterface { unsigned short int phasesCount(); bool isPen() const; void draw(QPainter *, QET::ConductorSegmentType, const QRectF &); - void toXml(QDomElement &) const override; - void fromXml(QDomElement &) override; + QDomElement toXml(QDomDocument& doc) const override; + bool fromXml(const QDomElement &) override; + static bool valideXml(QDomElement& element); void toSettings(QSettings &, const QString & = QString()) const override; - void fromSettings(QSettings &, const QString & = QString()) override; + void fromSettings(const QSettings &, const QString & = QString()) override; /// Whether the singleline conductor should display the ground symbol bool hasGround; @@ -111,10 +112,11 @@ class ConductorProperties: public PropertiesInterface SingleLineProperties singleLineProperties; // methods - void toXml(QDomDocument &doc) const override; - void fromXml(QDomElement &) override; + QDomElement toXml(QDomDocument &doc) const override; + bool fromXml(const QDomElement &) override; + static bool valideXml(QDomElement& element); void toSettings(QSettings &, const QString & = QString()) const override; - void fromSettings(QSettings &, const QString & = QString()) override; + void fromSettings(const QSettings &, const QString & = QString()) override; static QString typeToString(ConductorType); void applyForEqualAttributes(QList list); diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 5222aa075..952c1a5a7 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -624,13 +624,12 @@ QDomDocument Diagram::toXml(bool whole_content) { // proprietes du schema if (whole_content) { - border_and_titleblock.titleBlockToXml(dom_root); + // TODO: compare with old version + border_and_titleblock.titleBlockToXml(document); border_and_titleblock.borderToXml(dom_root); // Default conductor properties - QDomElement default_conductor = document.createElement("defaultconductor"); - defaultConductorProperties.toXml(default_conductor); - dom_root.appendChild(default_conductor); + dom_root.appendChild(defaultConductorProperties.toXml(document)); // Conductor autonum if (!m_conductors_autonum_name.isEmpty()) { @@ -764,7 +763,8 @@ QDomDocument Diagram::toXml(bool whole_content) { if (!list_conductors.isEmpty()) { auto dom_conductors = document.createElement("conductors"); for (auto cond : list_conductors) { - dom_conductors.appendChild(cond->toXml(document, table_adr_id)); + //dom_conductors.appendChild(cond->toXml(document, table_adr_id)); + dom_conductors.appendChild(cond->toXml(document)); } dom_root.appendChild(dom_conductors); } @@ -948,6 +948,7 @@ bool Diagram::fromXml(QDomElement &document, QPointF position, bool consider_inf defaultConductorProperties.fromXml(default_conductor_elmt); } + // Load the autonum m_conductors_autonum_name = root.attribute("conductorAutonum"); diff --git a/sources/diagram.h b/sources/diagram.h index bbe7325e5..d0bd6d260 100644 --- a/sources/diagram.h +++ b/sources/diagram.h @@ -166,7 +166,7 @@ class Diagram : public QGraphicsScene QList < QSet > potentials(); // methods related to XML import/export - QDomDocument toXml(bool = true); + QDomDocument toXml(bool = true); bool initFromXml(QDomElement &, QPointF = QPointF(), bool = true, DiagramContent * = nullptr); bool fromXml(QDomDocument &, QPointF = QPointF(), diff --git a/sources/diagramcontext.cpp b/sources/diagramcontext.cpp index 0afc4e14c..5c6ee3a79 100644 --- a/sources/diagramcontext.cpp +++ b/sources/diagramcontext.cpp @@ -197,15 +197,17 @@ void DiagramContext::toSettings(QSettings &settings, const QString &array_name) Read this context properties from \a settings by running through the array named \a array_name. */ -void DiagramContext::fromSettings(QSettings &settings, const QString &array_name) { - int size = settings.beginReadArray(array_name); +void DiagramContext::fromSettings(const QSettings &settings, const QString &array_name) { + // TODO: find better solution than const cast + QSettings& s = const_cast(settings); + int size = s.beginReadArray(array_name); for (int i = 0 ; i < size; ++ i) { - settings.setArrayIndex(i); + s.setArrayIndex(i); QString key = settings.value("name").toString(); if (key.isEmpty()) continue; addValue(key, settings.value("value").toString()); } - settings.endArray(); + s.endArray(); } /** diff --git a/sources/diagramcontext.h b/sources/diagramcontext.h index 6eeaa1508..3ed8bf1b5 100644 --- a/sources/diagramcontext.h +++ b/sources/diagramcontext.h @@ -79,7 +79,7 @@ class DiagramContext void fromXml(const QDomElement &, const QString & = "property"); void fromXml(const pugi::xml_node &dom_element, const QString &tag_name = "property"); void toSettings(QSettings &, const QString &) const; - void fromSettings(QSettings &, const QString &); + void fromSettings(const QSettings &, const QString &); static QString validKeyRegExp(); diff --git a/sources/editor/graphicspart/partarc.cpp b/sources/editor/graphicspart/partarc.cpp index b5ac5cbe7..ba1716a7f 100644 --- a/sources/editor/graphicspart/partarc.cpp +++ b/sources/editor/graphicspart/partarc.cpp @@ -141,6 +141,18 @@ bool PartArc::fromXml(const QDomElement &qde) { m_span_angle *= 16; } +bool PartArc::valideXml(QDomElement& element) { + + if (propertyDouble(element, "x") == PropertyFlags::NoValidConversion || + propertyDouble(element, "y") == PropertyFlags::NoValidConversion || + propertyDouble(element, "width") == PropertyFlags::NoValidConversion || + propertyDouble(element, "height") == PropertyFlags::NoValidConversion || + propertyDouble(element, "start") == PropertyFlags::NoValidConversion || + propertyDouble(element, "angle") == PropertyFlags::NoValidConversion) + return false; + return true; +} + /** * @brief PartArc::shape * @return the shape of this item diff --git a/sources/editor/graphicspart/partarc.h b/sources/editor/graphicspart/partarc.h index 736a8c9de..792cd7d3b 100644 --- a/sources/editor/graphicspart/partarc.h +++ b/sources/editor/graphicspart/partarc.h @@ -53,6 +53,7 @@ class PartArc : public AbstractPartEllipse QString xmlName() const override { return(QString("arc")); } QDomElement toXml (QDomDocument &) const override; bool fromXml (const QDomElement &) override; + static bool valideXml(QDomElement& element); QPainterPath shape() const override; QPainterPath shadowShape() const override; diff --git a/sources/editor/graphicspart/partdynamictextfield.cpp b/sources/editor/graphicspart/partdynamictextfield.cpp index 2d09dcb5f..e04b007bc 100644 --- a/sources/editor/graphicspart/partdynamictextfield.cpp +++ b/sources/editor/graphicspart/partdynamictextfield.cpp @@ -183,12 +183,17 @@ bool PartDynamicTextField::fromXml(const QDomElement &dom_elmt) } propertyUuid(dom_elmt, "uuid", &m_uuid, QUuid::createUuid()); - m_uuid = QUuid(dom_elmt.attribute("uuid", QUuid::createUuid().toString())); - setFrame(dom_elmt.attribute("frame", "false") == "true"? true : false); - setTextWidth(dom_elmt.attribute("text_width", QString::number(-1)).toDouble()); + bool frame; + propertyBool(dom_elmt, "frame", &frame); + + double text_width; + propertyDouble(dom_elmt, "text_width", &text_width, -1); + setTextWidth(text_width); QMetaEnum me = DynamicElementTextItem::textFromMetaEnum(); - m_text_from = DynamicElementTextItem::TextFrom(me.keyToValue(dom_elmt.attribute("text_from").toStdString().data())); + QString text_from; + propertyString(dom_elmt, "text_from", &text_from); + m_text_from = DynamicElementTextItem::TextFrom(me.keyToValue(text_from.toStdString().data())); me = QMetaEnum::fromType(); QString alignment; @@ -223,6 +228,27 @@ bool PartDynamicTextField::fromXml(const QDomElement &dom_elmt) setColor(QColor(dom_color.text())); } +bool PartDynamicTextField::valideXml(QDomElement& dom_elmt) { + if (propertyDouble(dom_elmt, "x") == PropertyFlags::NoValidConversion || + propertyDouble(dom_elmt, "y") == PropertyFlags::NoValidConversion || + propertyDouble(dom_elmt, "z") == PropertyFlags::NoValidConversion || + propertyDouble(dom_elmt, "rotation") == PropertyFlags::NoValidConversion) + return false; + + if (propertyUuid(dom_elmt, "uuid") == PropertyFlags::NoValidConversion) + return false; + + if (propertyString(dom_elmt, "text_from")) + return false; + + if(propertyString(dom_elmt, "Halignment") == PropertyFlags::NotFound) + return false; + if(propertyString(dom_elmt, "Valignment") == PropertyFlags::NotFound) + return false; + + return true; +} + /** * @brief PartDynamicTextField::fromTextFieldXml * Setup this text from the xml definition of a text field (The xml tagg of a text field is "input"); diff --git a/sources/editor/graphicspart/partdynamictextfield.h b/sources/editor/graphicspart/partdynamictextfield.h index aadfb5044..b6e008b62 100644 --- a/sources/editor/graphicspart/partdynamictextfield.h +++ b/sources/editor/graphicspart/partdynamictextfield.h @@ -77,6 +77,7 @@ class PartDynamicTextField : public QGraphicsTextItem, public CustomElementPart QDomElement toXml(QDomDocument &dom_doc) const override; bool fromXml(const QDomElement &dom_elmt) override; void fromTextFieldXml(const QDomElement &dom_element); + static bool valideXml(QDomElement& dom_elmt); DynamicElementTextItem::TextFrom textFrom() const; void setTextFrom (DynamicElementTextItem::TextFrom text_from); diff --git a/sources/editor/graphicspart/partellipse.cpp b/sources/editor/graphicspart/partellipse.cpp index 50079eecb..ffc75e073 100644 --- a/sources/editor/graphicspart/partellipse.cpp +++ b/sources/editor/graphicspart/partellipse.cpp @@ -132,6 +132,26 @@ bool PartEllipse::fromXml(const QDomElement &qde) return true; } +bool PartEllipse::valideXml(QDomElement& element) { + if (element.tagName() == "ellipse") + { + if (propertyDouble(element, "width") & PropertyFlags::NoValidConversion || + propertyDouble(element, "height") & PropertyFlags::NoValidConversion) + return false; + } + else { + if (propertyDouble(element, "diameter") & PropertyFlags::NoValidConversion) + return false; + } + + + if ((propertyDouble(element, "x") & PropertyFlags::NoValidConversion) || + (propertyDouble(element, "y") & PropertyFlags::NoValidConversion)) + return false; + + return true; +} + /** * @brief PartEllipse::shape * @return the shape of this item diff --git a/sources/editor/graphicspart/partellipse.h b/sources/editor/graphicspart/partellipse.h index af2e822be..0b15136b7 100644 --- a/sources/editor/graphicspart/partellipse.h +++ b/sources/editor/graphicspart/partellipse.h @@ -54,6 +54,7 @@ class PartEllipse : public AbstractPartEllipse QString xmlName() const override { return(QString("ellipse")); } QDomElement toXml (QDomDocument &) const override; bool fromXml (const QDomElement &) override; + static bool valideXml(QDomElement& element); QPainterPath shape() const override; QPainterPath shadowShape() const override; void setRect(const QRectF &rect) override {AbstractPartEllipse::setRect(rect); adjusteHandlerPos();} diff --git a/sources/editor/graphicspart/partline.cpp b/sources/editor/graphicspart/partline.cpp index 228b0b2c2..d9a66b196 100644 --- a/sources/editor/graphicspart/partline.cpp +++ b/sources/editor/graphicspart/partline.cpp @@ -161,6 +161,20 @@ bool PartLine::fromXml(const QDomElement &qde) { return true; } +bool PartLine::valideXml(QDomElement& element) const { + if (propertyDouble(element, "x1") || + propertyDouble(element, "y1") || + propertyDouble(element, "x2") || + propertyDouble(element, "y2") || + propertyString(element, "end1") || + propertyString(element, "end2") || + propertyDouble(element, "length1") || + propertyDouble(element, "length2") ) + return false; + + return true; +} + /** * @brief PartLine::itemChange * @param change diff --git a/sources/editor/graphicspart/partline.h b/sources/editor/graphicspart/partline.h index 96f0185fa..5e8ccf971 100644 --- a/sources/editor/graphicspart/partline.h +++ b/sources/editor/graphicspart/partline.h @@ -72,6 +72,7 @@ class PartLine : public CustomElementGraphicPart QString xmlName() const override { return(QString("line")); } QDomElement toXml(QDomDocument &) const override; bool fromXml(const QDomElement &) override; + bool valideXml(QDomElement& element) const; virtual QPointF sceneP1() const; virtual QPointF sceneP2() const; QPainterPath shape() const override; diff --git a/sources/editor/graphicspart/partpolygon.cpp b/sources/editor/graphicspart/partpolygon.cpp index a6558f461..8a9aa54bc 100644 --- a/sources/editor/graphicspart/partpolygon.cpp +++ b/sources/editor/graphicspart/partpolygon.cpp @@ -138,6 +138,11 @@ QDomElement PartPolygon::toXml(QDomDocument &xml_document) const return(xml_element); } +bool PartPolygon::valideXml(QDomElement& element) { + // TODO: implement + return true; +} + /** * @brief PartPolygon::isUseless * @return true if this part is irrelevant and does not deserve to be Retained / registered. diff --git a/sources/editor/graphicspart/partpolygon.h b/sources/editor/graphicspart/partpolygon.h index d0fbb93ff..c59c18a24 100644 --- a/sources/editor/graphicspart/partpolygon.h +++ b/sources/editor/graphicspart/partpolygon.h @@ -63,6 +63,8 @@ class PartPolygon : public CustomElementGraphicPart QString xmlName() const override { return(QString("polygon")); } bool fromXml(const QDomElement &) override; QDomElement toXml(QDomDocument &) const override; + static bool valideXml(QDomElement& element); + QPainterPath shape () const override; QPainterPath shadowShape() const override; diff --git a/sources/editor/graphicspart/partrectangle.cpp b/sources/editor/graphicspart/partrectangle.cpp index 708d52b3f..170068f00 100644 --- a/sources/editor/graphicspart/partrectangle.cpp +++ b/sources/editor/graphicspart/partrectangle.cpp @@ -141,6 +141,18 @@ bool PartRectangle::fromXml(const QDomElement &qde) return true; } +bool PartRectangle::valideXml(QDomElement& element) { + // parameters have default values so no value is not a non valid xml element + if ((propertyDouble(element, "x") & PropertyFlags::NoValidConversion) | + (propertyDouble(element, "y") & PropertyFlags::NoValidConversion) | + (propertyDouble(element, "width") & PropertyFlags::NoValidConversion) | + (propertyDouble(element, "width") & PropertyFlags::NoValidConversion) | + (propertyDouble(element, "rx") & PropertyFlags::NoValidConversion) | + (propertyDouble(element, "ry") & PropertyFlags::NoValidConversion)) + return false; + return true; +} + /** * @brief PartRectangle::rect * @return : Returns the item's rectangle. diff --git a/sources/editor/graphicspart/partrectangle.h b/sources/editor/graphicspart/partrectangle.h index cc42de702..b6566ce5d 100644 --- a/sources/editor/graphicspart/partrectangle.h +++ b/sources/editor/graphicspart/partrectangle.h @@ -62,6 +62,7 @@ class PartRectangle : public CustomElementGraphicPart QString xmlName () const override { return(QString("rect")); } QDomElement toXml (QDomDocument &) const override; bool fromXml (const QDomElement &) override; + static bool valideXml(QDomElement& element); QRectF rect() const; void setRect(const QRectF &rect); diff --git a/sources/editor/graphicspart/partterminal.cpp b/sources/editor/graphicspart/partterminal.cpp index 92ade5134..47b9d8cf7 100644 --- a/sources/editor/graphicspart/partterminal.cpp +++ b/sources/editor/graphicspart/partterminal.cpp @@ -61,6 +61,10 @@ QDomElement PartTerminal::toXml(QDomDocument &xml_document) const { return d->toXml(xml_document); } +bool PartTerminal::valideXml(QDomElement& element) { + return TerminalData::valideXml(element); +} + /** Dessine la borne @param p QPainter a utiliser pour rendre le dessin diff --git a/sources/editor/graphicspart/partterminal.h b/sources/editor/graphicspart/partterminal.h index 1c44b82eb..73de2b195 100644 --- a/sources/editor/graphicspart/partterminal.h +++ b/sources/editor/graphicspart/partterminal.h @@ -59,6 +59,8 @@ class PartTerminal : public CustomElementGraphicPart QString xmlName() const override { return(QString("terminal")); } bool fromXml(const QDomElement &) override; QDomElement toXml(QDomDocument &) const override; + static bool valideXml(QDomElement& element); + void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) override; QPainterPath shape() const override; diff --git a/sources/editor/graphicspart/parttext.cpp b/sources/editor/graphicspart/parttext.cpp index 369355151..6ba0eecbb 100644 --- a/sources/editor/graphicspart/parttext.cpp +++ b/sources/editor/graphicspart/parttext.cpp @@ -119,6 +119,30 @@ QDomElement PartText::toXml(QDomDocument &xml_document) const return(xml_element); } +bool PartText::valideXml(QDomElement& element) { + + if (propertyInteger(element, "size") == PropertyFlags::NotFound || + propertyString(element, "font") == PropertyFlags::NotFound) { + return false; + } + + if (propertyString(element, "color") == PropertyFlags::NoValidConversion) + return false; + + + if (propertyString(element, "text")) + return false; + + if (propertyDouble(element, "x") == PropertyFlags::NoValidConversion || + propertyDouble(element, "y") == PropertyFlags::NoValidConversion) + return false; + + if (propertyDouble(element, "rotation", 0) == PropertyFlags::NoValidConversion) + return false; + + return true; +} + /** @return Les coordonnees du point situe en bas a gauche du texte. */ diff --git a/sources/editor/graphicspart/parttext.h b/sources/editor/graphicspart/parttext.h index 77a670d36..e2535ad93 100644 --- a/sources/editor/graphicspart/parttext.h +++ b/sources/editor/graphicspart/parttext.h @@ -60,6 +60,7 @@ class PartText : public QGraphicsTextItem, public CustomElementPart QString name() const override { return(QObject::tr("texte", "element part name")); } QString xmlName() const override { return(QString("text")); } bool fromXml(const QDomElement &) override; + static bool valideXml(QDomElement& element); QDomElement toXml(QDomDocument &) const override; void setRotation(qreal angle) {(QGraphicsObject::setRotation(QET::correctAngle(angle)));} bool isUseless() const override; diff --git a/sources/properties/propertiesinterface.cpp b/sources/properties/propertiesinterface.cpp index b4bd2bef8..7fd25dc1a 100644 --- a/sources/properties/propertiesinterface.cpp +++ b/sources/properties/propertiesinterface.cpp @@ -26,12 +26,18 @@ namespace { const QString boolS = "bool"; const QString stringS = "string"; const QString uuidS = "uuid"; + const QString colorS = "color"; } PropertiesInterface::PropertiesInterface() { } +bool PropertiesInterface::valideXml(QDomElement& element) { + qDebug(QString("ValideXml() is not implemented. File: %1, Line: %2").arg(__FILE__).arg(__LINE__).toStdString().data()); + return false; +} + QDomElement PropertiesInterface::createXmlProperty(QDomDocument &doc, const QString& name, const QString value) const { QDomElement p = doc.createElement("property"); p.setAttribute("name", name); @@ -44,7 +50,7 @@ QDomElement PropertiesInterface::createXmlProperty(QDomDocument& doc, const QStr QDomElement p = doc.createElement("property"); p.setAttribute("name", name); p.setAttribute("type", integerS); - p.setAttribute("value", value); + p.setAttribute("value", QString::number(value)); return p; } @@ -52,7 +58,7 @@ QDomElement PropertiesInterface::createXmlProperty(QDomDocument& doc, const QStr QDomElement p = doc.createElement("property"); p.setAttribute("name", name); p.setAttribute("type", doubleS); - p.setAttribute("value", value); + p.setAttribute("value", QString::number(value)); return p; } @@ -60,7 +66,7 @@ QDomElement PropertiesInterface::createXmlProperty(QDomDocument& doc, const QStr QDomElement p = doc.createElement("property"); p.setAttribute("name", name); p.setAttribute("type", boolS); - p.setAttribute("value", value); + p.setAttribute("value", QString::number(value)); return p; } @@ -72,6 +78,14 @@ QDomElement PropertiesInterface::createXmlProperty(QDomDocument& doc, const QStr return p; } +QDomElement PropertiesInterface::createXmlProperty(QDomDocument& doc, const QString& name, const QColor value) const { + QDomElement p = doc.createElement("property"); + p.setAttribute("name", name); + p.setAttribute("type", colorS); + p.setAttribute("value", value.name()); + return p; +} + QDomElement PropertiesInterface::property(const QDomElement& e, const QString& name) { for (int i=0; i < e.childNodes().count(); i++) { QDomElement child = e.childNodes().at(i).toElement(); @@ -86,7 +100,7 @@ QDomElement PropertiesInterface::property(const QDomElement& e, const QString& n /*! * \brief PropertiesInterface::attribute - * Returns the property with the name \p attribute_name + * Returns the property with the name \p attribute_name and type \p type * \param e Xml element which contains the property * \param attribute_name * \param type Type of the property @@ -185,6 +199,26 @@ PropertiesInterface::PropertyFlags PropertiesInterface::propertyBool(const QDomE return PropertyFlags::Success; } +PropertiesInterface::PropertyFlags PropertiesInterface::propertyColor(const QDomElement &e, const QString& attribute_name, QColor* color, QColor defaultValue) { + + QString attr; + + if (!attribute(e, attribute_name, colorS, &attr)) { + *color = defaultValue; + return PropertyFlags::NotFound; + } + + // verifie la validite de l'attribut + QColor tmp = QColor(attr); + if (!tmp.isValid()) + return PropertyFlags::NoValidConversion; + + if (color != nullptr) + *color = tmp; + + return PropertyFlags::Success; +} + PropertiesInterface::PropertyFlags PropertiesInterface::propertyUuid(const QDomElement &e, const QString& attribute_name, QUuid* uuid, QUuid defaultValue) { QString attr; diff --git a/sources/properties/propertiesinterface.h b/sources/properties/propertiesinterface.h index ebd60e533..ecb7d18b9 100644 --- a/sources/properties/propertiesinterface.h +++ b/sources/properties/propertiesinterface.h @@ -20,6 +20,7 @@ #include #include +#include #include #include #include "qet.h" @@ -34,12 +35,12 @@ class PropertiesInterface public: PropertiesInterface(); // Save/load properties to setting file. QString is use for prefix a word befor the name of each paramètre - virtual void toSettings (QSettings &settings, const QString& = QString()) const =0; - virtual void fromSettings (const QSettings &settings, const QString& = QString()) =0; + virtual void toSettings (QSettings &settings, const QString& = QString()) const {Q_UNUSED(settings)}; + virtual void fromSettings (const QSettings &settings, const QString& = QString()) {Q_UNUSED(settings)}; // Save/load properties to xml element virtual QDomElement toXml (QDomDocument &xml_document) const =0; virtual bool fromXml (const QDomElement &xml_element) =0; - virtual bool valideXml(QDomElement& element) const = 0; + static bool valideXml(QDomElement& element); /*! * Use this functions to add properties to the xml document @@ -49,14 +50,16 @@ class PropertiesInterface QDomElement createXmlProperty(QDomDocument& doc, const QString& name, const double value) const; QDomElement createXmlProperty(QDomDocument& doc, const QString& name, const bool value) const; QDomElement createXmlProperty(QDomDocument& doc, const QString& name, const QUuid value) const; + QDomElement createXmlProperty(QDomDocument& doc, const QString& name, const QColor value) const; static QDomElement property(const QDomElement& e, const QString& name); static bool attribute(const QDomElement& e, const QString& attribute_name, const QString& type, QString* attr); typedef enum PropertyFlags { Success = 0, - NotFound, - NoValidConversion, + NotFound = 1, + NoValidConversion = 2, + // = 4 }; static PropertyFlags propertyInteger(const QDomElement &e, const QString& attribute_name, int *entier = nullptr, int defaultValue = std::numeric_limits::quiet_NaN()); @@ -64,6 +67,8 @@ class PropertiesInterface static PropertyFlags propertyString(const QDomElement& e, const QString& attribute_name, QString* string = nullptr, QString defaultValue = QString()); static PropertyFlags propertyBool(const QDomElement &e, const QString& attribute_name, bool* boolean = nullptr, bool defaultValue = false); static PropertyFlags propertyUuid(const QDomElement &e, const QString& attribute_name, QUuid* uuid = nullptr, QUuid defaultValue = QUuid()); + static PropertyFlags propertyColor(const QDomElement &e, const QString& attribute_name, QColor* color = nullptr, QColor defaultValue = QColor()); + static bool validXmlProperty(const QDomElement& e); diff --git a/sources/properties/terminaldata.cpp b/sources/properties/terminaldata.cpp index 2aefb0710..5d3a72779 100644 --- a/sources/properties/terminaldata.cpp +++ b/sources/properties/terminaldata.cpp @@ -28,13 +28,13 @@ void TerminalData::setParent(QGraphicsObject* parent) q = parent; } -void TerminalData::toSettings(QSettings &settings, const QString) const +void TerminalData::toSettings(QSettings& settings, const QString&) const { Q_UNUSED(settings); } -void TerminalData::fromSettings(const QSettings &settings, const QString) +void TerminalData::fromSettings(const QSettings& settings, const QString&) { Q_UNUSED(settings); } @@ -89,6 +89,20 @@ bool TerminalData::fromXml (const QDomElement &xml_element) return true; } -bool TerminalData::valideXml(QDomElement& element) const { +bool TerminalData::valideXml(QDomElement& xml_element) { + if (propertyDouble(xml_element, "x")) + return false; + + if (propertyDouble(xml_element, "y")) + return false; + + if (propertyString(xml_element, "uuid")) + return false; + + if (propertyString(xml_element, "name")) + return false; + + if (propertyString(xml_element, "orientation")) + return false; return true; } diff --git a/sources/properties/terminaldata.h b/sources/properties/terminaldata.h index 4d5301cda..5c747dfe4 100644 --- a/sources/properties/terminaldata.h +++ b/sources/properties/terminaldata.h @@ -28,30 +28,14 @@ public: void setParent(QGraphicsObject* parent); // Save/load properties to setting file. QString is use for prefix a word befor the name of each paramètre - void toSettings(QSettings &settings, const QString = QString()) const override; - void fromSettings(const QSettings &settings, const QString = QString()) override; + void toSettings(QSettings &settings, const QString& = QString()) const override; + void fromSettings(const QSettings &settings, const QString& = QString()) override; // Save/load properties to xml element // This method is only called from the PartTerminal and should never called from the Terminal class QDomElement toXml(QDomDocument &xml_element) const override; bool fromXml(const QDomElement &xml_element) override; - bool valideXml(QDomElement &element) const override; - - /** - Permet de convertir une chaine de caracteres ("n", "s", "e" ou "w") - en orientation. Si la chaine fait plusieurs caracteres, seul le - premier est pris en compte. En cas d'incoherence, Qet::North est - retourne. - @param s Chaine de caractere cense representer une orientation - @return l'orientation designee par la chaine de caractere - */ - static Qet::Orientation orientationFromString(const QString &s); - - /** - @param o une orientation - @return une chaine de caractere representant l'orientation - */ - static QString orientationToString(Qet::Orientation o); + static bool valideXml(QDomElement &xml_element); // must be public, because this class is a private member of PartTerminal/Terminal and they must // access this data diff --git a/sources/properties/xrefproperties.cpp b/sources/properties/xrefproperties.cpp index 1992d920d..b8f4f6bc6 100644 --- a/sources/properties/xrefproperties.cpp +++ b/sources/properties/xrefproperties.cpp @@ -153,11 +153,6 @@ bool XRefProperties::fromXml(const QDomElement &xml_element) { return true; } -bool XRefProperties::valideXml(QDomElement& element) const { - // TODO: implement - return true; -} - /** * @brief XRefProperties::defaultProperties * @return the default properties stored in the setting file diff --git a/sources/properties/xrefproperties.h b/sources/properties/xrefproperties.h index e154827bb..9681657f5 100644 --- a/sources/properties/xrefproperties.h +++ b/sources/properties/xrefproperties.h @@ -44,7 +44,6 @@ class XRefProperties : public PropertiesInterface void fromSettings (const QSettings &settings, const QString& = QString()) override; QDomElement toXml (QDomDocument &xml_document) const override; bool fromXml(const QDomElement &xml_element) override; - bool valideXml(QDomElement& element) const override; static QHash defaultProperties(); diff --git a/sources/qetgraphicsitem/conductor.cpp b/sources/qetgraphicsitem/conductor.cpp index 804b4aa24..3be915975 100644 --- a/sources/qetgraphicsitem/conductor.cpp +++ b/sources/qetgraphicsitem/conductor.cpp @@ -573,36 +573,16 @@ ConductorTextItem *Conductor::textItem() const { @return true si l'element XML represente bien un Conducteur ; false sinon */ bool Conductor::valideXml(QDomElement &e){ - // verifie le nom du tag - if (e.tagName() != "conductor") return(false); - - // verifie la presence des attributs minimaux - if (!e.hasAttribute("terminal1")) return(false); - if (!e.hasAttribute("terminal2")) return(false); - - bool conv_ok; - // parse l'abscisse - if (e.hasAttribute("element1")) { - if (QUuid(e.attribute("element1")).isNull()) - return false; - if (QUuid(e.attribute("terminal1")).isNull()) - return false; - } else { - e.attribute("terminal1").toInt(&conv_ok); - if (!conv_ok) return(false); - } - - // parse l'ordonnee - if (e.hasAttribute("element2")) { - if (QUuid(e.attribute("element2")).isNull()) - return false; - if (QUuid(e.attribute("terminal2")).isNull()) - return false; - } else { - e.attribute("terminal2").toInt(&conv_ok); - if (!conv_ok) return(false); - } - return(true); + + // TODO: seems to short! (see fromXML) + if (propertyDouble(e, "x") || + propertyDouble(e, "y")) + return false; + + if (propertyBool(e, "freezeLabel")) + return false; + + return true; } /** @@ -973,8 +953,9 @@ void Conductor::pointsToSegments(const QList& points_list) { * @param e * @return true is loading success else return false */ -bool Conductor::fromXml(QDomElement &dom_element) +bool Conductor::fromXml(const QDomElement &dom_element) { + // TODO: seems to short! setPos(dom_element.attribute("x", nullptr).toDouble(), dom_element.attribute("y", nullptr).toDouble()); @@ -997,6 +978,54 @@ bool Conductor::fromXml(QDomElement &dom_element) return return_; } +// does not support legacy method +// dom_element.setAttribute("terminal1", table_adr_id.value(terminal1)); +QDomElement Conductor::toXml(QDomDocument & doc) const { + QDomElement dom_element = doc.createElement("conductor"); + + dom_element.appendChild(createXmlProperty(doc, "x", pos().x())); + dom_element.appendChild(createXmlProperty(doc, "y", pos().y())); + + // Terminal is uniquely identified by the uuid of the terminal and the element + dom_element.appendChild(createXmlProperty(doc, "element1", terminal1->parentElement()->uuid())); + dom_element.appendChild(createXmlProperty(doc, "terminal1", terminal1->uuid())); + + dom_element.appendChild(createXmlProperty(doc, "element2", terminal2->parentElement()->uuid())); + dom_element.appendChild(createXmlProperty(doc, "terminal2", terminal2->uuid())); + + dom_element.appendChild(createXmlProperty(doc, "freezeLabel", m_freeze_label)); + + // on n'exporte les segments du conducteur que si ceux-ci ont + // ete modifies par l'utilisateur + if (modified_path) + { + // parcours et export des segments + QDomElement current_segment; + foreach(ConductorSegment *segment, segmentsList()) + { + current_segment = doc.createElement("segment"); + current_segment.appendChild(createXmlProperty(doc, "orientation", segment->isHorizontal())); + current_segment.appendChild(createXmlProperty(doc, "length", segment -> length())); + dom_element.appendChild(current_segment); + } + } + + QDomElement dom_seq = m_autoNum_seq.toXml(doc); + dom_element.appendChild(dom_seq); + + // Export the properties and text + dom_element.appendChild(m_properties.toXml(doc)); + if(m_text_item->wasMovedByUser()) + { + dom_element.appendChild(createXmlProperty(doc, "userx", m_text_item->pos().x())); + dom_element.appendChild(createXmlProperty(doc, "usery", m_text_item->pos().y())); + } + if(m_text_item->wasRotateByUser()) + dom_element.appendChild(createXmlProperty(doc, "rotation", m_text_item->rotation())); + + return(dom_element); +} + /** Exporte les caracteristiques du conducteur sous forme d'une element XML. @param d Le document XML a utiliser pour creer l'element XML @@ -1004,61 +1033,61 @@ bool Conductor::fromXml(QDomElement &dom_element) bornes dans le document XML et leur adresse en memoire @return Un element XML representant le conducteur */ -QDomElement Conductor::toXml(QDomDocument &dom_document, QHash &table_adr_id) const -{ - QDomElement dom_element = dom_document.createElement("conductor"); +//QDomElement Conductor::toXml(QDomDocument &dom_document, QHash &table_adr_id) const +//{ +// QDomElement dom_element = dom_document.createElement("conductor"); - dom_element.setAttribute("x", QString::number(pos().x())); - dom_element.setAttribute("y", QString::number(pos().y())); +// dom_element.setAttribute("x", QString::number(pos().x())); +// dom_element.setAttribute("y", QString::number(pos().y())); - // Terminal is uniquely identified by the uuid of the terminal and the element - if (terminal1->uuid().isNull()) { - // legacy method to identify the terminal - dom_element.setAttribute("terminal1", table_adr_id.value(terminal1)); // for backward compability - } else { - dom_element.setAttribute("element1", terminal1->parentElement()->uuid().toString()); - dom_element.setAttribute("terminal1", terminal1->uuid().toString()); - } +// // Terminal is uniquely identified by the uuid of the terminal and the element +// if (terminal1->uuid().isNull()) { +// // legacy method to identify the terminal +// dom_element.setAttribute("terminal1", table_adr_id.value(terminal1)); // for backward compability +// } else { +// dom_element.setAttribute("element1", terminal1->parentElement()->uuid().toString()); +// dom_element.setAttribute("terminal1", terminal1->uuid().toString()); +// } - if (terminal2->uuid().isNull()) { - // legacy method to identify the terminal - dom_element.setAttribute("terminal2", table_adr_id.value(terminal2)); // for backward compability - } else { - dom_element.setAttribute("element2", terminal2->parentElement()->uuid().toString()); - dom_element.setAttribute("terminal2", terminal2->uuid().toString()); - } - dom_element.setAttribute("freezeLabel", m_freeze_label? "true" : "false"); +// if (terminal2->uuid().isNull()) { +// // legacy method to identify the terminal +// dom_element.setAttribute("terminal2", table_adr_id.value(terminal2)); // for backward compability +// } else { +// dom_element.setAttribute("element2", terminal2->parentElement()->uuid().toString()); +// dom_element.setAttribute("terminal2", terminal2->uuid().toString()); +// } +// dom_element.setAttribute("freezeLabel", m_freeze_label? "true" : "false"); - // on n'exporte les segments du conducteur que si ceux-ci ont - // ete modifies par l'utilisateur - if (modified_path) - { - // parcours et export des segments - QDomElement current_segment; - foreach(ConductorSegment *segment, segmentsList()) - { - current_segment = dom_document.createElement("segment"); - current_segment.setAttribute("orientation", segment -> isHorizontal() ? "horizontal" : "vertical"); - current_segment.setAttribute("length", QString("%1").arg(segment -> length())); - dom_element.appendChild(current_segment); - } - } +// // on n'exporte les segments du conducteur que si ceux-ci ont +// // ete modifies par l'utilisateur +// if (modified_path) +// { +// // parcours et export des segments +// QDomElement current_segment; +// foreach(ConductorSegment *segment, segmentsList()) +// { +// current_segment = dom_document.createElement("segment"); +// current_segment.setAttribute("orientation", segment -> isHorizontal() ? "horizontal" : "vertical"); +// current_segment.setAttribute("length", QString("%1").arg(segment -> length())); +// dom_element.appendChild(current_segment); +// } +// } - QDomElement dom_seq = m_autoNum_seq.toXml(dom_document); - dom_element.appendChild(dom_seq); +// QDomElement dom_seq = m_autoNum_seq.toXml(dom_document); +// dom_element.appendChild(dom_seq); - // Export the properties and text - m_properties. toXml(dom_element); - if(m_text_item->wasMovedByUser()) - { - dom_element.setAttribute("userx", QString::number(m_text_item->pos().x())); - dom_element.setAttribute("usery", QString::number(m_text_item->pos().y())); - } - if(m_text_item->wasRotateByUser()) - dom_element.setAttribute("rotation", QString::number(m_text_item->rotation())); +// // Export the properties and text +// m_properties.toXml(dom_document); +// if(m_text_item->wasMovedByUser()) +// { +// dom_element.setAttribute("userx", QString::number(m_text_item->pos().x())); +// dom_element.setAttribute("usery", QString::number(m_text_item->pos().y())); +// } +// if(m_text_item->wasRotateByUser()) +// dom_element.setAttribute("rotation", QString::number(m_text_item->rotation())); - return(dom_element); -} +// return(dom_element); +//} /** * @brief Conductor::pathFromXml @@ -1077,14 +1106,14 @@ bool Conductor::pathFromXml(const QDomElement &e) { if (current_segment.isNull() || current_segment.tagName() != "segment") continue; // le segment doit avoir une longueur - if (!current_segment.hasAttribute("length")) continue; + qreal segment_length; + if (propertyDouble(e, "length", & segment_length)) + continue; - // cette longueur doit etre un reel - bool ok; - qreal segment_length = current_segment.attribute("length").toDouble(&ok); - if (!ok) continue; + bool isHorizontal; + propertyBool(e, "orientation", &isHorizontal); - if (current_segment.attribute("orientation") == "horizontal") { + if (isHorizontal) { segments_x << segment_length; segments_y << 0.0; } else { diff --git a/sources/qetgraphicsitem/conductor.h b/sources/qetgraphicsitem/conductor.h index 818ba1444..5abc62620 100644 --- a/sources/qetgraphicsitem/conductor.h +++ b/sources/qetgraphicsitem/conductor.h @@ -19,6 +19,7 @@ #define CONDUCTOR_H #include "conductorproperties.h" +#include "propertiesinterface.h" #include #include "assignvariables.h" @@ -39,7 +40,7 @@ typedef QHash ConductorProfilesGroup; This class represents a conductor, i.e. a wire between two element terminals. */ -class Conductor : public QGraphicsObject +class Conductor : public QGraphicsObject, public PropertiesInterface { Q_OBJECT @@ -95,8 +96,9 @@ class Conductor : public QGraphicsObject public: static bool valideXml (QDomElement &); - bool fromXml (QDomElement &); - QDomElement toXml (QDomDocument &, QHash &) const; + bool fromXml (const QDomElement &) override; + //QDomElement toXml (QDomDocument &, QHash &) const; + QDomElement toXml (QDomDocument &doc) const override; private: bool pathFromXml(const QDomElement &); diff --git a/sources/qetgraphicsitem/element.h b/sources/qetgraphicsitem/element.h index 6c7f4c95f..2c3d55ffb 100644 --- a/sources/qetgraphicsitem/element.h +++ b/sources/qetgraphicsitem/element.h @@ -37,7 +37,7 @@ class ElementTextItemGroup; /** This is the base class for electrical elements. */ -class Element : public QetGraphicsItem +class Element : public QetGraphicsItem // TODO: derive from propertiesInterface! { friend class DiagramEventAddElement; diff --git a/sources/qetgraphicsitem/elementtextitemgroup.h b/sources/qetgraphicsitem/elementtextitemgroup.h index 9623abb31..46c8e43f1 100644 --- a/sources/qetgraphicsitem/elementtextitemgroup.h +++ b/sources/qetgraphicsitem/elementtextitemgroup.h @@ -32,7 +32,7 @@ class CrossRefItem; * This class represent a group of element text * Texts in the group can be aligned left / center /right */ -class ElementTextItemGroup : public QObject, public QGraphicsItemGroup +class ElementTextItemGroup : public QObject, public QGraphicsItemGroup // TODO: derive from PropertiesInterface { Q_OBJECT diff --git a/sources/qetgraphicsitem/terminal.cpp b/sources/qetgraphicsitem/terminal.cpp index f2f13dfe6..28bd89f52 100644 --- a/sources/qetgraphicsitem/terminal.cpp +++ b/sources/qetgraphicsitem/terminal.cpp @@ -735,21 +735,21 @@ QDomElement Terminal::toXml(QDomDocument &doc) const { @param terminal Le QDomElement a analyser @return true si le QDomElement passe en parametre est une borne, false sinon */ -bool Terminal::valideXml(QDomElement &terminal) const { +bool Terminal::valideXml(QDomElement &terminal) { if (terminal.tagName() != "terminal") return(false); - if (!propertyString(terminal, "number", nullptr)) + if (propertyString(terminal, "number")) return false; - if (!propertyString(terminal, "name", nullptr)) + if (propertyString(terminal, "name")) return false; - if (!propertyBool(terminal, "nameHidden", nullptr)) + if (propertyBool(terminal, "nameHidden")) return false; - if (!propertyDouble(terminal, "x", nullptr)) + if (propertyDouble(terminal, "x")) return false; - if (!propertyDouble(terminal, "y", nullptr)) + if (propertyDouble(terminal, "y")) return false; QString o; @@ -776,23 +776,23 @@ bool Terminal::valideXml(QDomElement &terminal) const { (memes coordonnes, meme orientation), false sinon */ bool Terminal::fromXml(const QDomElement &terminal) { - if (!propertyString(terminal, "number", &number_terminal_)) + if (propertyString(terminal, "number", &number_terminal_)) return false; - if (!propertyString(terminal, "name", &name_terminal_)) + if (propertyString(terminal, "name", &name_terminal_)) return false; - if (!propertyBool(terminal, "nameHidden", &name_terminal_hidden)) + if (propertyBool(terminal, "nameHidden", &name_terminal_hidden)) return false; double x, y; - if (!propertyDouble(terminal, "x", &x)) + if (propertyDouble(terminal, "x", &x)) return false; - if (!propertyDouble(terminal, "y", &y)) + if (propertyDouble(terminal, "y", &y)) return false; QString o; - if (!propertyString(terminal, "orientation", &o)) + if (propertyString(terminal, "orientation", &o)) return false; return ( diff --git a/sources/qetgraphicsitem/terminal.h b/sources/qetgraphicsitem/terminal.h index b33fdcae9..36160cedc 100644 --- a/sources/qetgraphicsitem/terminal.h +++ b/sources/qetgraphicsitem/terminal.h @@ -90,7 +90,7 @@ class Terminal : public QGraphicsObject, public PropertiesInterface bool canBeLinkedTo(Terminal *); // methods related to XML import/export - bool valideXml(QDomElement &) const override; + static bool valideXml(QDomElement &); bool fromXml (const QDomElement &) override; QDomElement toXml (QDomDocument &) const override; diff --git a/sources/titleblockproperties.cpp b/sources/titleblockproperties.cpp index 06a9a1e4a..35e98945c 100644 --- a/sources/titleblockproperties.cpp +++ b/sources/titleblockproperties.cpp @@ -109,24 +109,31 @@ QDomElement TitleBlockProperties::toXml(QDomDocument &xml_document) const { @param e Element XML dont les attributs seront lus */ bool TitleBlockProperties::fromXml(const QDomElement &e) { - // reads the historical fields - if (e.hasAttribute("author")) author = e.attribute("author"); - if (e.hasAttribute("title")) title = e.attribute("title"); - if (e.hasAttribute("filename")) filename = e.attribute("filename"); - if (e.hasAttribute("plant")) plant = e.attribute("plant"); - if (e.hasAttribute("locmach")) locmach = e.attribute("locmach"); - if (e.hasAttribute("indexrev")) indexrev = e.attribute("indexrev"); - if (e.hasAttribute("version")) version = e.attribute("version"); - if (e.hasAttribute("folio")) folio = e.attribute("folio"); - if (e.hasAttribute("auto_page_num")) auto_page_num = e.attribute("auto_page_num"); - if (e.hasAttribute("date")) setDateFromString(e.attribute("date")); - if (e.hasAttribute("displayAt")) display_at = (e.attribute("displayAt") == "bottom" ? Qt::BottomEdge : Qt::RightEdge); - - // reads the template used to render the title block - if (e.hasAttribute("titleblocktemplate")) - { - template_name = e.attribute("titleblocktemplate"); - collection = QET::qetCollectionFromString(e.attribute("titleblocktemplateCollection")); + + + // reads the historical fields + propertyString(e, "author", &author); + propertyString(e, "title", &title); + propertyString(e, "filename", &filename); + propertyString(e, "plant", &plant); + propertyString(e, "locmach", &locmach); + propertyString(e, "indexrev", &indexrev); + propertyString(e, "version", &version); + propertyString(e, "folio", &folio); + propertyString(e, "auto_page_num", &auto_page_num); + QString date; + propertyString(e, "date", &date); + setDateFromString(date); + + QString display_at_temp; + propertyString(e, "displayAt", &display_at_temp); + display_at = (display_at_temp == "bottom" ? Qt::BottomEdge : Qt::RightEdge); + + // reads the template used to render the title block + if (propertyString(e, "titleblocktemplate", &template_name)) { + QString tbc; + propertyString(e, "titleblocktemplateCollection", &tbc); + collection = QET::qetCollectionFromString(tbc); } // reads the additional fields used to fill the title block @@ -164,7 +171,7 @@ void TitleBlockProperties::toSettings(QSettings &settings, const QString &prefix @param settings Parametres a lire @param prefix prefixe a ajouter devant les noms des parametres */ -void TitleBlockProperties::fromSettings(QSettings &settings, const QString &prefix) { +void TitleBlockProperties::fromSettings(const QSettings &settings, const QString &prefix) { title = settings.value(prefix + "title").toString(); author = settings.value(prefix + "author").toString(); filename = settings.value(prefix + "filename").toString(); diff --git a/sources/titleblockproperties.h b/sources/titleblockproperties.h index 480a0265f..df49cc783 100644 --- a/sources/titleblockproperties.h +++ b/sources/titleblockproperties.h @@ -43,8 +43,8 @@ class TitleBlockProperties: public PropertiesInterface { QDomElement toXml(QDomDocument &xml_document) const override; bool fromXml(const QDomElement &) override; - void toSettings(QSettings &, const QString & = QString()) const; - void fromSettings(QSettings &, const QString & = QString()); + void toSettings(QSettings &, const QString & = QString()) const override; + void fromSettings(const QSettings &, const QString & = QString()) override; void setAutoPageNum(QString autonum) {auto_page_num = autonum;}