diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 7eedb0246..6cccf6e56 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -863,53 +863,6 @@ bool Diagram::initFromXml(QDomElement &document, QPointF position, bool consider return(from_xml); } -/*! - * \brief findTerminal - * Find terminal to which the conductor should be connected - * \param conductor_index 1 or 2 depending on which terminal is searched - * \param f Conductor xml element - * \param table_adr_id Hash table to all terminal id assignement (legacy) - * \param added_elements Elements found in the xml file - * \return - */ -Terminal* findTerminal(int conductor_index, QDomElement& f, QHash& table_adr_id, QList& added_elements) { - assert(conductor_index == 1 || conductor_index == 2); - - QString element_index = "element" + QString::number(conductor_index); - QString terminal_index = "terminal" + QString::number(conductor_index); - - if (f.hasAttribute(element_index)) { - QUuid element_uuid = QUuid(f.attribute(element_index)); - // element1 did not exist in the conductor part of the xml until prior 0.7 - // It is used as an indicator that uuid's are used to identify terminals - bool element_found = false; - for (auto element: added_elements) { - if (element->uuid() != element_uuid) - continue; - element_found = true; - QUuid terminal_uuid = QUuid(f.attribute(terminal_index)); - for (auto terminal: element->terminals()) { - if (terminal->uuid() != terminal_uuid) - continue; - - return terminal; - } - qDebug() << "Diagram::fromXml() : "<< terminal_index << ":" << terminal_uuid << "not found in " << element_index << ":" << element_uuid; - break; - } - if (!element_found) - qDebug() << "Diagram::fromXml() : " << element_index << ": " << element_uuid << "not found"; - } else { - // Backward compatibility. Until version 0.7 a generated id is used to link the terminal. - int id_p1 = f.attribute(terminal_index).toInt(); - if (!table_adr_id.contains(id_p1)) { - qDebug() << "Diagram::fromXml() : terminal id " << id_p1 << " not found"; - } else - return table_adr_id.value(id_p1); - } - return nullptr; -} - /** Importe le schema decrit dans un element XML. Si une position est precisee, les elements importes sont positionnes de maniere a ce que le @@ -1078,22 +1031,26 @@ bool Diagram::fromXml(QDomElement &document, QPointF position, bool consider_inf if (!Conductor::valideXml(f)) continue; //Check if terminal that conductor must be linked is know - - Terminal* p1 = findTerminal(1, f, table_adr_id, added_elements); - Terminal* p2 = findTerminal(2, f, table_adr_id, added_elements); - - if (p1 && p2 && p1 != p2) - { - Conductor *c = new Conductor(p1, p2); - if (c->isValid()) - { - addItem(c); - c -> fromXml(f); - added_conductors << c; - } - else - delete c; - } + int id_p1 = f.attribute("terminal1").toInt(); + int id_p2 = f.attribute("terminal2").toInt(); + if (table_adr_id.contains(id_p1) && table_adr_id.contains(id_p2)) + { + Terminal *p1 = table_adr_id.value(id_p1); + Terminal *p2 = table_adr_id.value(id_p2); + if (p1 != p2) + { + Conductor *c = new Conductor(p1, p2); + if (c->isValid()) + { + addItem(c); + c -> fromXml(f); + added_conductors << c; + } + else + delete c; + } + } + else qDebug() << "Diagram::fromXml() : Le chargement du conducteur" << id_p1 << id_p2 << "a echoue"; } //Load tables diff --git a/sources/editor/arceditor.cpp b/sources/editor/arceditor.cpp index 059e2e2ce..f8606c013 100644 --- a/sources/editor/arceditor.cpp +++ b/sources/editor/arceditor.cpp @@ -128,10 +128,6 @@ CustomElementPart *ArcEditor::currentPart() const { return(part); } -QList ArcEditor::currentParts() const { - return style_->currentParts(); -} - /** * @brief ArcEditor::updateArcS * Update the start angle of the arc according to the edited value. diff --git a/sources/editor/arceditor.h b/sources/editor/arceditor.h index fa5ff2ed3..0b1527c03 100644 --- a/sources/editor/arceditor.h +++ b/sources/editor/arceditor.h @@ -51,7 +51,6 @@ class ArcEditor : public ElementItemEditor public: bool setPart(CustomElementPart *) override; CustomElementPart *currentPart() const override; - QList currentParts() const override; public slots: void updateArcS(); diff --git a/sources/editor/elementitemeditor.h b/sources/editor/elementitemeditor.h index 2b9025daa..349835052 100644 --- a/sources/editor/elementitemeditor.h +++ b/sources/editor/elementitemeditor.h @@ -54,7 +54,6 @@ class ElementItemEditor : public QWidget virtual bool setParts(QList ) {return false;} virtual CustomElementPart *currentPart() const = 0; - virtual QList currentParts() const = 0; virtual void updateForm() = 0; // attributes diff --git a/sources/editor/ellipseeditor.cpp b/sources/editor/ellipseeditor.cpp index 982b156b0..b5e07748d 100644 --- a/sources/editor/ellipseeditor.cpp +++ b/sources/editor/ellipseeditor.cpp @@ -109,10 +109,6 @@ CustomElementPart *EllipseEditor::currentPart() const { return(part); } -QList EllipseEditor::currentParts() const { - return style_->currentParts(); -} - void EllipseEditor::editingFinished() { if (m_locked) return; diff --git a/sources/editor/ellipseeditor.h b/sources/editor/ellipseeditor.h index 11f0ff6d6..d808a0ded 100644 --- a/sources/editor/ellipseeditor.h +++ b/sources/editor/ellipseeditor.h @@ -49,7 +49,6 @@ class EllipseEditor : public ElementItemEditor public: bool setPart(CustomElementPart *) override; CustomElementPart *currentPart() const override; - QList currentParts() const override; public slots: void editingFinished(); diff --git a/sources/editor/graphicspart/partterminal.cpp b/sources/editor/graphicspart/partterminal.cpp index 88cb59ba3..a1b557d79 100644 --- a/sources/editor/graphicspart/partterminal.cpp +++ b/sources/editor/graphicspart/partterminal.cpp @@ -25,11 +25,9 @@ @param scene La scene sur laquelle figure cette borne */ PartTerminal::PartTerminal(QETElementEditor *editor, QGraphicsItem *parent) : - CustomElementGraphicPart(editor, parent) + CustomElementGraphicPart(editor, parent), + m_orientation(Qet::North) { - d = new TerminalData(this); - d->m_orientation = Qet::North; - d->m_uuid = QUuid::createUuid(); // if part is loaded this uuid will be overwritten, but being sure that terminal has a uuid updateSecondPoint(); setZValue(100000); } @@ -43,8 +41,15 @@ PartTerminal::~PartTerminal() { @param xml_elmt Element XML a lire */ void PartTerminal::fromXml(const QDomElement &xml_elmt) { - d->fromXml(xml_elmt); - setPos(d->m_pos); + // lit la position de la borne + qreal term_x = 0.0, term_y = 0.0; + QET::attributeIsAReal(xml_elmt, "x", &term_x); + QET::attributeIsAReal(xml_elmt, "y", &term_y); + setPos(QPointF(term_x, term_y)); + + // lit l'orientation de la borne + m_orientation = Qet::orientationFromString(xml_elmt.attribute("orientation")); + updateSecondPoint(); } @@ -54,7 +59,18 @@ void PartTerminal::fromXml(const QDomElement &xml_elmt) { @return un element XML decrivant la borne */ const QDomElement PartTerminal::toXml(QDomDocument &xml_document) const { - return d->toXml(xml_document); + QDomElement xml_element = xml_document.createElement("terminal"); + + // ecrit la position de la borne + xml_element.setAttribute("x", QString("%1").arg(scenePos().x())); + xml_element.setAttribute("y", QString("%1").arg(scenePos().y())); + + + // ecrit l'orientation de la borne + xml_element.setAttribute("orientation", Qet::orientationToString(m_orientation)); + // Write name and number to XML + + return(xml_element); } /** @@ -79,7 +95,7 @@ void PartTerminal::paint(QPainter *p, const QStyleOptionGraphicsItem *options, Q // dessin de la borne en rouge t.setColor(isSelected() ? Terminal::neutralColor : Qt::red); p -> setPen(t); - p -> drawLine(QPointF(0.0, 0.0), d->second_point); + p -> drawLine(QPointF(0.0, 0.0), second_point); // dessin du point d'amarrage au conducteur en bleu t.setColor(isSelected() ? Qt::red : Terminal::neutralColor); @@ -99,7 +115,7 @@ void PartTerminal::paint(QPainter *p, const QStyleOptionGraphicsItem *options, Q QPainterPath PartTerminal::shape() const { QPainterPath shape; - shape.lineTo(d->second_point); + shape.lineTo(second_point); QPainterPathStroker pps; pps.setWidth(1); @@ -113,7 +129,7 @@ QPainterPath PartTerminal::shape() const */ QRectF PartTerminal::boundingRect() const { - QRectF br(QPointF(0, 0), d->second_point); + QRectF br(QPointF(0, 0), second_point); br = br.normalized(); qreal adjust = (SHADOWS_HEIGHT + 1) / 2; @@ -127,31 +143,24 @@ QRectF PartTerminal::boundingRect() const */ void PartTerminal::setOrientation(Qet::Orientation ori) { - if (d->m_orientation == ori) return; + if (m_orientation == ori) return; prepareGeometryChange(); - d->m_orientation = ori; + m_orientation = ori; updateSecondPoint(); emit orientationChanged(); } -void PartTerminal::setName(QString& name) -{ - if (d->m_name == name) return; - d->m_name = name; - emit nameChanged(); -} - /** Met a jour la position du second point en fonction de la position et de l'orientation de la borne. */ void PartTerminal::updateSecondPoint() { qreal ts = 4.0; // terminal size - switch(d->m_orientation) { - case Qet::North: d->second_point = QPointF(0.0, ts); break; - case Qet::East : d->second_point = QPointF(-ts, 0.0); break; - case Qet::South: d->second_point = QPointF(0.0, -ts); break; - case Qet::West : d->second_point = QPointF(ts, 0.0); break; + switch(m_orientation) { + case Qet::North: second_point = QPointF(0.0, ts); break; + case Qet::East : second_point = QPointF(-ts, 0.0); break; + case Qet::South: second_point = QPointF(0.0, -ts); break; + case Qet::West : second_point = QPointF(ts, 0.0); break; } } diff --git a/sources/editor/graphicspart/partterminal.h b/sources/editor/graphicspart/partterminal.h index 26c624bc9..4565468bf 100644 --- a/sources/editor/graphicspart/partterminal.h +++ b/sources/editor/graphicspart/partterminal.h @@ -19,8 +19,6 @@ #define PART_TERMINAL_H #include "customelementgraphicpart.h" -#include "QUuid" -#include "terminaldata.h" @@ -33,7 +31,6 @@ class PartTerminal : public CustomElementGraphicPart Q_OBJECT Q_PROPERTY(Qet::Orientation orientation READ orientation WRITE setOrientation) - Q_PROPERTY(QString name READ name WRITE setName) public: @@ -45,7 +42,12 @@ class PartTerminal : public CustomElementGraphicPart signals: void orientationChanged(); - void nameChanged(); + + // attributes + private: + Qet::Orientation m_orientation; + QPointF second_point; + // methods public: @@ -55,7 +57,7 @@ class PartTerminal : public CustomElementGraphicPart * @return the QGraphicsItem type */ int type() const override { return Type; } - QString name() const override { return d->m_name; } + QString name() const override { return(QObject::tr("borne", "element part name")); } QString xmlName() const override { return(QString("terminal")); } void fromXml(const QDomElement &) override; const QDomElement toXml(QDomDocument &) const override; @@ -69,14 +71,11 @@ class PartTerminal : public CustomElementGraphicPart void startUserTransformation(const QRectF &) override; void handleUserTransformation(const QRectF &, const QRectF &) override; - Qet::Orientation orientation() const {return d->m_orientation;} + Qet::Orientation orientation() const {return m_orientation;} void setOrientation(Qet::Orientation ori); - - void setName(QString& name); private: void updateSecondPoint(); - TerminalData* d; // pointer to the terminal data private: QPointF saved_position_; diff --git a/sources/editor/lineeditor.cpp b/sources/editor/lineeditor.cpp index 8293f978f..baee161b9 100644 --- a/sources/editor/lineeditor.cpp +++ b/sources/editor/lineeditor.cpp @@ -146,10 +146,6 @@ CustomElementPart *LineEditor::currentPart() const { return(part); } -QList LineEditor::currentParts() const { - return style_->currentParts(); -} - /** * @brief LineEditor::editedP1 * @return The edited P1 in item coordinate diff --git a/sources/editor/lineeditor.h b/sources/editor/lineeditor.h index 00c5a3c12..c1c45d3bb 100644 --- a/sources/editor/lineeditor.h +++ b/sources/editor/lineeditor.h @@ -51,7 +51,6 @@ class LineEditor : public ElementItemEditor public: bool setPart(CustomElementPart *) override; CustomElementPart *currentPart() const override; - QList currentParts() const override; QPointF editedP1() const; QPointF editedP2() const; diff --git a/sources/editor/qetelementeditor.cpp b/sources/editor/qetelementeditor.cpp index 19e7746e4..b88fc6beb 100644 --- a/sources/editor/qetelementeditor.cpp +++ b/sources/editor/qetelementeditor.cpp @@ -610,86 +610,73 @@ void QETElementEditor::slot_setNoDragToView() { void QETElementEditor::slot_updateInformations() { QList selected_qgis = m_elmt_scene -> selectedItems(); - if (selected_qgis.isEmpty()) { - clearToolsDock(); - m_default_informations -> setText(tr("%n partie(s) sélectionnée(s).", - "", - selected_qgis.size())); - m_default_informations -> setAlignment(Qt::AlignHCenter | Qt::AlignTop); - m_tools_dock_stack -> setCurrentIndex(0); - return; - } - QList cep_list; + bool style_editable = false; - CustomElementPart* part = dynamic_cast(selected_qgis.first()); - QString selection_xml_name = part->xmlName(); - bool same_xml_name = true; - bool style_editable = true; - for (QGraphicsItem *qgi: selected_qgis) { - if (CustomElementPart *cep = dynamic_cast(qgi)) { - cep_list << cep; - if (cep->xmlName() != selection_xml_name) - same_xml_name = false; - } else { - style_editable = false; - same_xml_name = false; - } - } - if (style_editable) - style_editable = StyleEditor::isStyleEditable(cep_list); + //Test if part are editable by style editor + if (selected_qgis.size() >= 2) + { + style_editable = true; + foreach (QGraphicsItem *qgi, selected_qgis) + { + if (CustomElementPart *cep = dynamic_cast(qgi)) + cep_list << cep; + else + style_editable = false; + } + if (style_editable) + style_editable = StyleEditor::isStyleEditable(cep_list); - if (same_xml_name) { - if (selection_xml_name == "terminal" || - selection_xml_name == "text" || - selection_xml_name == "dynamic_text") { - clearToolsDock(); - //We add the editor widget - ElementItemEditor *editor = static_cast(m_editors[selection_xml_name]); - - // TODO: Check if it takes longer than setting the parts again to the editor. - bool equal = true; - QList parts = editor->currentParts(); - if (parts.length() == cep_list.length()) { - for (auto cep: cep_list) { - bool part_found = false; - for (auto part: parts) { - if (part == cep) { - part_found = true; - break; - } - } - if (!part_found) { - equal = false; - break; - } - } - } else - equal = false; - - if (editor) - { - bool success = true; - if (equal == false) { - success = editor->setParts(cep_list); - } - if (success) - { - m_tools_dock_stack->insertWidget(1, editor); - m_tools_dock_stack -> setCurrentIndex(1); - } - else - { - qDebug() << "Editor refused part."; - } - } - return; - } - - } - - //There's several parts selecteds and all can be edited by style editor. - if (style_editable) + } + + if(selected_qgis.size() == 1) + { + QGraphicsItem *qgi = selected_qgis.first(); + if (CustomElementPart *selection = dynamic_cast(qgi)) + { + if (QWidget *widget = m_tools_dock_stack->widget(1)) + { + if (ElementItemEditor *editor = dynamic_cast(widget)) + { + if(editor->currentPart() == selection) + return; + } + } + } + } + + //There's one selected item + if (selected_qgis.size() == 1) + { + QGraphicsItem *qgi = selected_qgis.first(); + if (CustomElementPart *selection = dynamic_cast(qgi)) + { + //The current editor already edit the selected part + if (QWidget *widget = m_tools_dock_stack->widget(1)) + if (ElementItemEditor *editor = dynamic_cast(widget)) + if(editor->currentPart() == selection) + return; + + clearToolsDock(); + //We add the editor widget + QString selection_xml_name = selection -> xmlName(); + ElementItemEditor *selection_editor = m_editors[selection_xml_name]; + if (selection_editor) + { + if (selection_editor->setPart(selection)) + { + m_tools_dock_stack->insertWidget(1, selection_editor); + m_tools_dock_stack -> setCurrentIndex(1); + } + else + { + qDebug() << "Editor refused part."; + } + } + } + } + //There's several parts selecteds and all can be edited by style editor. + else if (style_editable) { clearToolsDock(); ElementItemEditor *selection_editor = m_editors["style"]; diff --git a/sources/editor/styleeditor.cpp b/sources/editor/styleeditor.cpp index e749a539d..7fff7a7cb 100644 --- a/sources/editor/styleeditor.cpp +++ b/sources/editor/styleeditor.cpp @@ -489,7 +489,6 @@ bool StyleEditor::setPart(CustomElementPart *new_part) { if (CustomElementGraphicPart *part_graphic = dynamic_cast(new_part)) { part = part_graphic; - m_cep_list.append(part_graphic); updateForm(); return(true); } @@ -539,10 +538,6 @@ CustomElementPart *StyleEditor::currentPart() const { return(part); } -QList StyleEditor::currentParts() const { - return m_cep_list; -} - /** * @brief StyleEditor::isStyleEditable * @param cep_list @@ -553,7 +548,7 @@ bool StyleEditor::isStyleEditable(QList cep_list) QStringList str; str << "arc" << "ellipse" << "line" << "polygon" << "rect"; - for (CustomElementPart *cep: cep_list) + foreach (CustomElementPart *cep, cep_list) if (!str.contains(cep -> xmlName())) return false; diff --git a/sources/editor/styleeditor.h b/sources/editor/styleeditor.h index 9cfcc5ad9..58a2fb4a2 100644 --- a/sources/editor/styleeditor.h +++ b/sources/editor/styleeditor.h @@ -53,9 +53,8 @@ class StyleEditor : public ElementItemEditor // methods public: bool setPart(CustomElementPart *) override; - bool setParts(QList); + bool setParts(QList) override; CustomElementPart *currentPart() const override; - QList currentParts() const override; static bool isStyleEditable (QList cep_list); diff --git a/sources/editor/terminaleditor.cpp b/sources/editor/terminaleditor.cpp index 552bf7b61..4d349ab66 100644 --- a/sources/editor/terminaleditor.cpp +++ b/sources/editor/terminaleditor.cpp @@ -25,65 +25,51 @@ #include #include -TerminalEditor::TerminalEditor(QETElementEditor* editor, QWidget* parent): - ElementItemEditor(editor, parent) -{ - m_part = nullptr; - m_terminals.clear(); - init(); -} - /** Constructeur @param editor L'editeur d'element concerne @param term La borne a editer @param parent QWidget parent de ce widget */ -TerminalEditor::TerminalEditor(QETElementEditor *editor, QList &terms, QWidget *parent) : +TerminalEditor::TerminalEditor(QETElementEditor *editor, PartTerminal *term, QWidget *parent) : ElementItemEditor(editor, parent), - m_terminals(terms), - m_part(terms.first()) + part(term), + m_locked(false) { - init(); + qle_x = new QDoubleSpinBox(); + qle_y = new QDoubleSpinBox(); + + qle_x -> setRange(-5000, 5000); + qle_y -> setRange(-5000, 5000); + + orientation = new QComboBox(); + orientation -> addItem(QET::Icons::North, tr("Nord"), Qet::North); + orientation -> addItem(QET::Icons::East, tr("Est"), Qet::East); + orientation -> addItem(QET::Icons::South, tr("Sud"), Qet::South); + orientation -> addItem(QET::Icons::West, tr("Ouest"), Qet::West); + + QVBoxLayout *main_layout = new QVBoxLayout(); + main_layout -> addWidget(new QLabel(tr("Position : "))); + + QHBoxLayout *position = new QHBoxLayout(); + position -> addWidget(new QLabel(tr("x : "))); + position -> addWidget(qle_x ); + position -> addWidget(new QLabel(tr("y : "))); + position -> addWidget(qle_y ); + main_layout -> addLayout(position); + + QHBoxLayout *ori = new QHBoxLayout(); + ori -> addWidget(new QLabel(tr("Orientation : "))); + ori -> addWidget(orientation ); + main_layout -> addLayout(ori); + + main_layout -> addStretch(); + setLayout(main_layout); + + activeConnections(true); + updateForm(); } -void TerminalEditor::init() { - qle_x = new QDoubleSpinBox(); - qle_y = new QDoubleSpinBox(); - - qle_x -> setRange(-5000, 5000); - qle_y -> setRange(-5000, 5000); - - orientation = new QComboBox(); - orientation -> addItem(QET::Icons::North, tr("Nord"), Qet::North); - orientation -> addItem(QET::Icons::East, tr("Est"), Qet::East); - orientation -> addItem(QET::Icons::South, tr("Sud"), Qet::South); - orientation -> addItem(QET::Icons::West, tr("Ouest"), Qet::West); - - QVBoxLayout *main_layout = new QVBoxLayout(); - main_layout -> addWidget(new QLabel(tr("Position : "))); - - QHBoxLayout *position = new QHBoxLayout(); - position -> addWidget(new QLabel(tr("x : "))); - position -> addWidget(qle_x ); - position -> addWidget(new QLabel(tr("y : "))); - position -> addWidget(qle_y ); - main_layout -> addLayout(position); - - QHBoxLayout *ori = new QHBoxLayout(); - ori -> addWidget(new QLabel(tr("Orientation : "))); - ori -> addWidget(orientation ); - main_layout -> addLayout(ori); - - main_layout -> addStretch(); - setLayout(main_layout); - - activeConnections(true); - updateForm(); -} - - - /// Destructeur TerminalEditor::~TerminalEditor() { }; @@ -96,69 +82,33 @@ TerminalEditor::~TerminalEditor() { @param new_part Nouvelle primitive a editer @return true si l'editeur a accepter d'editer la primitive, false sinon */ -bool TerminalEditor::setPart(CustomElementPart* new_part) +bool TerminalEditor::setPart(CustomElementPart *new_part) { - m_terminals.clear(); if (!new_part) { - if (m_part) - disconnect(m_part, &PartTerminal::orientationChanged, this, &TerminalEditor::updateForm); - m_part = nullptr; + if (part) + disconnect(part, &PartTerminal::orientationChanged, this, &TerminalEditor::updateForm); + part = nullptr; return(true); } - if (PartTerminal *part_terminal = static_cast(new_part)) + if (PartTerminal *part_terminal = dynamic_cast(new_part)) { - if(m_part == part_terminal) return true; - if (m_part) - disconnect(m_part, &PartTerminal::orientationChanged, this, &TerminalEditor::updateForm); - m_part = part_terminal; + if(part == part_terminal) return true; + if (part) + disconnect(part, &PartTerminal::orientationChanged, this, &TerminalEditor::updateForm); + part = part_terminal; updateForm(); - connect(m_part, &PartTerminal::orientationChanged, this, &TerminalEditor::updateForm); + connect(part, &PartTerminal::orientationChanged, this, &TerminalEditor::updateForm); return(true); } return(false); } -bool TerminalEditor::setParts(QList parts) -{ - if (parts.isEmpty()) - { - m_terminals.clear(); - if (m_part) - disconnect(m_part, &PartTerminal::orientationChanged, this, &TerminalEditor::updateForm); - m_part = nullptr; - return(true); - } - - if (PartTerminal *part_terminal = static_cast(parts.first())) - { - if (m_part) - disconnect(m_part, &PartTerminal::orientationChanged, this, &TerminalEditor::updateForm); - m_part = part_terminal; - m_terminals.clear(); - m_terminals.append(part_terminal); - for (int i=1; i < parts.length(); i++) - m_terminals.append(static_cast(parts[i])); - updateForm(); - connect(m_part, &PartTerminal::orientationChanged, this, &TerminalEditor::updateForm); - return(true); - } - return(false); -} - /** @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas */ CustomElementPart *TerminalEditor::currentPart() const { - return(m_part); -} - -QList TerminalEditor::currentParts() const { - QList parts; - for (auto term: m_terminals) { - parts.append(static_cast(term)); - } - return parts; + return(part); } /// Met a jour l'orientation de la borne et cree un objet d'annulation @@ -167,53 +117,28 @@ void TerminalEditor::updateTerminalO() if (m_locked) return; m_locked = true; QVariant var(orientation -> itemData(orientation -> currentIndex())); - - for (int i=0; i < m_terminals.length(); i++) { - PartTerminal* term = m_terminals[i]; - if (var != term->property("orientation")) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(term, "orientation", term->property("orientation"), var); - undo->setText(tr("Modifier l'orientation d'une borne")); - undoStack().push(undo); - } - } + if (var != part->property("orientation")) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(part, "orientation", part->property("orientation"), var); + undo->setText(tr("Modifier l'orientation d'une borne")); + undoStack().push(undo); + } m_locked = false; } -void TerminalEditor::updateXPos() { - if (m_locked) return; - m_locked = true; - QPointF new_pos(qle_x->value(), 0); - - for (int i=0; i < m_terminals.length(); i++) { - PartTerminal* term = m_terminals[i]; - new_pos.setY(term->pos().y()); // change only x value - if (term->pos() != new_pos) { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(term, "pos", term->property("pos"), new_pos); - undo->setText(tr("Déplacer une borne")); - undo->enableAnimation(); - undoStack().push(undo); - } - } - m_locked=false; -} - -void TerminalEditor::updateYPos() { - if (m_locked) return; - m_locked = true; - QPointF new_pos(0, qle_y->value()); // change only y value - - for (int i=0; i < m_terminals.length(); i++) { - PartTerminal* term = m_terminals[i]; - new_pos.setX(term->pos().x()); - if (term->pos() != new_pos) { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(term, "pos", term->property("pos"), new_pos); - undo->setText(tr("Déplacer une borne")); - undo->enableAnimation(); - undoStack().push(undo); - } - } - m_locked=false; +void TerminalEditor::updatePos() +{ + if (m_locked) return; + m_locked = true; + QPointF new_pos(qle_x->value(), qle_y->value()); + if (new_pos != part->pos()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(part, "pos", part->property("pos"), new_pos); + undo->setText(tr("Déplacer une borne")); + undo->enableAnimation(); + undoStack().push(undo); + } + m_locked=false; } /// update Number and name, create cancel object @@ -221,11 +146,11 @@ void TerminalEditor::updateYPos() { Met a jour le formulaire d'edition */ void TerminalEditor::updateForm() { - if (!m_part) return; + if (!part) return; activeConnections(false); - qle_x -> setValue(m_part->property("x").toReal()); - qle_y -> setValue(m_part->property("y").toReal()); - orientation -> setCurrentIndex(orientation->findData(m_part->property("orientation"))); + qle_x -> setValue(part->property("x").toReal()); + qle_y -> setValue(part->property("y").toReal()); + orientation -> setCurrentIndex(orientation->findData(part->property("orientation"))); activeConnections(true); } @@ -237,14 +162,14 @@ void TerminalEditor::activeConnections(bool active) { if (active) { - connect(qle_x, &QDoubleSpinBox::editingFinished, this, &TerminalEditor::updateXPos); - connect(qle_y, &QDoubleSpinBox::editingFinished, this, &TerminalEditor::updateYPos); - connect(orientation, QOverload::of(&QComboBox::activated), this, &TerminalEditor::updateTerminalO); + connect(qle_x, SIGNAL(editingFinished()), this, SLOT(updatePos())); + connect(qle_y, SIGNAL(editingFinished()), this, SLOT(updatePos())); + connect(orientation, SIGNAL(activated(int)), this, SLOT(updateTerminalO())); } else { - disconnect(qle_x, &QDoubleSpinBox::editingFinished, this, &TerminalEditor::updateXPos); - disconnect(qle_y, &QDoubleSpinBox::editingFinished, this, &TerminalEditor::updateYPos); - disconnect(orientation, QOverload::of(&QComboBox::activated), this, &TerminalEditor::updateTerminalO); + disconnect(qle_x, SIGNAL(editingFinished()), this, SLOT(updatePos())); + disconnect(qle_y, SIGNAL(editingFinished()), this, SLOT(updatePos())); + disconnect(orientation, SIGNAL(activated(int)), this, SLOT(updateTerminalO())); } } diff --git a/sources/editor/terminaleditor.h b/sources/editor/terminaleditor.h index 84dd00c34..25efc5c32 100644 --- a/sources/editor/terminaleditor.h +++ b/sources/editor/terminaleditor.h @@ -26,41 +26,31 @@ class QComboBox; /** This class provides a widget to edit terminals within the element editor. - The class is capable to change the values of multiple parts of the same time. - The displayed values are from the first selected element */ class TerminalEditor : public ElementItemEditor { Q_OBJECT // Constructors, destructor public: - TerminalEditor(QETElementEditor *, QList& terms, QWidget * = nullptr); - TerminalEditor(QETElementEditor *, QWidget * = nullptr); - + TerminalEditor(QETElementEditor *, PartTerminal * = nullptr, QWidget * = nullptr); ~TerminalEditor() override; private: TerminalEditor(const TerminalEditor &); - - void init(); // attributes private: - QList m_terminals; - PartTerminal *m_part{nullptr}; + PartTerminal *part; QDoubleSpinBox *qle_x, *qle_y; QComboBox *orientation; - bool m_locked{false}; + bool m_locked; // methods public: - bool setPart(CustomElementPart *) override; - bool setParts(QList parts) override; + bool setPart(CustomElementPart *) override; CustomElementPart *currentPart() const override; - QList currentParts() const override; public slots: void updateTerminalO(); - void updateXPos(); - void updateYPos(); + void updatePos(); void updateForm() override; private: diff --git a/sources/editor/ui/dynamictextfieldeditor.cpp b/sources/editor/ui/dynamictextfieldeditor.cpp index fdbb57781..7834cd622 100644 --- a/sources/editor/ui/dynamictextfieldeditor.cpp +++ b/sources/editor/ui/dynamictextfieldeditor.cpp @@ -30,7 +30,7 @@ #include DynamicTextFieldEditor::DynamicTextFieldEditor(QETElementEditor *editor, PartDynamicTextField *text_field, QWidget *parent) : - ElementItemEditor(editor, parent), + ElementItemEditor(editor, parent), ui(new Ui::DynamicTextFieldEditor) { ui->setupUi(this); @@ -57,7 +57,10 @@ DynamicTextFieldEditor::~DynamicTextFieldEditor() */ bool DynamicTextFieldEditor::setPart(CustomElementPart *part) { - disconnectConnections(); + //Remove previous connection + if(!m_connection_list.isEmpty()) + for(const QMetaObject::Connection& con : m_connection_list) + disconnect(con); QGraphicsItem *qgi = part->toItem(); if(!qgi) @@ -68,42 +71,21 @@ bool DynamicTextFieldEditor::setPart(CustomElementPart *part) m_text_field = static_cast(qgi); updateForm(); - setUpConnections(); + //Setup the connection + m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::colorChanged, [this](){this->updateForm();}); + m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::fontChanged, [this](){this->updateForm();}); + m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::taggChanged, [this](){this->updateForm();}); + m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::textFromChanged, [this](){this->updateForm();}); + m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::textChanged, [this](){this->updateForm();}); + m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::infoNameChanged, [this](){this->updateForm();}); + m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::rotationChanged, [this](){this->updateForm();}); + m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::frameChanged, [this](){this->updateForm();}); + m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::textWidthChanged,[this]() {this->updateForm();}); + m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::compositeTextChanged, [this]() {this->updateForm();}); return true; } -bool DynamicTextFieldEditor::setParts(QList parts) { - if (parts.isEmpty()) - { - m_parts.clear(); - if (m_text_field) { - disconnectConnections(); - } - m_text_field = nullptr; - return true; - } - - if (PartDynamicTextField *part= static_cast(parts.first())) - { - if (m_text_field) { - disconnectConnections(); - } - - m_text_field = part; - m_parts.clear(); - m_parts.append(part); - for (int i=1; i < parts.length(); i++) - m_parts.append(static_cast(parts[i])); - - setUpConnections(); - - updateForm(); - return true; - } - return(false); -} - /** * @brief DynamicTextFieldEditor::currentPart * @return The current edited part, note they can return nullptr if @@ -113,14 +95,6 @@ CustomElementPart *DynamicTextFieldEditor::currentPart() const { return m_text_field.data(); } -QList DynamicTextFieldEditor::currentParts() const { - QList parts; - for (auto part: m_parts) { - parts.append(static_cast(part)); - } - return parts; -} - void DynamicTextFieldEditor::updateForm() { if(m_text_field) @@ -154,29 +128,6 @@ void DynamicTextFieldEditor::updateForm() } } -void DynamicTextFieldEditor::setUpConnections() { - assert(m_connection_list.isEmpty()); - //Setup the connection - m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::colorChanged, [this](){this->updateForm();}); - m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::fontChanged, [this](){this->updateForm();}); - m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::taggChanged, [this](){this->updateForm();}); - m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::textFromChanged, [this](){this->updateForm();}); - m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::textChanged, [this](){this->updateForm();}); - m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::infoNameChanged, [this](){this->updateForm();}); - m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::rotationChanged, [this](){this->updateForm();}); - m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::frameChanged, [this](){this->updateForm();}); - m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::textWidthChanged,[this]() {this->updateForm();}); - m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::compositeTextChanged, [this]() {this->updateForm();}); -} - -void DynamicTextFieldEditor::disconnectConnections() { - //Remove previous connection - if(!m_connection_list.isEmpty()) - for(const QMetaObject::Connection& con : m_connection_list) - disconnect(con); - m_connection_list.clear(); -} - /** * @brief DynamicTextFieldEditor::fillInfoComboBox * Fill the combo box "element information" @@ -205,84 +156,66 @@ void DynamicTextFieldEditor::fillInfoComboBox() void DynamicTextFieldEditor::on_m_x_sb_editingFinished() { - double value = ui->m_x_sb->value(); - for (int i = 0; i < m_parts.length(); i++) { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "x", m_parts[i]->x(), value); - undo->setText(tr("Déplacer un champ texte")); - undo->enableAnimation(true); - undoStack().push(undo); - } + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field, "x", m_text_field.data()->x(), ui->m_x_sb->value()); + undo->setText(tr("Déplacer un champ texte")); + undo->enableAnimation(true); + undoStack().push(undo); } void DynamicTextFieldEditor::on_m_y_sb_editingFinished() { - double value = ui->m_y_sb->value(); - for (int i = 0; i < m_parts.length(); i++) { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "y", m_parts[i]->y(), value); - undo->setText(tr("Déplacer un champ texte")); - undo->enableAnimation(true); - undoStack().push(undo); - } + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field, "y", m_text_field.data()->y(), ui->m_y_sb->value()); + undo->setText(tr("Déplacer un champ texte")); + undo->enableAnimation(true); + undoStack().push(undo); } void DynamicTextFieldEditor::on_m_rotation_sb_editingFinished() { - int value = ui->m_rotation_sb->value(); - for (int i = 0; i < m_parts.length(); i++) { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "rotation", m_parts[i]->rotation(), value); - undo->setText(tr("Pivoter un champ texte")); - undo->enableAnimation(true); - undoStack().push(undo); - } + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field, "rotation", m_text_field.data()->rotation(), ui->m_rotation_sb->value()); + undo->setText(tr("Pivoter un champ texte")); + undo->enableAnimation(true); + undoStack().push(undo); } void DynamicTextFieldEditor::on_m_user_text_le_editingFinished() { - QString text = ui->m_user_text_le->text(); - for (int i = 0; i < m_parts.length(); i++) { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "text", m_parts[i]->text(), text); - undo->setText(tr("Modifier le texte d'un champ texte")); - undoStack().push(undo); - } + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field, "text", m_text_field.data()->text(), ui->m_user_text_le->text()); + undo->setText(tr("Modifier le texte d'un champ texte")); + undoStack().push(undo); } void DynamicTextFieldEditor::on_m_size_sb_editingFinished() { QFont font_ = m_text_field->font(); font_.setPointSize(ui->m_size_sb->value()); - for (int i = 0; i < m_parts.length(); i++) { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "font", m_parts[i]->font(), font_); - undo->setText(tr("Modifier la police d'un champ texte")); - undoStack().push(undo); - } + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field, "font", m_text_field.data()->font(), font_); + undo->setText(tr("Modifier la police d'un champ texte")); + undoStack().push(undo); } void DynamicTextFieldEditor::on_m_frame_cb_clicked() { bool frame = ui->m_frame_cb->isChecked(); - for (int i = 0; i < m_parts.length(); i++) { - if(frame != m_parts[i]->frame()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "frame", m_parts[i]->frame(), frame); - undo->setText(tr("Modifier le cadre d'un champ texte")); - undoStack().push(undo); - } - } + if(frame != m_text_field.data()->frame()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field, "frame", m_text_field.data()->frame(), frame); + undo->setText(tr("Modifier le cadre d'un champ texte")); + undoStack().push(undo); + } } void DynamicTextFieldEditor::on_m_width_sb_editingFinished() { qreal width = (qreal)ui->m_width_sb->value(); - for (int i = 0; i < m_parts.length(); i++) { - if(width != m_parts[i]->textWidth()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "textWidth", m_parts[i]->textWidth(), width); - undo->setText(tr("Modifier la largeur d'un texte")); - undoStack().push(undo); - } - } + if(width != m_text_field.data()->textWidth()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field, "textWidth", m_text_field.data()->textWidth(), width); + undo->setText(tr("Modifier la largeur d'un texte")); + undoStack().push(undo); + } } void DynamicTextFieldEditor::on_m_elmt_info_cb_activated(const QString &arg1) @@ -290,16 +223,15 @@ void DynamicTextFieldEditor::on_m_elmt_info_cb_activated(const QString &arg1) Q_UNUSED(arg1) QString info = ui->m_elmt_info_cb->currentData().toString(); - for (int i = 0; i < m_parts.length(); i++) { - if(info != m_parts[i]->infoName()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "infoName", m_parts[i]->infoName(), info); - undo->setText(tr("Modifier l'information d'un texte")); - undoStack().push(undo); - - m_parts[i]->setPlainText(elementEditor()->elementScene()->elementInformation().value(m_parts[i]->infoName()).toString()); - } - } + + if(info != m_text_field.data()->infoName()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field, "infoName", m_text_field.data()->infoName(), info); + undo->setText(tr("Modifier l'information d'un texte")); + undoStack().push(undo); + + m_text_field.data()->setPlainText(elementEditor()->elementScene()->elementInformation().value(m_text_field.data()->infoName()).toString()); + } } void DynamicTextFieldEditor::on_m_text_from_cb_activated(int index) @@ -320,14 +252,12 @@ void DynamicTextFieldEditor::on_m_text_from_cb_activated(int index) else if(index == 1) tf = DynamicElementTextItem::ElementInfo; else tf = DynamicElementTextItem::CompositeText; - for (int i = 0; i < m_parts.length(); i++) { - if(tf != m_parts[i]->textFrom()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "textFrom", m_parts[i]->textFrom(), tf); - undo->setText(tr("Modifier la source de texte, d'un texte")); - undoStack().push(undo); - } - } + if(tf != m_text_field.data()->textFrom()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field, "textFrom", m_text_field.data()->textFrom(), tf); + undo->setText(tr("Modifier la source de texte, d'un texte")); + undoStack().push(undo); + } } void DynamicTextFieldEditor::on_m_composite_text_pb_clicked() @@ -336,13 +266,11 @@ void DynamicTextFieldEditor::on_m_composite_text_pb_clicked() if(ctd.exec()) { QString ct = ctd.plainText(); - for (int i = 0; i < m_parts.length(); i++) { - if(ct != m_parts[i]->compositeText()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "compositeText", m_parts[i]->compositeText(), ctd.plainText()); - undoStack().push(undo); - } - } + if(ct != m_text_field.data()->compositeText()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field.data(), "compositeText", m_text_field.data()->compositeText(), ctd.plainText()); + undoStack().push(undo); + } } } @@ -351,14 +279,12 @@ void DynamicTextFieldEditor::on_m_alignment_pb_clicked() AlignmentTextDialog atd(m_text_field.data()->alignment(), this); atd.exec(); - for (int i = 0; i < m_parts.length(); i++) { - if(atd.alignment() != m_parts[i]->alignment()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "alignment", QVariant(m_parts[i]->alignment()), QVariant(atd.alignment())); - undo->setText(tr("Modifier l'alignement d'un champ texte")); - undoStack().push(undo); - } - } + if(atd.alignment() != m_text_field.data()->alignment()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field.data(), "alignment", QVariant(m_text_field.data()->alignment()), QVariant(atd.alignment())); + undo->setText(tr("Modifier l'alignement d'un champ texte")); + undoStack().push(undo); + } } void DynamicTextFieldEditor::on_m_font_pb_clicked() @@ -370,25 +296,18 @@ void DynamicTextFieldEditor::on_m_font_pb_clicked() ui->m_font_pb->setText(font_.family()); ui->m_size_sb->setValue(font_.pointSize()); - for (int i = 0; i < m_parts.length(); i++) { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "font", m_parts[i]->font(), font_); - undo->setText(tr("Modifier la police d'un champ texte")); - undoStack().push(undo); - } + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field.data(), "font", m_text_field->font(), font_); + undo->setText(tr("Modifier la police d'un champ texte")); + undoStack().push(undo); } } void DynamicTextFieldEditor::on_m_color_kpb_changed(const QColor &newColor) { - if (!newColor.isValid()) - return; - - for (int i = 0; i < m_parts.length(); i++) { - if(newColor != m_parts[i]->color()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_parts[i], "color", m_parts[i]->color(), newColor); - undo->setText(tr("Modifier la couleur d'un champ texte")); - undoStack().push(undo); - } - } + if(newColor.isValid() && newColor != m_text_field.data()->color()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text_field, "color", m_text_field.data()->color(), newColor); + undo->setText(tr("Modifier la couleur d'un champ texte")); + undoStack().push(undo); + } } diff --git a/sources/editor/ui/dynamictextfieldeditor.h b/sources/editor/ui/dynamictextfieldeditor.h index 444607471..a1a074db4 100644 --- a/sources/editor/ui/dynamictextfieldeditor.h +++ b/sources/editor/ui/dynamictextfieldeditor.h @@ -38,15 +38,11 @@ class DynamicTextFieldEditor : public ElementItemEditor ~DynamicTextFieldEditor() override; bool setPart(CustomElementPart *part) override; - bool setParts(QList ) override; CustomElementPart *currentPart() const override; - QList currentParts() const override; void updateForm() override; private: void fillInfoComboBox(); - void setUpConnections(); - void disconnectConnections(); private slots: void on_m_x_sb_editingFinished(); @@ -67,7 +63,6 @@ class DynamicTextFieldEditor : public ElementItemEditor private: Ui::DynamicTextFieldEditor *ui; QPointer m_text_field; - QList m_parts; QList m_connection_list; }; diff --git a/sources/editor/ui/polygoneditor.cpp b/sources/editor/ui/polygoneditor.cpp index 3a7c9337f..164e5d995 100644 --- a/sources/editor/ui/polygoneditor.cpp +++ b/sources/editor/ui/polygoneditor.cpp @@ -98,10 +98,6 @@ CustomElementPart *PolygonEditor::currentPart() const { return m_part; } -QList PolygonEditor::currentParts() const { - return m_style->currentParts(); -} - /** * @brief PolygonEditor::updateForm * Update the widget diff --git a/sources/editor/ui/polygoneditor.h b/sources/editor/ui/polygoneditor.h index 5cfe54d68..f153ca629 100644 --- a/sources/editor/ui/polygoneditor.h +++ b/sources/editor/ui/polygoneditor.h @@ -38,7 +38,6 @@ class PolygonEditor : public ElementItemEditor bool setPart(CustomElementPart *part) override; CustomElementPart *currentPart() const override; - QList currentParts() const override; void updateForm() override; QVector pointsFromTree(); bool eventFilter(QObject *watched, QEvent *event) override; diff --git a/sources/editor/ui/rectangleeditor.cpp b/sources/editor/ui/rectangleeditor.cpp index c794931ac..60b913cc6 100644 --- a/sources/editor/ui/rectangleeditor.cpp +++ b/sources/editor/ui/rectangleeditor.cpp @@ -103,10 +103,6 @@ CustomElementPart *RectangleEditor::currentPart() const { return m_part; } -QList RectangleEditor::currentParts() const { - return m_style->currentParts(); -} - /** * @brief RectangleEditor::topLeft * @return The edited topLeft already mapped to part coordinate diff --git a/sources/editor/ui/rectangleeditor.h b/sources/editor/ui/rectangleeditor.h index 05c7eb272..c872b6515 100644 --- a/sources/editor/ui/rectangleeditor.h +++ b/sources/editor/ui/rectangleeditor.h @@ -42,7 +42,6 @@ class RectangleEditor : public ElementItemEditor bool setPart(CustomElementPart *part) override; CustomElementPart *currentPart() const override; - QList currentParts() const override; QPointF editedTopLeft () const; public slots: diff --git a/sources/editor/ui/texteditor.cpp b/sources/editor/ui/texteditor.cpp index 7ede11b6a..05b9f074e 100644 --- a/sources/editor/ui/texteditor.cpp +++ b/sources/editor/ui/texteditor.cpp @@ -28,7 +28,7 @@ * @param parent : the parent widget */ TextEditor::TextEditor(QETElementEditor *editor, PartText *text, QWidget *parent) : - ElementItemEditor(editor, parent), + ElementItemEditor(editor, parent), ui(new Ui::TextEditor) { ui->setupUi(this); @@ -57,7 +57,10 @@ void TextEditor::updateForm() return; } - disconnectEditConnection(); + for (QMetaObject::Connection c : m_edit_connection) { + disconnect(c); + } + m_edit_connection.clear(); ui->m_line_edit->setText(m_text->toPlainText()); ui->m_x_sb->setValue(m_text->pos().x()); @@ -70,30 +73,6 @@ void TextEditor::updateForm() setUpEditConnection(); } -void TextEditor::setUpChangeConnection(QPointer part) { - assert(m_change_connection.isEmpty()); - m_change_connection << connect(part, &PartText::plainTextChanged, this, &TextEditor::updateForm); - m_change_connection << connect(part, &PartText::xChanged, this, &TextEditor::updateForm); - m_change_connection << connect(part, &PartText::yChanged, this, &TextEditor::updateForm); - m_change_connection << connect(part, &PartText::rotationChanged, this, &TextEditor::updateForm); - m_change_connection << connect(part, &PartText::fontChanged, this, &TextEditor::updateForm); - m_change_connection << connect(part, &PartText::colorChanged, this, &TextEditor::updateForm); -} - -void TextEditor::disconnectChangeConnection() { - for (QMetaObject::Connection c : m_change_connection) { - disconnect(c); - } - m_change_connection.clear(); -} - -void TextEditor::disconnectEditConnection() { - for (QMetaObject::Connection c : m_edit_connection) { - disconnect(c); - } - m_edit_connection.clear(); -} - /** * @brief TextEditor::setPart * Set the current text to edit. @@ -106,18 +85,27 @@ bool TextEditor::setPart(CustomElementPart *part) if (!part) { m_text = nullptr; - disconnectChangeConnection(); + for (QMetaObject::Connection c : m_change_connection) { + disconnect(c); + } + m_change_connection.clear(); return true; } - if (PartText *part_text = static_cast(part)) + if (PartText *part_text = dynamic_cast(part)) { if (part_text == m_text) { return true; } m_text = part_text; - setUpChangeConnection(m_text); + m_change_connection.clear(); + m_change_connection << connect(part_text, &PartText::plainTextChanged, this, &TextEditor::updateForm); + m_change_connection << connect(part_text, &PartText::xChanged, this, &TextEditor::updateForm); + m_change_connection << connect(part_text, &PartText::yChanged, this, &TextEditor::updateForm); + m_change_connection << connect(part_text, &PartText::rotationChanged, this, &TextEditor::updateForm); + m_change_connection << connect(part_text, &PartText::fontChanged, this, &TextEditor::updateForm); + m_change_connection << connect(part_text, &PartText::colorChanged, this, &TextEditor::updateForm); updateForm(); return true; @@ -125,37 +113,6 @@ bool TextEditor::setPart(CustomElementPart *part) return false; } -bool TextEditor::setParts(QList parts) { - if (parts.isEmpty()) - { - m_parts.clear(); - if (m_text) { - disconnectChangeConnection(); - } - m_text = nullptr; - return true; - } - - if (PartText *part= static_cast(parts.first())) - { - if (m_text) { - disconnectChangeConnection(); - } - - m_text = part; - m_parts.clear(); - m_parts.append(part); - for (int i=1; i < parts.length(); i++) - m_parts.append(static_cast(parts[i])); - - setUpChangeConnection(m_text); - - updateForm(); - return true; - } - return(false); -} - /** * @brief TextEditor::currentPart * @return The current part @@ -164,14 +121,6 @@ CustomElementPart *TextEditor::currentPart() const { return m_text; } -QList TextEditor::currentParts() const { - QList parts; - for (auto part: m_parts) { - parts.append(static_cast(part)); - } - return parts; -} - /** * @brief TextEditor::setUpEditConnection * Setup the connection between the widgets of this editor and the undo command @@ -179,77 +128,63 @@ QList TextEditor::currentParts() const { */ void TextEditor::setUpEditConnection() { - disconnectEditConnection(); + for (QMetaObject::Connection c : m_edit_connection) { + disconnect(c); + } + m_edit_connection.clear(); m_edit_connection << connect(ui->m_line_edit, &QLineEdit::textEdited, [this]() { QString text_ = ui->m_line_edit->text(); - for (int i=0; i < m_parts.length(); i++) { - PartText* partText = m_parts[i]; - if (text_ != partText->toPlainText()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "text", partText->toPlainText(), text_); - undo->setText(tr("Modifier le contenu d'un champ texte")); - undoStack().push(undo); - } - } + if (text_ != m_text->toPlainText()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "text", m_text->toPlainText(), text_); + undo->setText(tr("Modifier le contenu d'un champ texte")); + undoStack().push(undo); + } }); m_edit_connection << connect(ui->m_x_sb, QOverload::of(&QSpinBox::valueChanged), [this]() { - QPointF pos(ui->m_x_sb->value(), 0); - for (int i=0; i < m_parts.length(); i++) { - PartText* partText = m_parts[i]; - pos.setY(partText->pos().y()); - if (pos != partText->pos()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "pos", partText->pos(), pos); - undo->setText(tr("Déplacer un champ texte")); - undo->setAnimated(true, false); - undoStack().push(undo); - } - } + QPointF pos(ui->m_x_sb->value(), ui->m_y_sb->value()); + if (pos != m_text->pos()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "pos", m_text->pos(), pos); + undo->setText(tr("Déplacer un champ texte")); + undo->setAnimated(true, false); + undoStack().push(undo); + } }); m_edit_connection << connect(ui->m_y_sb, QOverload::of(&QSpinBox::valueChanged), [this]() { - QPointF pos(0, ui->m_y_sb->value()); - for (int i=0; i < m_parts.length(); i++) { - PartText* partText = m_parts[i]; - pos.setX(partText->pos().x()); - if (pos != partText->pos()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "pos", partText->pos(), pos); - undo->setText(tr("Déplacer un champ texte")); - undo->setAnimated(true, false); - undoStack().push(undo); - } - } + QPointF pos(ui->m_x_sb->value(), ui->m_y_sb->value()); + if (pos != m_text->pos()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "pos", m_text->pos(), pos); + undo->setText(tr("Déplacer un champ texte")); + undo->setAnimated(true, false); + undoStack().push(undo); + } }); m_edit_connection << connect(ui->m_rotation_sb, QOverload::of(&QSpinBox::valueChanged), [this]() { - for (int i=0; i < m_parts.length(); i++) { - PartText* partText = m_parts[i]; - if (ui->m_rotation_sb->value() != partText->rotation()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "rotation", partText->rotation(), ui->m_rotation_sb->value()); - undo->setText(tr("Pivoter un champ texte")); - undo->setAnimated(true, false); - undoStack().push(undo); - } - } + if (ui->m_rotation_sb->value() != m_text->rotation()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "rotation", m_text->rotation(), ui->m_rotation_sb->value()); + undo->setText(tr("Pivoter un champ texte")); + undo->setAnimated(true, false); + undoStack().push(undo); + } }); m_edit_connection << connect(ui->m_size_sb, QOverload::of(&QSpinBox::valueChanged), [this]() { - for (int i=0; i < m_parts.length(); i++) { - PartText* partText = m_parts[i]; - if (partText->font().pointSize() != ui->m_size_sb->value()) - { - QFont font_ = partText->font(); - font_.setPointSize(ui->m_size_sb->value()); - QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "font", partText->font(), font_); - undo->setText(tr("Modifier la police d'un texte")); - undoStack().push(undo); - } - } + if (m_text->font().pointSize() != ui->m_size_sb->value()) + { + QFont font_ = m_text->font(); + font_.setPointSize(ui->m_size_sb->value()); + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "font", m_text->font(), font_); + undo->setText(tr("Modifier la police d'un texte")); + undoStack().push(undo); + } }); } @@ -261,23 +196,17 @@ void TextEditor::on_m_font_pb_clicked() bool ok; QFont font_ = QFontDialog::getFont(&ok, m_text->font(), this); - if (ok && font_ != m_text->font()) { - ui->m_size_sb->blockSignals(true); - ui->m_size_sb->setValue(font_.pointSize()); - ui->m_size_sb->blockSignals(false); + if (ok && font_ != m_text->font()) + { + ui->m_size_sb->blockSignals(true); + ui->m_size_sb->setValue(font_.pointSize()); + ui->m_size_sb->blockSignals(false); - ui->m_font_pb->setText(font_.family()); - } - - for (int i=0; i < m_parts.length(); i++) { - PartText* partText = m_parts[i]; - if (ok && font_ != partText->font()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "font", partText->font(), font_); - undo->setText(tr("Modifier la police d'un texte")); - undoStack().push(undo); - } - } + ui->m_font_pb->setText(font_.family()); + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "font", m_text->font(), font_); + undo->setText(tr("Modifier la police d'un texte")); + undoStack().push(undo); + } } /** @@ -286,13 +215,10 @@ void TextEditor::on_m_font_pb_clicked() */ void TextEditor::on_m_color_pb_changed(const QColor &newColor) { - for (int i=0; i < m_parts.length(); i++) { - PartText* partText = m_parts[i]; - if (newColor != partText->defaultTextColor()) - { - QPropertyUndoCommand *undo = new QPropertyUndoCommand(partText, "color", partText->defaultTextColor(), newColor); - undo->setText(tr("Modifier la couleur d'un texte")); - undoStack().push(undo); - } - } + if (newColor != m_text->defaultTextColor()) + { + QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_text, "color", m_text->defaultTextColor(), newColor); + undo->setText(tr("Modifier la couleur d'un texte")); + undoStack().push(undo); + } } diff --git a/sources/editor/ui/texteditor.h b/sources/editor/ui/texteditor.h index 7772b0c25..bff7cff1a 100644 --- a/sources/editor/ui/texteditor.h +++ b/sources/editor/ui/texteditor.h @@ -39,26 +39,20 @@ class TextEditor : public ElementItemEditor void updateForm() override; bool setPart(CustomElementPart *part) override; - bool setParts(QList ) override; CustomElementPart *currentPart() const override; - QList currentParts() const override; private slots: void on_m_font_pb_clicked(); void on_m_color_pb_changed(const QColor &newColor); private: void setUpEditConnection(); - void setUpChangeConnection(QPointer part); - void disconnectChangeConnection(); - void disconnectEditConnection(); private: Ui::TextEditor *ui; QPointer m_text; - QList m_parts; QList m_edit_connection; - QList m_change_connection; + QList m_change_connection; }; #endif // TEXTEDITOR_H diff --git a/sources/properties/propertiesinterface.h b/sources/properties/propertiesinterface.h index d37828e0c..9f4777f47 100644 --- a/sources/properties/propertiesinterface.h +++ b/sources/properties/propertiesinterface.h @@ -34,8 +34,8 @@ class PropertiesInterface virtual void toSettings (QSettings &settings, const QString = QString()) const =0; virtual void fromSettings (const QSettings &settings, const QString = QString()) =0; // Save/load properties to xml element - virtual QDomElement toXml (QDomDocument &xml_document) const =0; - virtual bool fromXml (const QDomElement &xml_element) =0; + virtual void toXml (QDomElement &xml_element) const =0; + virtual void fromXml (const QDomElement &xml_element) =0; }; #endif // PROPERTIESINTERFACE_H diff --git a/sources/properties/terminaldata.cpp b/sources/properties/terminaldata.cpp deleted file mode 100644 index f90f3e64d..000000000 --- a/sources/properties/terminaldata.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "terminaldata.h" - -#include - -TerminalData::TerminalData(): - PropertiesInterface() -{ - init(); -} - -TerminalData::TerminalData(QGraphicsObject *parent): - PropertiesInterface(), - q(parent) -{ - init(); -} - -void TerminalData::init() { -} - -TerminalData::~TerminalData() -{ - -} - -void TerminalData::setParent(QGraphicsObject* parent) -{ - q = parent; -} - -void TerminalData::toSettings(QSettings &settings, const QString) const -{ - -} - -void TerminalData::fromSettings(const QSettings &settings, const QString) -{ - -} - -QDomElement TerminalData::toXml(QDomDocument &xml_document) const -{ - QDomElement xml_element = xml_document.createElement("terminal"); - - // ecrit la position de la borne - xml_element.setAttribute("x", QString("%1").arg(q->scenePos().x())); - xml_element.setAttribute("y", QString("%1").arg(q->scenePos().y())); - - - xml_element.setAttribute("uuid", m_uuid.toString()); - xml_element.setAttribute("name", m_name); - - // ecrit l'orientation de la borne - xml_element.setAttribute("orientation", Qet::orientationToString(m_orientation)); - // Write name and number to XML - - return(xml_element); -} -bool TerminalData::fromXml (const QDomElement &xml_element) -{ - // lit la position de la borne - qreal term_x = 0.0, term_y = 0.0; - if (!QET::attributeIsAReal(xml_element, "x", &term_x)) - return false; - - if (!QET::attributeIsAReal(xml_element, "y", &term_y)) - return false; - - m_pos = QPointF(term_x, term_y); - - //emit posFromXML(QPointF(term_x, term_y)); - - QString uuid = xml_element.attribute("uuid"); - // update part and add uuid, which is used in the new version to connect terminals together - // if the attribute not exists, means, the element is created with an older version of qet. So use the legacy approach - // to identify terminals - if (!uuid.isEmpty()) - m_uuid = QUuid(uuid); - - m_name = xml_element.attribute("name"); - - // lit l'orientation de la borne - m_orientation = Qet::orientationFromString(xml_element.attribute("orientation")); - - return true; -} diff --git a/sources/properties/terminaldata.h b/sources/properties/terminaldata.h deleted file mode 100644 index 620769cd8..000000000 --- a/sources/properties/terminaldata.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef TERMINALDATA_H -#define TERMINALDATA_H - -#include "propertiesinterface.h" -#include "qet.h" - -#include -#include - -class QGraphicsObject; - -/*! - * \brief The TerminalData class - * Data of the terminal. Stored in extra class so it can be used by PartTerminal and Terminal without - * defining everything again. - */ -class TerminalData : public PropertiesInterface -{ -public: - TerminalData(); - TerminalData(QGraphicsObject* parent); - ~TerminalData(); - - void init(); - - 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; - // 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; - - // must be public, because this class is a private member of PartTerminal/Terminal and they must - // access this data -public: - /*! - * \brief m_orientation - * Orientation of the terminal - */ - Qet::Orientation m_orientation; - /*! - * \brief second_point - * Position of the second point of the terminal in scene coordinates - */ - QPointF second_point; - /*! - * \brief m_uuid - * Uuid of the terminal. - * - * In elementscene.cpp an element gets a new uuid when saving the element. In the current state - * each connection is made by using the local position of the terminal and a dynamic id. In the new - * case, each terminal should have it's own uuid to identify it uniquely. When changing each time this - * uuid, the conductor after updating the part is anymore valid. So if in the loaded document a uuid exists, - * use this one and don't create a new one. - */ - QUuid m_uuid; - /*! - * \brief m_name - * Name of the element. It can be used to create wiring harness tables - */ - QString m_name; - - /*! - * \brief m_pos - * Position of the terminal. The second point is calculated from this position and the orientation - * Important: this variable is only updated during read from xml and not during mouse move! - * It is used to store the initial position so that PartTerminal and Terminal have access to it. - */ - QPointF m_pos; -private: - QGraphicsObject* q{nullptr}; -}; - -#endif // TERMINALDATA_H diff --git a/sources/properties/xrefproperties.cpp b/sources/properties/xrefproperties.cpp index b5a5395e6..70de62d06 100644 --- a/sources/properties/xrefproperties.cpp +++ b/sources/properties/xrefproperties.cpp @@ -93,12 +93,8 @@ void XRefProperties::fromSettings(const QSettings &settings, const QString prefi * Save to xml * @param xml_element: QDomElement to use for saving */ -QDomElement XRefProperties::toXml(QDomDocument &xml_document) const { - - QDomElement xml_element = xml_document.createElement("xref"); - xml_element.setAttribute("type", m_key); - - xml_element.setAttribute("showpowerctc", m_show_power_ctc? "true" : "false"); +void XRefProperties::toXml(QDomElement &xml_element) const { + xml_element.setAttribute("showpowerctc", m_show_power_ctc? "true" : "false"); QString display = m_display == Cross? "cross" : "contacts"; xml_element.setAttribute("displayhas", display); QString snap = m_snap_to == Bottom? "bottom" : "label"; @@ -118,8 +114,6 @@ QDomElement XRefProperties::toXml(QDomDocument &xml_document) const { foreach (QString key, m_prefix.keys()) { xml_element.setAttribute(key + "prefix", m_prefix.value(key)); } - - return xml_element; } /** @@ -127,7 +121,7 @@ QDomElement XRefProperties::toXml(QDomDocument &xml_document) const { * Load from xml * @param xml_element: QDomElement to use for load */ -bool XRefProperties::fromXml(const QDomElement &xml_element) { +void XRefProperties::fromXml(const QDomElement &xml_element) { m_show_power_ctc = xml_element.attribute("showpowerctc") == "true"; QString display = xml_element.attribute("displayhas", "cross"); display == "cross"? m_display = Cross : m_display = Contacts; @@ -149,7 +143,6 @@ bool XRefProperties::fromXml(const QDomElement &xml_element) { foreach (QString key, m_prefix_keys) { m_prefix.insert(key, xml_element.attribute(key + "prefix")); } - return true; } /** diff --git a/sources/properties/xrefproperties.h b/sources/properties/xrefproperties.h index 9a45f2978..b16de6fc7 100644 --- a/sources/properties/xrefproperties.h +++ b/sources/properties/xrefproperties.h @@ -42,8 +42,8 @@ class XRefProperties : public PropertiesInterface void toSettings (QSettings &settings, const QString = QString()) const override; void fromSettings (const QSettings &settings, const QString = QString()) override; - QDomElement toXml (QDomDocument &xml_document) const override; - bool fromXml(const QDomElement &xml_element) override; + void toXml (QDomElement &xml_element) const override; + void fromXml (const QDomElement &xml_element) override; static QHash defaultProperties(); @@ -73,8 +73,6 @@ class XRefProperties : public PropertiesInterface void setOffset(const int offset) {m_offset = offset;} int offset() const {return m_offset;} - void setKey(QString& key) {m_key = key;} - private: bool m_show_power_ctc; DisplayHas m_display; @@ -85,7 +83,6 @@ class XRefProperties : public PropertiesInterface QString m_master_label; QString m_slave_label; int m_offset; - QString m_key; }; #endif // XREFPROPERTIES_H diff --git a/sources/qetgraphicsitem/conductor.cpp b/sources/qetgraphicsitem/conductor.cpp index 8609e8a68..0c2ad3031 100644 --- a/sources/qetgraphicsitem/conductor.cpp +++ b/sources/qetgraphicsitem/conductor.cpp @@ -579,27 +579,13 @@ bool Conductor::valideXml(QDomElement &e){ 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'abscisse + 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); - } + e.attribute("terminal2").toInt(&conv_ok); + if (!conv_ok) return(false); return(true); } @@ -1008,23 +994,8 @@ QDomElement Conductor::toXml(QDomDocument &dom_document, QHash 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()); - } - - 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("terminal1", table_adr_id.value(terminal1)); + dom_element.setAttribute("terminal2", table_adr_id.value(terminal2)); dom_element.setAttribute("freezeLabel", m_freeze_label? "true" : "false"); // on n'exporte les segments du conducteur que si ceux-ci ont @@ -1060,8 +1031,7 @@ QDomElement Conductor::toXml(QDomDocument &dom_document, QHash /** * @brief Conductor::pathFromXml - * Generate the path (of the line) from xml file by checking the segments in the xml - * file + * Generate the path from xml file * @param e * @return true if generate path success else return false */ diff --git a/sources/qetgraphicsitem/element.cpp b/sources/qetgraphicsitem/element.cpp index 00051e56e..2eec4f07f 100644 --- a/sources/qetgraphicsitem/element.cpp +++ b/sources/qetgraphicsitem/element.cpp @@ -23,7 +23,6 @@ #include "elementprovider.h" #include "diagramposition.h" #include "terminal.h" -#include "terminaldata.h" #include "PropertiesEditor/propertieseditordialog.h" #include "elementpropertieswidget.h" #include "numerotationcontextcommands.h" @@ -561,22 +560,36 @@ DynamicElementTextItem *Element::parseDynamicText(const QDomElement &dom_element return deti; } -/*! - * \brief Element::parseTerminal - * Parse partTerminal from xml structure - * \param dom_element - * \return - */ Terminal *Element::parseTerminal(const QDomElement &dom_element) { - - TerminalData* data = new TerminalData(); - if (!data->fromXml(dom_element)) { - delete data; - return nullptr; - } + qreal terminalx, terminaly; + Qet::Orientation terminalo; + if (!QET::attributeIsAReal(dom_element, QString("x"), &terminalx)) { + return(nullptr); + } + if (!QET::attributeIsAReal(dom_element, QString("y"), &terminaly)) { + return(nullptr); + } + if (!dom_element.hasAttribute("orientation")) { + return(nullptr); + } + if (dom_element.attribute("orientation") == "n") { + terminalo = Qet::North; + } + else if (dom_element.attribute("orientation") == "s") { + terminalo = Qet::South; + } + else if (dom_element.attribute("orientation") == "e") { + terminalo = Qet::East; + } + else if (dom_element.attribute("orientation") == "w") { + terminalo = Qet::West; + } + else { + return(nullptr); + } - Terminal *new_terminal = new Terminal(data, this); + Terminal *new_terminal = new Terminal(terminalx, terminaly, terminalo, this); m_terminals << new_terminal; //Sort from top to bottom and left to rigth @@ -1047,7 +1060,7 @@ QDomElement Element::toXml(QDomDocument &document, QHash &table foreach(Terminal *t, terminals()) { // alors on enregistre la borne QDomElement terminal = t -> toXml(document); - terminal.setAttribute("id", id_terminal); // for backward compatibility + terminal.setAttribute("id", id_terminal); table_adr_id.insert(t, id_terminal ++); xml_terminals.appendChild(terminal); } diff --git a/sources/qetgraphicsitem/terminal.cpp b/sources/qetgraphicsitem/terminal.cpp index 1f7d0fe0d..090c7f03b 100644 --- a/sources/qetgraphicsitem/terminal.cpp +++ b/sources/qetgraphicsitem/terminal.cpp @@ -24,7 +24,6 @@ #include "diagramcommands.h" #include "conductorautonumerotation.h" #include "conductortextitem.h" -#include "terminaldata.h" QColor Terminal::neutralColor = QColor(Qt::blue); QColor Terminal::allowedColor = QColor(Qt::darkGreen); @@ -40,13 +39,17 @@ const qreal Terminal::Z = 1000; @param number of terminal @param name of terminal */ -void Terminal::init(QString number, QString name, bool hiddenName) { - - hovered_color_ = Terminal::neutralColor; +void Terminal::init(QPointF pf, Qet::Orientation o, QString number, QString name, bool hiddenName) { + // definition du pount d'amarrage pour un conducteur + dock_conductor_ = pf; + + // definition de l'orientation de la borne (par defaut : sud) + if (o < Qet::North || o > Qet::West) ori_ = Qet::South; + else ori_ = o; // calcul de la position du point d'amarrage a l'element - dock_elmt_ = d->m_pos; - switch(d->m_orientation) { + dock_elmt_ = dock_conductor_; + switch(ori_) { case Qet::North: dock_elmt_ += QPointF(0, Terminal::terminalSize); break; case Qet::East : dock_elmt_ += QPointF(-Terminal::terminalSize, 0); break; case Qet::West : dock_elmt_ += QPointF(Terminal::terminalSize, 0); break; @@ -71,27 +74,6 @@ void Terminal::init(QString number, QString name, bool hiddenName) { setZValue(Z); } -/*! - * \brief Terminal::init - * Additionaly to the init above, this method stores position and orientation into the data class - * \param pf - * \param o - * \param number - * \param name - * \param hiddenName - */ -void Terminal::init(QPointF pf, Qet::Orientation o, QString number, QString name, bool hiddenName) -{ - // definition du pount d'amarrage pour un conducteur - d->m_pos = pf; - - // definition de l'orientation de la borne (par defaut : sud) - if (o < Qet::North || o > Qet::West) d->m_orientation = Qet::South; - else d->m_orientation = o; - - init(number, name, hiddenName); -} - /** initialise une borne @param pf position du point d'amarrage pour un conducteur @@ -101,8 +83,11 @@ void Terminal::init(QPointF pf, Qet::Orientation o, QString number, QString name */ Terminal::Terminal(QPointF pf, Qet::Orientation o, Element *e) : QGraphicsObject(e), - d(new TerminalData(this)), - parent_element_ (e) + m_draw_help_line(false), + m_help_line (nullptr), + m_help_line_a (nullptr), + parent_element_ (e), + hovered_color_ (Terminal::neutralColor) { init(pf, o, "_", "_", false); } @@ -117,10 +102,13 @@ Terminal::Terminal(QPointF pf, Qet::Orientation o, Element *e) : */ Terminal::Terminal(qreal pf_x, qreal pf_y, Qet::Orientation o, Element *e) : QGraphicsObject(e), - d(new TerminalData(this)), - parent_element_ (e) + m_draw_help_line (false), + m_help_line (nullptr), + m_help_line_a (nullptr), + parent_element_ (e), + hovered_color_ (Terminal::neutralColor) { - init(QPointF(pf_x, pf_y), o, "_", "_", false); + init(QPointF(pf_x, pf_y), o, "_", "_", false); } /** @@ -135,22 +123,15 @@ Terminal::Terminal(qreal pf_x, qreal pf_y, Qet::Orientation o, Element *e) : */ Terminal::Terminal(QPointF pf, Qet::Orientation o, QString num, QString name, bool hiddenName, Element *e) : QGraphicsObject (e), - d(new TerminalData(this)), - parent_element_ (e) + m_draw_help_line (false), + m_help_line (nullptr), + m_help_line_a (nullptr), + parent_element_ (e), + hovered_color_ (Terminal::neutralColor) { init(pf, o, std::move(num), std::move(name), hiddenName); } -Terminal::Terminal(TerminalData* data, Element* e) : - QGraphicsObject(e), - d(data), - parent_element_(e) -{ - // TODO: what is when multiple parents exist. So the other relation is lost. - d->setParent(this); - init("_", "_", false); -} - /** Destructeur La destruction de la borne entraine la destruction des conducteurs @@ -172,15 +153,15 @@ Qet::Orientation Terminal::orientation() const { if (Element *elt = qgraphicsitem_cast(parentItem())) { // orientations actuelle et par defaut de l'element int ori_cur = elt -> orientation(); - if (ori_cur == 0) return(d->m_orientation); + if (ori_cur == 0) return(ori_); else { // calcul l'angle de rotation implique par l'orientation de l'element parent // angle de rotation de la borne sur la scene, divise par 90 - int angle = ori_cur + d->m_orientation; + int angle = ori_cur + ori_; while (angle >= 4) angle -= 4; return((Qet::Orientation)angle); } - } else return(d->m_orientation); + } else return(ori_); } @@ -257,7 +238,7 @@ void Terminal::paint(QPainter *p, const QStyleOptionGraphicsItem *options, QWidg p -> setRenderHint(QPainter::SmoothPixmapTransform, false); // on travaille avec les coordonnees de l'element parent - QPointF c = mapFromParent(d->m_pos); + QPointF c = mapFromParent(dock_conductor_); QPointF e = mapFromParent(dock_elmt_); QPen t; @@ -409,11 +390,11 @@ QLineF Terminal::HelpLine() const */ QRectF Terminal::boundingRect() const { if (br_ -> isNull()) { - qreal dcx = d->m_pos.x(); - qreal dcy = d->m_pos.y(); + qreal dcx = dock_conductor_.x(); + qreal dcy = dock_conductor_.y(); qreal dex = dock_elmt_.x(); qreal dey = dock_elmt_.y(); - QPointF origin = (dcx <= dex && dcy <= dey ? d->m_pos : dock_elmt_); + QPointF origin = (dcx <= dex && dcy <= dey ? dock_conductor_ : dock_elmt_); origin += QPointF(-3.0, -3.0); qreal w = qAbs((int)(dcx - dex)) + 7; qreal h = qAbs((int)(dcy - dey)) + 7; @@ -511,10 +492,10 @@ void Terminal::hoverLeaveEvent(QGraphicsSceneHoverEvent *) { @param e L'evenement souris correspondant */ void Terminal::mousePressEvent(QGraphicsSceneMouseEvent *e) { - if (Diagram *diag = diagram()) { - diag -> setConductorStart(mapToScene(QPointF(d->m_pos))); - diag -> setConductorStop(e -> scenePos()); - diag -> setConductor(true); + if (Diagram *d = diagram()) { + d -> setConductorStart(mapToScene(QPointF(dock_conductor_))); + d -> setConductorStop(e -> scenePos()); + d -> setConductor(true); //setCursor(Qt::CrossCursor); } } @@ -536,13 +517,13 @@ void Terminal::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { } - Diagram *diag = diagram(); - if (!diag) return; + Diagram *d = diagram(); + if (!d) return; // si la scene est un Diagram, on actualise le poseur de conducteur - diag -> setConductorStop(e -> scenePos()); + d -> setConductorStop(e -> scenePos()); // on recupere la liste des qgi sous le pointeur - QList qgis = diag -> items(e -> scenePos()); + QList qgis = d -> items(e -> scenePos()); /* le qgi le plus haut = le poseur de conductor @@ -678,10 +659,6 @@ bool Terminal::isLinkedTo(Terminal *other_terminal) { /** * @brief Terminal::canBeLinkedTo - * Checking if the terminal can be linked to \p other_terminal or not - * Reasons for not linable: - * - \p other_terminal is this terminal - * - this terminal is already connected to \p other_terminal * @param other_terminal * @return true if this terminal can be linked to @other_terminal, * otherwise false @@ -708,9 +685,9 @@ QList Terminal::conductors() const { */ QDomElement Terminal::toXml(QDomDocument &doc) const { QDomElement qdo = doc.createElement("terminal"); - qdo.setAttribute("x", QString("%1").arg(dock_elmt_.x())); // for backward compatibility - qdo.setAttribute("y", QString("%1").arg(dock_elmt_.y()));// for backward compatibility - qdo.setAttribute("orientation", d->m_orientation); + qdo.setAttribute("x", QString("%1").arg(dock_elmt_.x())); + qdo.setAttribute("y", QString("%1").arg(dock_elmt_.y())); + qdo.setAttribute("orientation", ori_); qdo.setAttribute("number", number_terminal_); qdo.setAttribute("name", name_terminal_); qdo.setAttribute("nameHidden", name_terminal_hidden); @@ -762,22 +739,13 @@ bool Terminal::fromXml(QDomElement &terminal) { number_terminal_ = terminal.attribute("number"); name_terminal_ = terminal.attribute("name"); name_terminal_hidden = terminal.attribute("nameHidden").toInt(); - return ( qFuzzyCompare(terminal.attribute("x").toDouble(), dock_elmt_.x()) && qFuzzyCompare(terminal.attribute("y").toDouble(), dock_elmt_.y()) && - (terminal.attribute("orientation").toInt() == d->m_orientation) + (terminal.attribute("orientation").toInt() == ori_) ); } -/** - @return the position, relative to the scene, of the docking point for - conductors. -*/ -inline QPointF Terminal::dockConductor() const { - return(mapToScene(d->m_pos)); -} - /** @return le Diagram auquel cette borne appartient, ou 0 si cette borne est independant */ @@ -792,10 +760,6 @@ Element *Terminal::parentElement() const { return(parent_element_); } -QUuid Terminal::uuid() const { - return d->m_uuid; -} - /** * @brief Conductor::relatedPotentialTerminal * Return terminal at the same potential from the same diff --git a/sources/qetgraphicsitem/terminal.h b/sources/qetgraphicsitem/terminal.h index 83a855a19..7b9a488cc 100644 --- a/sources/qetgraphicsitem/terminal.h +++ b/sources/qetgraphicsitem/terminal.h @@ -23,12 +23,9 @@ class Conductor; class Diagram; class Element; -class TerminalData; - /** This class represents a terminal of an electrical element, i.e. a possible plug point for conductors. - This class handles all mouse events for connecting conductors */ class Terminal : public QGraphicsObject { @@ -42,7 +39,6 @@ class Terminal : public QGraphicsObject public: Terminal(QPointF, Qet::Orientation, Element * = nullptr); Terminal(qreal, qreal, Qet::Orientation, Element * = nullptr); - Terminal(TerminalData* data, Element *e = nullptr); Terminal(QPointF, Qet::Orientation, QString number, QString name, bool hiddenName, Element * = nullptr); ~Terminal() override; @@ -67,7 +63,6 @@ class Terminal : public QGraphicsObject int conductorsCount () const; Diagram *diagram () const; Element *parentElement () const; - QUuid uuid () const; QList conductors() const; Qet::Orientation orientation() const; @@ -111,23 +106,24 @@ class Terminal : public QGraphicsObject static QColor forbiddenColor; private: - bool m_draw_help_line{false}; - QGraphicsLineItem *m_help_line{nullptr}; - QGraphicsLineItem *m_help_line_a{nullptr}; - - - TerminalData* d; + bool m_draw_help_line; + QGraphicsLineItem *m_help_line; + QGraphicsLineItem *m_help_line_a; /// Parent electrical element - Element *parent_element_{nullptr}; + Element *parent_element_; + /// docking point for conductors + QPointF dock_conductor_; /// docking point for parent element QPointF dock_elmt_; + /// terminal orientation + Qet::Orientation ori_; /// List of conductors attached to the terminal QList conductors_; /// Pointer to a rectangle representing the terminal bounding rect; /// used to calculate the bounding rect once only; /// used a pointer because boundingRect() is supposed to be const. - QRectF *br_{nullptr}; + QRectF *br_; /// Last terminal seen through an attached conductor Terminal *previous_terminal_; /// Whether the mouse pointer is hovering the terminal @@ -141,8 +137,7 @@ class Terminal : public QGraphicsObject bool name_terminal_hidden; private: - void init(QString number, QString name, bool hiddenName); - void init(QPointF pf, Qet::Orientation o, QString number, QString name, bool hiddenName); + void init(QPointF, Qet::Orientation, QString number, QString name, bool hiddenName); }; /** @@ -152,6 +147,14 @@ inline int Terminal::conductorsCount() const { return(conductors_.size()); } +/** + @return the position, relative to the scene, of the docking point for + conductors. +*/ +inline QPointF Terminal::dockConductor() const { + return(mapToScene(dock_conductor_)); +} + /** @return the number of terminal. */ diff --git a/sources/qetproject.cpp b/sources/qetproject.cpp index f6627d6c3..16be9c94d 100644 --- a/sources/qetproject.cpp +++ b/sources/qetproject.cpp @@ -1582,10 +1582,11 @@ void QETProject::writeDefaultPropertiesXml(QDomElement &xml_element) { // export default XRef properties QDomElement xrefs_elmt = xml_document.createElement("xrefs"); - foreach (QString key, defaultXRefProperties().keys()) { - defaultXRefProperties()[key].setKey(key); - QDomElement xref_elmt = defaultXRefProperties()[key].toXml(xml_document); - xrefs_elmt.appendChild(xref_elmt); + foreach (QString key, defaultXRefProperties().keys()) { + QDomElement xref_elmt = xml_document.createElement("xref"); + xref_elmt.setAttribute("type", key); + defaultXRefProperties()[key].toXml(xref_elmt); + xrefs_elmt.appendChild(xref_elmt); } xml_element.appendChild(xrefs_elmt);