diff --git a/sources/TerminalStrip/realterminal.cpp b/sources/TerminalStrip/realterminal.cpp index 7c3f06356..b23a42361 100644 --- a/sources/TerminalStrip/realterminal.cpp +++ b/sources/TerminalStrip/realterminal.cpp @@ -66,12 +66,12 @@ bool RealTerminal::fromXml(QDomElement xml_element, const QVectoruuid() == uuid_) { @@ -79,8 +79,6 @@ bool RealTerminal::fromXml(QDomElement xml_element, const QVectorxmlTagName()); - root_elmt.setAttribute("is_draw", m_element ? "true" : "false"); - root_elmt.setAttribute("uuid", m_element ? m_element->uuid().toString() : - m_uuid.toString()); + root_elmt.setAttribute(QStringLiteral("uuid"), m_uuid.toString()); + if (m_element) + root_elmt.setAttribute(QStringLiteral("element_uuid"), m_element->uuid().toString()); return root_elmt; } diff --git a/sources/TerminalStrip/terminalstrip.cpp b/sources/TerminalStrip/terminalstrip.cpp index f38a378ab..09a70785e 100644 --- a/sources/TerminalStrip/terminalstrip.cpp +++ b/sources/TerminalStrip/terminalstrip.cpp @@ -246,6 +246,22 @@ QSharedPointer TerminalStrip::realTerminal(Element *terminal) cons return shared_real_terminal(); } +/** + * @brief TerminalStrip::realTerminalForUuid + * @param uuid + * @return the real terminal with uuid @a uuid or a null QSharedPointer if not found + */ +QSharedPointer TerminalStrip::realTerminalForUuid(const QUuid &uuid) const +{ + for (const auto &t : qAsConst(m_real_terminals)) { + if (t->uuid() == uuid) { + return t; + } + } + + return QSharedPointer(); +} + /** * @brief TerminalStrip::setSortedTo @@ -764,6 +780,10 @@ QDomElement TerminalStrip::toXml(QDomDocument &parent_document) } root_elmt.appendChild(xml_layout); + for (const auto &bridge_ : qAsConst(m_bridge)) { + root_elmt.appendChild(bridge_->toXml(parent_document)); + } + return root_elmt; } @@ -818,6 +838,16 @@ bool TerminalStrip::fromXml(QDomElement &xml_element) } + //Read bridges + const auto bridge_vector = QETXML::directChild(xml_element, TerminalStripBridge::xmlTagName()); + for (const auto &xml_bridge : bridge_vector) + { + auto bridge_ = new TerminalStripBridge(this); + auto shared_bridge = bridge_->sharedRef(); + shared_bridge->fromXml(xml_bridge); + m_bridge.append(shared_bridge); + } + return true; } diff --git a/sources/TerminalStrip/terminalstrip.h b/sources/TerminalStrip/terminalstrip.h index 6017b4875..928cf01da 100644 --- a/sources/TerminalStrip/terminalstrip.h +++ b/sources/TerminalStrip/terminalstrip.h @@ -86,6 +86,7 @@ class TerminalStrip : public QObject QSharedPointer physicalTerminal (const QSharedPointer &real_terminal) const; QVector> physicalTerminal() const; QSharedPointer realTerminal(Element *terminal) const; + QSharedPointer realTerminalForUuid(const QUuid &uuid) const; bool setOrderTo(const QVector> &sorted_vector); bool groupTerminals(const QSharedPointer &receiver_terminal, const QVector> &added_terminals); diff --git a/sources/TerminalStrip/terminalstripbridge.cpp b/sources/TerminalStrip/terminalstripbridge.cpp index d810ad85d..f38f103e4 100644 --- a/sources/TerminalStrip/terminalstripbridge.cpp +++ b/sources/TerminalStrip/terminalstripbridge.cpp @@ -18,6 +18,7 @@ #include "terminalstripbridge.h" #include "realterminal.h" #include "terminalstrip.h" +#include "../qetxml.h" TerminalStripBridge::TerminalStripBridge(TerminalStrip *parent_strip) : m_strip(parent_strip) @@ -70,6 +71,55 @@ QVector > TerminalStripBridge::realTerminals() cons return m_real_terminals; } +/** + * @brief TerminalStripBridge::toXml + * Save this bridge into a QDomElement and return it. + * @param parent_document + * @return + */ +QDomElement TerminalStripBridge::toXml(QDomDocument &parent_document) const +{ + auto root_elmt = parent_document.createElement(xmlTagName()); + + root_elmt.setAttribute(QStringLiteral("uuid"), m_uuid.toString()); + root_elmt.setAttribute(QStringLiteral("color"), m_color.name()); + + auto terminals_elmt = parent_document.createElement(QStringLiteral("real_terminals")); + for (const auto &real_t : qAsConst(m_real_terminals)) + { + if (real_t) + { + auto terminal_elmt = parent_document.createElement(QStringLiteral("real_terminal")); + terminal_elmt.setAttribute(QStringLiteral("uuid"), real_t->uuid().toString()); + terminals_elmt.appendChild(terminal_elmt); + } + } + + root_elmt.appendChild(terminals_elmt); + return root_elmt; +} + +void TerminalStripBridge::fromXml(const QDomElement &dom_element) +{ + if (dom_element.tagName() != xmlTagName() || !m_strip) { + return; + } + + m_uuid.fromString(dom_element.attribute(QStringLiteral("uuid"), m_uuid.toString())); + m_color.setNamedColor(dom_element.attribute(QStringLiteral("color"))); + + const auto real_t_vector = QETXML::subChild(dom_element, + QStringLiteral("real_terminals"), + QStringLiteral("real_terminal")); + for (const auto &xml_real_t : real_t_vector) + { + auto real_t = m_strip->realTerminalForUuid(QUuid(xml_real_t.attribute(QStringLiteral("uuid")))); + if (real_t) { + m_real_terminals.append(real_t); + } + } +} + /** * @brief TerminalStripBridge::addTerminals * @param real_terminals diff --git a/sources/TerminalStrip/terminalstripbridge.h b/sources/TerminalStrip/terminalstripbridge.h index 737731409..61be0cdd7 100644 --- a/sources/TerminalStrip/terminalstripbridge.h +++ b/sources/TerminalStrip/terminalstripbridge.h @@ -22,6 +22,7 @@ #include #include #include +#include #include class RealTerminal; @@ -42,6 +43,10 @@ class TerminalStripBridge void setColor(const QColor &color); QVector> realTerminals() const; + static QString xmlTagName() {return QStringLiteral("terminal_strip_bridge");} + QDomElement toXml(QDomDocument &parent_document) const; + void fromXml(const QDomElement &dom_element); + private: bool addTerminals(const QVector> &real_terminals); void removeTerminals(const QVector> &real_terminals); diff --git a/sources/TerminalStrip/ui/terminalstripeditor.cpp b/sources/TerminalStrip/ui/terminalstripeditor.cpp index 1b226c410..ef922cb69 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditor.cpp @@ -916,7 +916,8 @@ void TerminalStripEditor::on_m_bridge_color_cb_activated(const QColor &col) { if (mrtd.level_ == level_ && mrtd.bridged_) { auto bridge_ = mrtd.real_terminal.toStrongRef()->bridge(); - m_project->undoStack()->push(new ChangeTerminalStripColor(bridge_, col)); + if (bridge_->color() != col) + m_project->undoStack()->push(new ChangeTerminalStripColor(bridge_, col)); break; } }