diff --git a/sources/TerminalStrip/physicalterminal.cpp b/sources/TerminalStrip/physicalterminal.cpp index f633d45f1..934d3ae88 100644 --- a/sources/TerminalStrip/physicalterminal.cpp +++ b/sources/TerminalStrip/physicalterminal.cpp @@ -30,7 +30,13 @@ PhysicalTerminal::PhysicalTerminal(TerminalStrip *parent_strip, QVector> terminals) : m_parent_terminal_strip(parent_strip), m_real_terminal(terminals) -{} +{ + for (const auto &real_t : m_real_terminal) { + if (real_t) { + real_t->setPhysicalTerminal(sharedRef()); + } + } +} /** * @brief PhysicalTerminal::sharedRef @@ -80,6 +86,11 @@ QDomElement PhysicalTerminal::toXml(QDomDocument &parent_document) const */ void PhysicalTerminal::setTerminals(const QVector> &terminals) { m_real_terminal = terminals; + for (const auto &real_t : m_real_terminal) { + if (real_t) { + real_t->setPhysicalTerminal(sharedRef()); + } + } } /** @@ -90,6 +101,7 @@ void PhysicalTerminal::setTerminals(const QVector> */ void PhysicalTerminal::addTerminal(const QSharedPointer &terminal) { m_real_terminal.append(terminal); + terminal->setPhysicalTerminal(sharedRef()); } /** @@ -98,8 +110,13 @@ void PhysicalTerminal::addTerminal(const QSharedPointer &terminal) * @param terminal * @return true if sucessfully removed */ -bool PhysicalTerminal::removeTerminal(const QSharedPointer &terminal) { - return m_real_terminal.removeOne(terminal); +bool PhysicalTerminal::removeTerminal(const QSharedPointer &terminal) +{ + if (m_real_terminal.removeOne(terminal)) { + terminal->setPhysicalTerminal(QSharedPointer()); + return true; + } + return false; } /** @@ -124,6 +141,23 @@ bool PhysicalTerminal::setLevelOf(const QSharedPointer &terminal, return false; } +PhysicalTerminal::~PhysicalTerminal() +{ + for (const auto &real_t : m_real_terminal) { + if (real_t) { + real_t->setPhysicalTerminal(QSharedPointer()); + } + } +} + +/** + * @brief PhysicalTerminal::terminalStrip + * @return The parent terminal strip ornullptr + */ +TerminalStrip *PhysicalTerminal::terminalStrip() const { + return m_parent_terminal_strip.data(); +} + /** * @brief levelCount * @return the number of level of this terminal diff --git a/sources/TerminalStrip/physicalterminal.h b/sources/TerminalStrip/physicalterminal.h index 44379f328..501d3c1d4 100644 --- a/sources/TerminalStrip/physicalterminal.h +++ b/sources/TerminalStrip/physicalterminal.h @@ -61,6 +61,7 @@ class TerminalStrip; class PhysicalTerminal { friend class TerminalStrip; + friend class RealTerminal; private: PhysicalTerminal(TerminalStrip *parent_strip, QVector> terminals); @@ -77,7 +78,9 @@ class PhysicalTerminal public: PhysicalTerminal(){} + ~PhysicalTerminal(); + TerminalStrip* terminalStrip() const; int levelCount() const; int levelOf(const QSharedPointer &terminal) const; QVector> realTerminals() const; diff --git a/sources/TerminalStrip/realterminal.cpp b/sources/TerminalStrip/realterminal.cpp index b23a42361..5a69c8137 100644 --- a/sources/TerminalStrip/realterminal.cpp +++ b/sources/TerminalStrip/realterminal.cpp @@ -25,11 +25,23 @@ * @param parent_strip : parent terminal strip * @param terminal : terminal element (if any) in a folio */ -RealTerminal::RealTerminal(TerminalStrip *parent_strip, - Element *terminal) : - m_element(terminal), - m_parent_terminal_strip(parent_strip) -{} +RealTerminal::RealTerminal(Element *terminal) : + m_element(terminal) +{ + if (terminal) { + static_cast(terminal)->setRealTerminal(sharedRef()); + } +} + +RealTerminal::~RealTerminal() +{ + if (m_physical_terminal) { + m_physical_terminal->removeTerminal(sharedRef()); + } + if (m_element) { + static_cast(m_element.data())->setRealTerminal(QSharedPointer()); + } +} /** * @brief RealTerminal::sharedRef @@ -47,6 +59,16 @@ QSharedPointer RealTerminal::sharedRef() return this_shared; } +/** + * @brief RealTerminal::sharedRef + * @return a shared reference of this, not that because + * this method is const, the shared reference can be null if not already + * used in another part of the code. + */ +QSharedPointer RealTerminal::sharedRef() const { + return QSharedPointer(m_this_weak); +} + /** * @brief RealTerminal::weakRef * @return a QWeakPointer of this, weak pointer can be bull @@ -76,6 +98,7 @@ bool RealTerminal::fromXml(QDomElement xml_element, const QVectoruuid() == uuid_) { m_element = terminal; + static_cast(terminal)->setRealTerminal(sharedRef()); break; } } @@ -100,11 +123,24 @@ QDomElement RealTerminal::toXml(QDomDocument &parent_document) const } /** - * @brief parentStrip - * @return parent terminal strip - */ + * @brief RealTerminal::setPhysicalTerminal + * Set the parent physical terminal of this real terminal + * @param phy_t + */ +void RealTerminal::setPhysicalTerminal(const QSharedPointer &phy_t) { + m_physical_terminal = phy_t; +} + +/** +* @brief parentStrip +* @return parent terminal strip or nullptr +*/ TerminalStrip *RealTerminal::parentStrip() const { - return m_parent_terminal_strip.data(); + if (m_physical_terminal) { + return m_physical_terminal->terminalStrip(); + } else { + return nullptr; + } } /** @@ -113,11 +149,9 @@ TerminalStrip *RealTerminal::parentStrip() const { */ int RealTerminal::level() const { - if (m_parent_terminal_strip) { - const auto phy_t = m_parent_terminal_strip->physicalTerminal(m_this_weak); - if (phy_t) { - return phy_t->levelOf(m_this_weak); - } + if (m_physical_terminal && + sharedRef()) { + return m_physical_terminal->levelOf(sharedRef()); } return -1; @@ -224,8 +258,8 @@ bool RealTerminal::isElement() const { */ bool RealTerminal::isBridged() const { - if (m_parent_terminal_strip) { - return !m_parent_terminal_strip->isBridged(m_this_weak.toStrongRef()).isNull(); + if (parentStrip()) { + return !parentStrip()->isBridged(m_this_weak.toStrongRef()).isNull(); } else { return false; } @@ -237,8 +271,8 @@ bool RealTerminal::isBridged() const */ QSharedPointer RealTerminal::bridge() const { - if (m_parent_terminal_strip) { - return m_parent_terminal_strip->isBridged(m_this_weak.toStrongRef()); + if (parentStrip()) { + return parentStrip()->isBridged(m_this_weak.toStrongRef()); } else { return QSharedPointer(); } diff --git a/sources/TerminalStrip/realterminal.h b/sources/TerminalStrip/realterminal.h index 36f0cc924..7a587c88c 100644 --- a/sources/TerminalStrip/realterminal.h +++ b/sources/TerminalStrip/realterminal.h @@ -45,14 +45,19 @@ class RealTerminal friend class PhysicalTerminal; private: - RealTerminal(TerminalStrip *strip, Element *element = nullptr); + RealTerminal(Element *element = nullptr); + QSharedPointer sharedRef(); + QSharedPointer sharedRef() const; QWeakPointer weakRef(); bool fromXml(QDomElement xml_element, const QVector &terminal_vector); QDomElement toXml(QDomDocument &parent_document) const; + void setPhysicalTerminal(const QSharedPointer &phy_t); + public: + ~RealTerminal(); TerminalStrip *parentStrip() const; int level() const; QString label() const; @@ -78,9 +83,9 @@ class RealTerminal private : QPointer m_element; - QPointer m_parent_terminal_strip; QUuid m_uuid = QUuid::createUuid(); QWeakPointer m_this_weak; + QSharedPointer m_physical_terminal; }; #endif // REALTERMINAL_H diff --git a/sources/TerminalStrip/terminalstrip.cpp b/sources/TerminalStrip/terminalstrip.cpp index 62c14c1e1..256ce83e4 100644 --- a/sources/TerminalStrip/terminalstrip.cpp +++ b/sources/TerminalStrip/terminalstrip.cpp @@ -114,7 +114,7 @@ bool TerminalStrip::addTerminal(Element *terminal) m_terminal_elements_vector.append(terminal); //Create the real terminal - auto raw_real_ptr = new RealTerminal(this, terminal); + auto raw_real_ptr = new RealTerminal(terminal); auto real_terminal = raw_real_ptr->sharedRef(); m_real_terminals.append(real_terminal); @@ -122,8 +122,6 @@ bool TerminalStrip::addTerminal(Element *terminal) auto raw_phy_ptr = new PhysicalTerminal(this, QVector>{real_terminal}); m_physical_terminals.append(raw_phy_ptr->sharedRef()); - static_cast(terminal)->setParentTerminalStrip(this); - return true; } @@ -153,7 +151,6 @@ bool TerminalStrip::removeTerminal(Element *terminal) } m_real_terminals.removeOne(real_terminal); - static_cast(terminal)->setParentTerminalStrip(nullptr); rebuildRealVector(); return true; @@ -824,13 +821,12 @@ bool TerminalStrip::fromXml(QDomElement &xml_element) //Read each real terminal of the current physical terminal of the loop for (auto &xml_real : QETXML::findInDomElement(xml_physical, RealTerminal::xmlTagName())) { - auto raw_ptr = new RealTerminal(this); + auto raw_ptr = new RealTerminal(); auto real_t = raw_ptr->sharedRef(); real_t->fromXml(xml_real, free_terminals); if(real_t->isElement()) { m_terminal_elements_vector.append(real_t->element()); - static_cast(real_t->element())->setParentTerminalStrip(this); } real_t_vector.append(real_t); } diff --git a/sources/qetgraphicsitem/terminalelement.cpp b/sources/qetgraphicsitem/terminalelement.cpp index 8791382ab..536d9434c 100644 --- a/sources/qetgraphicsitem/terminalelement.cpp +++ b/sources/qetgraphicsitem/terminalelement.cpp @@ -16,6 +16,7 @@ along with QElectroTech. If not, see . */ #include "terminalelement.h" +#include"../TerminalStrip/realterminal.h" /** @brief TerminalElement::TerminalElement @@ -41,17 +42,20 @@ void TerminalElement::initLink(QETProject *project) { } /** - * @brief TerminalElement::setParentTerminalStrip - * Set \p strip as parent terminal strip. - * Be carefull, this function only set internally the parent terminal strip. - * This function don't check if there is a previous - * parent terminal strip and don't check - * if the new terminal strip have this terminal element - * in her list of terminal element. - * @param strip + * @brief TerminalElement::setRealTerminal + * Set @a real_t as the real terminal for this terminal element + * @param real_t */ -void TerminalElement::setParentTerminalStrip(TerminalStrip *strip) { - m_parent_terminal_strip = strip; +void TerminalElement::setRealTerminal(const QSharedPointer &real_t) { + m_real_terminal = real_t; +} + +/** + * @brief TerminalElement::realTerminal + * @return the real terminal of this terminal element. + */ +QSharedPointer TerminalElement::realTerminal() const { + return m_real_terminal; } /** @@ -60,6 +64,9 @@ void TerminalElement::setParentTerminalStrip(TerminalStrip *strip) { * terminal element or nullptr if not. */ TerminalStrip *TerminalElement::parentTerminalStrip() const { - return m_parent_terminal_strip.data(); + if (m_real_terminal) { + return m_real_terminal->parentStrip(); + } + return nullptr; } diff --git a/sources/qetgraphicsitem/terminalelement.h b/sources/qetgraphicsitem/terminalelement.h index 3fa5163d3..657520efe 100644 --- a/sources/qetgraphicsitem/terminalelement.h +++ b/sources/qetgraphicsitem/terminalelement.h @@ -23,6 +23,7 @@ #include "../TerminalStrip/terminalstrip.h" class QETProject; +class RealTerminal; /** @brief The TerminalElement class */ @@ -35,11 +36,13 @@ class TerminalElement : public Element ~TerminalElement() override; void initLink(QETProject *project) override; + void setRealTerminal(const QSharedPointer &real_t); + QSharedPointer realTerminal() const; void setParentTerminalStrip(TerminalStrip *strip); TerminalStrip *parentTerminalStrip() const; private: - QPointer m_parent_terminal_strip; + QSharedPointer m_real_terminal; }; #endif // TERMINALELEMENT_H