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) :
m_element(terminal)
{
if (terminal) {
static_cast<TerminalElement *>(terminal)->setRealTerminal(sharedRef());
}
}
{}
RealTerminal::~RealTerminal()
{
if (m_physical_terminal) {
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;
}
/**
* @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
* @param parent_document
@ -115,7 +78,6 @@ bool RealTerminal::fromXml(QDomElement xml_element, const QVector<TerminalElemen
QDomElement RealTerminal::toXml(QDomDocument &parent_document) const
{
auto root_elmt = parent_document.createElement(this->xmlTagName());
root_elmt.setAttribute(QStringLiteral("uuid"), m_uuid.toString());
if (m_element)
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
*/
QUuid RealTerminal::uuid() const {
return elementUuid();
return m_uuid;
}

View File

@ -41,24 +41,24 @@ class TerminalStripBridge;
*/
class RealTerminal
{
friend class TerminalStrip;
friend class TerminalElement;
friend class PhysicalTerminal;
private:
RealTerminal(Element *element = nullptr);
RealTerminal(Element *element);
QSharedPointer<RealTerminal> sharedRef();
QSharedPointer<RealTerminal> sharedRef() const;
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);
public:
~RealTerminal();
TerminalStrip *parentStrip() const;
QDomElement toXml(QDomDocument &parent_document) const;
int level() const;
QString label() const;
QString Xref() const;

View File

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

View File

@ -28,7 +28,10 @@
TerminalElement::TerminalElement(const ElementsLocation &location,
QGraphicsItem *qgi, int *state) :
Element(location, qgi, state, Element::Terminale)
{}
{
auto rt = new RealTerminal(this);
m_real_terminal = rt->sharedRef();
}
TerminalElement::~TerminalElement()
{}
@ -41,15 +44,6 @@ void TerminalElement::initLink(QETProject *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
* @return the real terminal of this terminal element.

View File

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