Revert Martin pull request for now, and return to last 7e9fd8df9 commit

This commit is contained in:
Laurent Trinques
2020-06-11 13:19:30 +02:00
parent bf2e02273e
commit 3e1740cee0
33 changed files with 473 additions and 1026 deletions

View File

@@ -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<int, Terminal *>& table_adr_id, QList<Element *>& 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

View File

@@ -128,10 +128,6 @@ CustomElementPart *ArcEditor::currentPart() const {
return(part);
}
QList<CustomElementPart*> ArcEditor::currentParts() const {
return style_->currentParts();
}
/**
* @brief ArcEditor::updateArcS
* Update the start angle of the arc according to the edited value.

View File

@@ -51,7 +51,6 @@ class ArcEditor : public ElementItemEditor
public:
bool setPart(CustomElementPart *) override;
CustomElementPart *currentPart() const override;
QList<CustomElementPart*> currentParts() const override;
public slots:
void updateArcS();

View File

@@ -54,7 +54,6 @@ class ElementItemEditor : public QWidget
virtual bool setParts(QList <CustomElementPart *>) {return false;}
virtual CustomElementPart *currentPart() const = 0;
virtual QList<CustomElementPart*> currentParts() const = 0;
virtual void updateForm() = 0;
// attributes

View File

@@ -109,10 +109,6 @@ CustomElementPart *EllipseEditor::currentPart() const {
return(part);
}
QList<CustomElementPart*> EllipseEditor::currentParts() const {
return style_->currentParts();
}
void EllipseEditor::editingFinished()
{
if (m_locked) return;

View File

@@ -49,7 +49,6 @@ class EllipseEditor : public ElementItemEditor
public:
bool setPart(CustomElementPart *) override;
CustomElementPart *currentPart() const override;
QList<CustomElementPart*> currentParts() const override;
public slots:
void editingFinished();

View File

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

View File

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

View File

@@ -146,10 +146,6 @@ CustomElementPart *LineEditor::currentPart() const {
return(part);
}
QList<CustomElementPart*> LineEditor::currentParts() const {
return style_->currentParts();
}
/**
* @brief LineEditor::editedP1
* @return The edited P1 in item coordinate

View File

@@ -51,7 +51,6 @@ class LineEditor : public ElementItemEditor
public:
bool setPart(CustomElementPart *) override;
CustomElementPart *currentPart() const override;
QList<CustomElementPart*> currentParts() const override;
QPointF editedP1() const;
QPointF editedP2() const;

View File

@@ -610,86 +610,73 @@ void QETElementEditor::slot_setNoDragToView() {
void QETElementEditor::slot_updateInformations()
{
QList<QGraphicsItem *> 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<CustomElementPart *> cep_list;
bool style_editable = false;
CustomElementPart* part = dynamic_cast<CustomElementPart *>(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<CustomElementPart *>(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<CustomElementPart *>(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<ElementItemEditor*>(m_editors[selection_xml_name]);
// TODO: Check if it takes longer than setting the parts again to the editor.
bool equal = true;
QList<CustomElementPart*> 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<CustomElementPart *>(qgi))
{
if (QWidget *widget = m_tools_dock_stack->widget(1))
{
if (ElementItemEditor *editor = dynamic_cast<ElementItemEditor *>(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<CustomElementPart *>(qgi))
{
//The current editor already edit the selected part
if (QWidget *widget = m_tools_dock_stack->widget(1))
if (ElementItemEditor *editor = dynamic_cast<ElementItemEditor *>(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"];

View File

@@ -489,7 +489,6 @@ bool StyleEditor::setPart(CustomElementPart *new_part) {
if (CustomElementGraphicPart *part_graphic = dynamic_cast<CustomElementGraphicPart *>(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<CustomElementPart*> StyleEditor::currentParts() const {
return m_cep_list;
}
/**
* @brief StyleEditor::isStyleEditable
* @param cep_list
@@ -553,7 +548,7 @@ bool StyleEditor::isStyleEditable(QList<CustomElementPart *> 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;

View File

@@ -53,9 +53,8 @@ class StyleEditor : public ElementItemEditor
// methods
public:
bool setPart(CustomElementPart *) override;
bool setParts(QList<CustomElementPart *>);
bool setParts(QList<CustomElementPart *>) override;
CustomElementPart *currentPart() const override;
QList<CustomElementPart*> currentParts() const override;
static bool isStyleEditable (QList <CustomElementPart *> cep_list);

View File

@@ -25,65 +25,51 @@
#include <QHBoxLayout>
#include <QLabel>
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<PartTerminal *> &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<PartTerminal *>(new_part))
if (PartTerminal *part_terminal = dynamic_cast<PartTerminal *>(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<CustomElementPart *> 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<PartTerminal *>(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<PartTerminal*>(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<CustomElementPart*> TerminalEditor::currentParts() const {
QList<CustomElementPart*> parts;
for (auto term: m_terminals) {
parts.append(static_cast<CustomElementPart*>(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<int>::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<int>::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()));
}
}

View File

@@ -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<PartTerminal *>& terms, QWidget * = nullptr);
TerminalEditor(QETElementEditor *, QWidget * = nullptr);
TerminalEditor(QETElementEditor *, PartTerminal * = nullptr, QWidget * = nullptr);
~TerminalEditor() override;
private:
TerminalEditor(const TerminalEditor &);
void init();
// attributes
private:
QList<PartTerminal *> 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<CustomElementPart *> parts) override;
bool setPart(CustomElementPart *) override;
CustomElementPart *currentPart() const override;
QList<CustomElementPart*> currentParts() const override;
public slots:
void updateTerminalO();
void updateXPos();
void updateYPos();
void updatePos();
void updateForm() override;
private:

View File

@@ -30,7 +30,7 @@
#include <QColorDialog>
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<PartDynamicTextField *>(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 <CustomElementPart *> parts) {
if (parts.isEmpty())
{
m_parts.clear();
if (m_text_field) {
disconnectConnections();
}
m_text_field = nullptr;
return true;
}
if (PartDynamicTextField *part= static_cast<PartDynamicTextField *>(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<PartDynamicTextField*>(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<CustomElementPart*> DynamicTextFieldEditor::currentParts() const {
QList<CustomElementPart*> parts;
for (auto part: m_parts) {
parts.append(static_cast<CustomElementPart*>(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);
}
}

View File

@@ -38,15 +38,11 @@ class DynamicTextFieldEditor : public ElementItemEditor
~DynamicTextFieldEditor() override;
bool setPart(CustomElementPart *part) override;
bool setParts(QList <CustomElementPart *>) override;
CustomElementPart *currentPart() const override;
QList<CustomElementPart*> 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<PartDynamicTextField> m_text_field;
QList<PartDynamicTextField*> m_parts;
QList<QMetaObject::Connection> m_connection_list;
};

View File

@@ -98,10 +98,6 @@ CustomElementPart *PolygonEditor::currentPart() const {
return m_part;
}
QList<CustomElementPart*> PolygonEditor::currentParts() const {
return m_style->currentParts();
}
/**
* @brief PolygonEditor::updateForm
* Update the widget

View File

@@ -38,7 +38,6 @@ class PolygonEditor : public ElementItemEditor
bool setPart(CustomElementPart *part) override;
CustomElementPart *currentPart() const override;
QList<CustomElementPart*> currentParts() const override;
void updateForm() override;
QVector<QPointF> pointsFromTree();
bool eventFilter(QObject *watched, QEvent *event) override;

View File

@@ -103,10 +103,6 @@ CustomElementPart *RectangleEditor::currentPart() const {
return m_part;
}
QList<CustomElementPart*> RectangleEditor::currentParts() const {
return m_style->currentParts();
}
/**
* @brief RectangleEditor::topLeft
* @return The edited topLeft already mapped to part coordinate

View File

@@ -42,7 +42,6 @@ class RectangleEditor : public ElementItemEditor
bool setPart(CustomElementPart *part) override;
CustomElementPart *currentPart() const override;
QList<CustomElementPart*> currentParts() const override;
QPointF editedTopLeft () const;
public slots:

View File

@@ -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<PartText> 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<PartText *>(part))
if (PartText *part_text = dynamic_cast<PartText *>(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 <CustomElementPart *> parts) {
if (parts.isEmpty())
{
m_parts.clear();
if (m_text) {
disconnectChangeConnection();
}
m_text = nullptr;
return true;
}
if (PartText *part= static_cast<PartText *>(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<PartText*>(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<CustomElementPart*> TextEditor::currentParts() const {
QList<CustomElementPart*> parts;
for (auto part: m_parts) {
parts.append(static_cast<CustomElementPart*>(part));
}
return parts;
}
/**
* @brief TextEditor::setUpEditConnection
* Setup the connection between the widgets of this editor and the undo command
@@ -179,77 +128,63 @@ QList<CustomElementPart*> 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<int>::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<int>::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<int>::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<int>::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);
}
}

View File

@@ -39,26 +39,20 @@ class TextEditor : public ElementItemEditor
void updateForm() override;
bool setPart(CustomElementPart *part) override;
bool setParts(QList <CustomElementPart *>) override;
CustomElementPart *currentPart() const override;
QList<CustomElementPart*> 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<PartText> part);
void disconnectChangeConnection();
void disconnectEditConnection();
private:
Ui::TextEditor *ui;
QPointer <PartText> m_text;
QList<PartText*> m_parts;
QList <QMetaObject::Connection> m_edit_connection;
QList <QMetaObject::Connection> m_change_connection;
QList <QMetaObject::Connection> m_change_connection;
};
#endif // TEXTEDITOR_H

View File

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

View File

@@ -1,86 +0,0 @@
#include "terminaldata.h"
#include <QGraphicsObject>
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;
}

View File

@@ -1,77 +0,0 @@
#ifndef TERMINALDATA_H
#define TERMINALDATA_H
#include "propertiesinterface.h"
#include "qet.h"
#include <QUuid>
#include <QPointF>
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

View File

@@ -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;
}
/**

View File

@@ -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<QString, XRefProperties> 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

View File

@@ -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<Terminal *, int>
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<Terminal *, int>
/**
* @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
*/

View File

@@ -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<Terminal *, int> &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);
}

View File

@@ -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<Element *>(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<QGraphicsItem *> qgis = diag -> items(e -> scenePos());
QList<QGraphicsItem *> 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<Conductor *> 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

View File

@@ -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<Conductor *> 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<Conductor *> 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.
*/

View File

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