RealTerminal is created by the TerminalElement itself

This commit is contained in:
joshua 2022-02-09 18:08:20 +01:00
parent 70f50ff362
commit c037d3ea0a
5 changed files with 26 additions and 67 deletions

View File

@ -27,20 +27,13 @@
*/ */
RealTerminal::RealTerminal(Element *terminal) : RealTerminal::RealTerminal(Element *terminal) :
m_element(terminal) m_element(terminal)
{ {}
if (terminal) {
static_cast<TerminalElement *>(terminal)->setRealTerminal(sharedRef());
}
}
RealTerminal::~RealTerminal() RealTerminal::~RealTerminal()
{ {
if (m_physical_terminal) { if (m_physical_terminal) {
m_physical_terminal->removeTerminal(sharedRef()); m_physical_terminal->removeTerminal(sharedRef());
} }
if (m_element) {
static_cast<TerminalElement *>(m_element.data())->setRealTerminal(QSharedPointer<RealTerminal>());
}
} }
/** /**
@ -77,36 +70,6 @@ QWeakPointer<RealTerminal> RealTerminal::weakRef() {
return m_this_weak; return m_this_weak;
} }
/**
* @brief fromXml
* @param xml_element
* @return
*/
bool RealTerminal::fromXml(QDomElement xml_element, const QVector<TerminalElement *> &terminal_vector)
{
if (xml_element.tagName() != xmlTagName()) {
return true;
}
m_uuid = QUuid(xml_element.attribute(QStringLiteral("uuid")));
if (xml_element.hasAttribute(QStringLiteral("element_uuid")))
{
QUuid uuid_(xml_element.attribute(QStringLiteral("element_uuid")));
for (auto terminal : terminal_vector) {
if (terminal->uuid() == uuid_)
{
m_element = terminal;
static_cast<TerminalElement *>(terminal)->setRealTerminal(sharedRef());
break;
}
}
}
return true;
}
/** /**
* @brief toXml * @brief toXml
* @param parent_document * @param parent_document
@ -115,7 +78,6 @@ bool RealTerminal::fromXml(QDomElement xml_element, const QVector<TerminalElemen
QDomElement RealTerminal::toXml(QDomDocument &parent_document) const QDomElement RealTerminal::toXml(QDomDocument &parent_document) const
{ {
auto root_elmt = parent_document.createElement(this->xmlTagName()); auto root_elmt = parent_document.createElement(this->xmlTagName());
root_elmt.setAttribute(QStringLiteral("uuid"), m_uuid.toString());
if (m_element) if (m_element)
root_elmt.setAttribute(QStringLiteral("element_uuid"), m_element->uuid().toString()); root_elmt.setAttribute(QStringLiteral("element_uuid"), m_element->uuid().toString());
@ -306,6 +268,7 @@ QUuid RealTerminal::elementUuid() const {
* @return the uuid of this real terminal * @return the uuid of this real terminal
*/ */
QUuid RealTerminal::uuid() const { QUuid RealTerminal::uuid() const {
return elementUuid();
return m_uuid; return m_uuid;
} }

View File

