diff --git a/sources/TerminalStrip/UndoCommand/addterminalstripcommand.cpp b/sources/TerminalStrip/UndoCommand/addterminalstripcommand.cpp index 46fe13bdd..338aadb6d 100644 --- a/sources/TerminalStrip/UndoCommand/addterminalstripcommand.cpp +++ b/sources/TerminalStrip/UndoCommand/addterminalstripcommand.cpp @@ -19,6 +19,7 @@ #include "../../qetproject.h" #include "../terminalstrip.h" #include "../qetgraphicsitem/element.h" +#include "../realterminal.h" #include @@ -57,9 +58,13 @@ RemoveTerminalStripCommand::RemoveTerminalStripCommand(TerminalStrip *strip, QUndoCommand *parent) : QUndoCommand(parent), m_strip(strip), - m_project(project), - m_elements(strip->terminalElement()) + m_project(project) { + for (const auto &real_t : strip->realTerminals()) + { + if (real_t->element()) + m_elements.append(real_t->element()); + } setText(QObject::tr("Supprimer un groupe de bornes")); } diff --git a/sources/TerminalStrip/realterminal.cpp b/sources/TerminalStrip/realterminal.cpp index 75ccbb1f7..945fefc51 100644 --- a/sources/TerminalStrip/realterminal.cpp +++ b/sources/TerminalStrip/realterminal.cpp @@ -105,6 +105,15 @@ TerminalStrip *RealTerminal::parentStrip() const { } } +/** + * @brief RealTerminal::physicalTerminal + * @return The parent physical terminal of this terminal. + * The returned QSharedPointer can be null + */ +QSharedPointer RealTerminal::physicalTerminal() const { + return m_physical_terminal; +} + /** * @brief RealTerminal::level * @return diff --git a/sources/TerminalStrip/realterminal.h b/sources/TerminalStrip/realterminal.h index e3f7e996d..84517368a 100644 --- a/sources/TerminalStrip/realterminal.h +++ b/sources/TerminalStrip/realterminal.h @@ -56,6 +56,7 @@ class RealTerminal public: ~RealTerminal(); TerminalStrip *parentStrip() const; + QSharedPointer physicalTerminal() const; QDomElement toXml(QDomDocument &parent_document) const; diff --git a/sources/TerminalStrip/terminalstrip.cpp b/sources/TerminalStrip/terminalstrip.cpp index 059603642..ff0a7a232 100644 --- a/sources/TerminalStrip/terminalstrip.cpp +++ b/sources/TerminalStrip/terminalstrip.cpp @@ -104,21 +104,22 @@ void TerminalStrip::setData(const TerminalStripData &data) { */ bool TerminalStrip::addTerminal(Element *terminal) { - if (m_terminal_elements_vector.contains(terminal)) { - return false; + for (const auto &real_t : m_real_terminals) { + if (real_t->element() == terminal) { + return false; + } } + if (terminal->elementData().m_type != ElementData::Terminale) { return false; } - m_terminal_elements_vector.append(terminal); - auto casted_ = static_cast(terminal); - m_real_terminals.append(casted_->realTerminal()); //Create a new single level physical terminal auto raw_phy_ptr = new PhysicalTerminal(this, QVector>{casted_->realTerminal()}); m_physical_terminals.append(raw_phy_ptr->sharedRef()); + rebuildRealVector(); return true; } @@ -131,32 +132,23 @@ bool TerminalStrip::addTerminal(Element *terminal) */ bool TerminalStrip::removeTerminal(Element *terminal) { - if (m_terminal_elements_vector.contains(terminal)) + for (const auto &real_t : m_real_terminals) { - m_terminal_elements_vector.removeOne(terminal); - //Get the real and physical terminal associated to @terminal - if (auto real_terminal = realTerminal(terminal)) + if (real_t->element() == terminal) { - if (auto physical_terminal = physicalTerminal(real_terminal)) + if (auto physical_t = real_t->physicalTerminal()) { - if (physical_terminal->levelCount() == 1) { - m_physical_terminals.removeOne(physical_terminal); - } else { - auto v = physical_terminal->realTerminals(); - v.removeOne(real_terminal); - physical_terminal->setTerminals(v); + physical_t->removeTerminal(real_t); + if (physical_t->realTerminalCount() == 0) { + m_physical_terminals.removeOne(physical_t); } } - m_real_terminals.removeOne(real_terminal); - rebuildRealVector(); return true; } - - //There is no reason to be here, but in case of.... - return false; } + return false; } @@ -258,6 +250,11 @@ QSharedPointer TerminalStrip::realTerminalForUuid(const QUuid &uui return QSharedPointer(); } +QVector> TerminalStrip::realTerminals() const +{ + return m_real_terminals; +} + /** * @brief TerminalStrip::setSortedTo @@ -753,14 +750,6 @@ QSharedPointer TerminalStrip::nextRealTerminal(const QSharedPointe return QSharedPointer(); } -/** - * @brief TerminalStrip::terminalElement - * @return A vector of all terminal element owned by this strip - */ -QVector > TerminalStrip::terminalElement() const { - return m_terminal_elements_vector; -} - /** * @brief TerminalStrip::toXml * @param parent_document @@ -824,7 +813,6 @@ bool TerminalStrip::fromXml(QDomElement &xml_element) { if (terminal_elmt->uuid() == uuid_) { - m_terminal_elements_vector.append(terminal_elmt); real_t_vector.append(terminal_elmt->realTerminal()); //Remove the actual terminal element from the vector, they dicrease the size //of the vector and so each iteration have less terminal element to check diff --git a/sources/TerminalStrip/terminalstrip.h b/sources/TerminalStrip/terminalstrip.h index 928cf01da..ebcb6bac1 100644 --- a/sources/TerminalStrip/terminalstrip.h +++ b/sources/TerminalStrip/terminalstrip.h @@ -87,6 +87,7 @@ class TerminalStrip : public QObject QVector> physicalTerminal() const; QSharedPointer realTerminal(Element *terminal) const; QSharedPointer realTerminalForUuid(const QUuid &uuid) const; + QVector> realTerminals() const; bool setOrderTo(const QVector> &sorted_vector); bool groupTerminals(const QSharedPointer &receiver_terminal, const QVector> &added_terminals); @@ -107,8 +108,6 @@ class TerminalStrip : public QObject QSharedPointer previousRealTerminal(const QSharedPointer &real_terminal) const; QSharedPointer nextRealTerminal(const QSharedPointer &real_terminal) const; - QVector> terminalElement() const; - static QString xmlTagName() {return QStringLiteral("terminal_strip");} QDomElement toXml(QDomDocument &parent_document); bool fromXml(QDomElement &xml_element); @@ -119,7 +118,6 @@ class TerminalStrip : public QObject private: TerminalStripData m_data; QPointer m_project; - QVector> m_terminal_elements_vector; QVector> m_real_terminals; QVector> m_physical_terminals; QVector> m_bridge;