diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 245a876a1..42230295f 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -861,131 +861,78 @@ void Diagram::initElementsLinks() { /** * @brief Diagram::addItem - * Add element to diagram - * @param element - */ -void Diagram::addItem(Element *element) { - if (!element || isReadOnly()) return; - - if (element -> scene() != this) - QGraphicsScene::addItem(element); - foreach(ElementTextItem *eti, element -> texts()) { - connect( - eti, - SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)), - this, - SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)) - ); - } -} - -/** - * @brief Diagram::addItem - * Add conductor to scene. - * @param conductor - */ -void Diagram::addItem(Conductor *conductor) { - if (!conductor || isReadOnly()) return; - - if (conductor -> scene() != this) { - QGraphicsScene::addItem(conductor); - conductor -> terminal1 -> addConductor(conductor); - conductor -> terminal2 -> addConductor(conductor); - conductor -> calculateTextItemPosition(); - } -} - -/** - * @brief Diagram::addItem - * Add text item to diagram - * @param iti - */ -void Diagram::addItem(IndependentTextItem *iti) { - if (!iti || isReadOnly()) return; - - if (iti -> scene() != this) - QGraphicsScene::addItem(iti); - - connect( - iti, - SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)), - this, - SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)) - ); -} - -/** - * @brief Diagram::addItem - * Generique method to add item to scene + * Réimplemented from QGraphicsScene::addItem(QGraphicsItem *item) + * Do some specific operation if item need it (for exemple an element) * @param item */ -void Diagram::addItem(QGraphicsItem *item) { +void Diagram::addItem(QGraphicsItem *item) +{ + if (!item || isReadOnly() || item->scene() == this) return; + QGraphicsScene::addItem(item); + + switch (item->type()) + { + case Element::Type: + { + const Element *elmt = static_cast(item); + foreach(ElementTextItem *eti, elmt->texts()) + connect (eti, &ElementTextItem::diagramTextChanged, this, &Diagram::diagramTextChanged); + } + break; + + case Conductor::Type: + { + Conductor *conductor = static_cast(item); + conductor->terminal1->addConductor(conductor); + conductor->terminal2->addConductor(conductor); + conductor->calculateTextItemPosition(); + } + break; + + case IndependentTextItem::Type: + { + const IndependentTextItem *text = static_cast(item); + connect(text, &IndependentTextItem::diagramTextChanged, this, &Diagram::diagramTextChanged); + } + } +} + +/** + * @brief Diagram::removeItem + * Réimplemented from QGraphicsScene::removeItem(QGraphicsItem *item) + * Do some specific operation if item need it (for exemple an element) + * @param item + */ +void Diagram::removeItem(QGraphicsItem *item) +{ if (!item || isReadOnly()) return; - if (item -> scene() != this) - QGraphicsScene::addItem(item); -} -/** - * @brief Diagram::removeItem - * Remove an element from the scene - * @param element - */ -void Diagram::removeItem(Element *element) { - if (!element || isReadOnly()) return; + switch (item->type()) + { + case Element::Type: + { + Element *elmt = static_cast(item); + elmt->unlinkAllElements(); + foreach(ElementTextItem *text, elmt->texts()) + disconnect(text, &ElementTextItem::diagramTextChanged, this, &Diagram::diagramTextChanged); + } + break; - // remove all links of element - element->unlinkAllElements(); + case Conductor::Type: + { + Conductor *conductor = static_cast(item); + conductor->terminal1->removeConductor(conductor); + conductor->terminal2->removeConductor(conductor); + } + break; - QGraphicsScene::removeItem(element); - - foreach(ElementTextItem *eti, element -> texts()) { - disconnect( - eti, - SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)), - this, - SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)) - ); + case IndependentTextItem::Type: + { + const IndependentTextItem *text = static_cast(item); + disconnect(text, &IndependentTextItem::diagramTextChanged, this, &Diagram::diagramTextChanged); + } } -} -/** - * @brief Diagram::removeItem - * Remove a conductor from diagram - * @param conductor - */ -void Diagram::removeItem(Conductor *conductor) { - if (!conductor || isReadOnly()) return; - - conductor -> terminal1 -> removeConductor(conductor); - conductor -> terminal2 -> removeConductor(conductor); - - QGraphicsScene::removeItem(conductor); -} - -/** - * @brief Diagram::removeItem - * Remove text field from diagram - * @param iti - */ -void Diagram::removeItem(IndependentTextItem *iti) { - if (!iti || isReadOnly()) return; - - QGraphicsScene::removeItem(iti); - - disconnect( - iti, - SIGNAL(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)), - this, - SLOT(diagramTextChanged(DiagramTextItem *, const QString &, const QString &)) - ); -} - -/** - * @brief Diagram::removeItem - * Generique methode to remove QGraphicsItem from diagram - * @param item - */ -void Diagram::removeItem(QGraphicsItem *item) { QGraphicsScene::removeItem(item); } diff --git a/sources/diagram.h b/sources/diagram.h index d6b3c7701..f7001524e 100644 --- a/sources/diagram.h +++ b/sources/diagram.h @@ -152,17 +152,10 @@ class Diagram : public QGraphicsScene bool wasWritten() const; QDomElement writeXml(QDomDocument &) const; - // methods related to graphics items addition/removal on the diagram + // methods related to graphics items addition/removal on the diagram void initElementsLinks(); - virtual void addItem (Element *element); - virtual void addItem (Conductor *conductor); - virtual void addItem (IndependentTextItem *iti); - virtual void addItem (QGraphicsItem *item); - - virtual void removeItem (Element *element); - virtual void removeItem (Conductor *conductor); - virtual void removeItem (IndependentTextItem *iti); - virtual void removeItem (QGraphicsItem *item); + virtual void addItem (QGraphicsItem *item); + virtual void removeItem (QGraphicsItem *item); // methods related to graphics options ExportProperties applyProperties(const ExportProperties &); diff --git a/sources/diagramcommands.cpp b/sources/diagramcommands.cpp index ae932ce23..7b195ce4b 100644 --- a/sources/diagramcommands.cpp +++ b/sources/diagramcommands.cpp @@ -74,140 +74,101 @@ DeleteElementsCommand::~DeleteElementsCommand() { diagram -> qgiManager().release(removed_content.items(DiagramContent::All)); } -/// annule les suppressions -void DeleteElementsCommand::undo() { +/** + * @brief DeleteElementsCommand::undo + * Undo this command + */ +void DeleteElementsCommand::undo() +{ diagram -> showMe(); - foreach(Element *e, removed_content.elements) { - diagram -> addItem(e); - } + foreach(QGraphicsItem *item, removed_content.items()) + diagram->addItem(item); - //We relink element after every element was added to diagram - foreach(Element *e, removed_content.elements) { - foreach (Element *elmt, m_link_hash[e]) { + //We relink element after every element was added to diagram + foreach(Element *e, removed_content.elements) + foreach (Element *elmt, m_link_hash[e]) e -> linkToElement(elmt); - } - } - - foreach(Conductor *c, removed_content.conductors(DiagramContent::AnyConductor)) { - diagram -> addItem(c); - } - - foreach(IndependentTextItem *t, removed_content.textFields) { - diagram -> addItem(t); - } - - foreach(DiagramImageItem *dii, removed_content.images) { - diagram -> addItem(dii); - } - - foreach(QetShapeItem *dsi, removed_content.shapes) { - diagram -> addItem(dsi); - } } /** * @brief DeleteElementsCommand::redo * Redo the delete command */ -void DeleteElementsCommand::redo() { +void DeleteElementsCommand::redo() +{ diagram -> showMe(); - // Remove Conductor - foreach(Conductor *c, removed_content.conductors(DiagramContent::AnyConductor)) { - diagram -> removeItem(c); - - //If option one text per folio is enable, and the text item of - //current conductor is visible (that mean the conductor have the single displayed text) - //We call adjustTextItemPosition to other conductor at the same potential to keep - //a visible text on this potential. - if (diagram -> defaultConductorProperties.m_one_text_per_folio && c -> textItem() -> isVisible()) { + foreach(Conductor *c, removed_content.conductors(DiagramContent::AnyConductor)) + { + //If option one text per folio is enable, and the text item of + //current conductor is visible (that mean the conductor have the single displayed text) + //We call adjustTextItemPosition to other conductor at the same potential to keep + //a visible text on this potential. + if (diagram -> defaultConductorProperties.m_one_text_per_folio && c -> textItem() -> isVisible()) + { QList conductor_list; conductor_list << c -> relatedPotentialConductors(false).toList(); - if (conductor_list.count()) { + if (conductor_list.count()) conductor_list.first() -> calculateTextItemPosition(); - } } } - // Remove elements - foreach(Element *e, removed_content.elements) { - //Get linked element, for relink it at undo + foreach(Element *e, removed_content.elements) + { + //Get linked element, for relink it at undo if (!e->linkedElements().isEmpty()) m_link_hash.insert(e, e->linkedElements()); - diagram -> removeItem(e); - } - - // Remove texts - foreach(IndependentTextItem *t, removed_content.textFields) { - diagram -> removeItem(t); } - // Remove images - foreach(DiagramImageItem *dii, removed_content.images) { - diagram -> removeItem(dii); - } - - // Remove shapes - foreach(QetShapeItem *dsi, removed_content.shapes) { - diagram -> removeItem(dsi); - } + foreach(QGraphicsItem *item, removed_content.items()) + diagram->removeItem(item); } /** - Constructeur - @param dia Schema sur lequel on colle les elements et conducteurs - @param c Contenu a coller sur le schema - @param parent QUndoCommand parent -*/ -PasteDiagramCommand::PasteDiagramCommand( - Diagram *dia, - const DiagramContent &c, - QUndoCommand *parent -) : + * @brief PasteDiagramCommand::PasteDiagramCommand + * Constructor + * @param dia : diagram where we must to paste + * @param c : content to past + * @param parent : parent undo command + */ +PasteDiagramCommand::PasteDiagramCommand( Diagram *dia, const DiagramContent &c, QUndoCommand *parent) : QUndoCommand(parent), content(c), diagram(dia), filter(DiagramContent::Elements|DiagramContent::TextFields|DiagramContent::Images|DiagramContent::ConductorsToMove | DiagramContent::Shapes), first_redo(true) { - - setText( - QString( - QObject::tr( - "coller %1", - "undo caption - %1 is a sentence listing the content to paste" - ).arg(content.sentence(filter)) - ) - ); + setText(QObject::tr("coller %1", "undo caption - %1 is a sentence listing the content to paste").arg(content.sentence(filter))); diagram -> qgiManager().manage(content.items(filter)); } -/// Destructeur +/** + * @brief PasteDiagramCommand::~PasteDiagramCommand + * Destructor + */ PasteDiagramCommand::~PasteDiagramCommand() { diagram -> qgiManager().release(content.items(filter)); } -/// annule le coller -void PasteDiagramCommand::undo() { +/** + * @brief PasteDiagramCommand::undo + * Undo this command + */ +void PasteDiagramCommand::undo() +{ diagram -> showMe(); - // remove the conductors - foreach(Conductor *c, content.conductorsToMove) diagram -> removeItem(c); - - // remove the elements - foreach(Element *e, content.elements) diagram -> removeItem(e); - - // remove the texts - foreach(IndependentTextItem *t, content.textFields) diagram -> removeItem(t); - // remove the images and shapes - foreach(QGraphicsItem *qgi, content.items(DiagramContent::Images | DiagramContent::Shapes)) diagram -> removeItem(qgi); + foreach(QGraphicsItem *item, content.items(filter)) + diagram->removeItem(item); } /** * @brief PasteDiagramCommand::redo + * Redo this commnand */ -void PasteDiagramCommand::redo() { +void PasteDiagramCommand::redo() +{ diagram -> showMe(); if (first_redo) { @@ -240,18 +201,10 @@ void PasteDiagramCommand::redo() { c -> setProperties(cp); } } - else { - // paste the elements - foreach(Element *e, content.elements) diagram -> addItem(e); - - // paste the conductors - foreach(Conductor *c, content.conductorsToMove) diagram -> addItem(c); - - // paste the texts - foreach(IndependentTextItem *t, content.textFields) diagram -> addItem(t); - - // paste the images and shapes - foreach(QGraphicsItem *qgi, content.items(DiagramContent::Images | DiagramContent::Shapes)) diagram -> addItem(qgi); + else + { + foreach (QGraphicsItem *item, content.items(filter)) + diagram->addItem(item); } foreach (QGraphicsItem *qgi, content.items()) qgi -> setSelected(true); }