@ -41,24 +41,24 @@ class TerminalStripBridge;
*/ */
class RealTerminal class RealTerminal
{ {
friend class TerminalStrip; friend class TerminalElement;
friend class PhysicalTerminal; friend class PhysicalTerminal;
private: private:
RealTerminal(Element *element = nullptr); RealTerminal(Element *element);
QSharedPointer<RealTerminal> sharedRef(); QSharedPointer<RealTerminal> sharedRef();
QSharedPointer<RealTerminal> sharedRef() const; QSharedPointer<RealTerminal> sharedRef() const;
QWeakPointer<RealTerminal> weakRef(); QWeakPointer<RealTerminal> weakRef();
bool fromXml(QDomElement xml_element, const QVector<TerminalElement *> &terminal_vector);
QDomElement toXml(QDomDocument &parent_document) const;
void setPhysicalTerminal(const QSharedPointer<PhysicalTerminal> &phy_t); void setPhysicalTerminal(const QSharedPointer<PhysicalTerminal> &phy_t);
public: public:
~RealTerminal(); ~RealTerminal();
TerminalStrip *parentStrip() const; TerminalStrip *parentStrip() const;
QDomElement toXml(QDomDocument &parent_document) const;
int level() const; int level() const;
QString label() const; QString label() const;
QString Xref() const; QString Xref() const;

View File

@ -113,13 +113,11 @@ bool TerminalStrip::addTerminal(Element *terminal)
m_terminal_elements_vector.append(terminal); m_terminal_elements_vector.append(terminal);
//Create the real terminal auto casted_ = static_cast<TerminalElement *>(terminal);
auto raw_real_ptr = new RealTerminal(terminal); m_real_terminals.append(casted_->realTerminal());
auto real_terminal = raw_real_ptr->sharedRef();
m_real_terminals.append(real_terminal);
//Create a new single level physical terminal //Create a new single level physical terminal
auto raw_phy_ptr = new PhysicalTerminal(this, QVector<QSharedPointer<RealTerminal>>{real_terminal}); auto raw_phy_ptr = new PhysicalTerminal(this, QVector<QSharedPointer<RealTerminal>>{casted_->realTerminal()});
m_physical_terminals.append(raw_phy_ptr->sharedRef()); m_physical_terminals.append(raw_phy_ptr->sharedRef());
return true; return true;
@ -811,7 +809,7 @@ bool TerminalStrip::fromXml(QDomElement &xml_element)
{ {
//Get all free elements terminal of the project //Get all free elements terminal of the project
const ElementProvider ep(m_project); const ElementProvider ep(m_project);
const auto free_terminals = ep.freeTerminal(); auto free_terminals = ep.freeTerminal();
//Read each physical terminal //Read each physical terminal
for(auto &xml_physical : QETXML::findInDomElement(xml_layout, PhysicalTerminal::xmlTagName())) for(auto &xml_physical : QETXML::findInDomElement(xml_layout, PhysicalTerminal::xmlTagName()))
@ -821,14 +819,19 @@ bool TerminalStrip::fromXml(QDomElement &xml_element)
//Read each real terminal of the current physical terminal of the loop //Read each real terminal of the current physical terminal of the loop
for (auto &xml_real : QETXML::findInDomElement(xml_physical, RealTerminal::xmlTagName())) for (auto &xml_real : QETXML::findInDomElement(xml_physical, RealTerminal::xmlTagName()))
{ {
auto raw_ptr = new RealTerminal(); const auto uuid_ = QUuid(xml_real.attribute(QStringLiteral("element_uuid")));
auto real_t = raw_ptr->sharedRef(); for (auto terminal_elmt : qAsConst(free_terminals))
real_t->fromXml(xml_real, free_terminals);
if(real_t->isElement())
{ {
m_terminal_elements_vector.append(real_t->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
free_terminals.removeOne(terminal_elmt);
break;
}
} }
real_t_vector.append(real_t);
} }
auto raw_ptr = new PhysicalTerminal(this, real_t_vector); auto raw_ptr = new PhysicalTerminal(this, real_t_vector);

View File

@ -28,7 +28,10 @@
TerminalElement::TerminalElement(const ElementsLocation &location, TerminalElement::TerminalElement(const ElementsLocation &location,
QGraphicsItem *qgi, int *state) : QGraphicsItem *qgi, int *state) :
Element(location, qgi, state, Element::Terminale) Element(location, qgi, state, Element::Terminale)
{} {
auto rt = new RealTerminal(this);
m_real_terminal = rt->sharedRef();
}
TerminalElement::~TerminalElement() TerminalElement::~TerminalElement()
{} {}
@ -41,15 +44,6 @@ void TerminalElement::initLink(QETProject *project) {
Element::initLink(project); Element::initLink(project);
} }
/**
* @brief TerminalElement::setRealTerminal
* Set @a real_t as the real terminal for this terminal element
* @param real_t
*/
void TerminalElement::setRealTerminal(const QSharedPointer<RealTerminal> &real_t) {
m_real_terminal = real_t;
}
/** /**
* @brief TerminalElement::realTerminal * @brief TerminalElement::realTerminal
* @return the real terminal of this terminal element. * @return the real terminal of this terminal element.

View File

@ -36,7 +36,6 @@ class TerminalElement : public Element
~TerminalElement() override; ~TerminalElement() override;
void initLink(QETProject *project) override; void initLink(QETProject *project) override;
void setRealTerminal(const QSharedPointer<RealTerminal> &real_t);
QSharedPointer<RealTerminal> realTerminal() const; QSharedPointer<RealTerminal> realTerminal() const;
void setParentTerminalStrip(TerminalStrip *strip); void setParentTerminalStrip(TerminalStrip *strip);
TerminalStrip *parentTerminalStrip() const; TerminalStrip *parentTerminalStrip() const;