Merge branch 'terminal_strip'

* terminal_strip:
  Terminal strip bridge are now save in .qet file
Minor : don't push an undo command when change bridge color by the
same color
This commit is contained in:
joshua 2022-01-31 18:17:27 +01:00
commit 1d20018a26
6 changed files with 95 additions and 10 deletions

View File

@ -66,12 +66,12 @@ bool RealTerminal::fromXml(QDomElement xml_element, const QVector<TerminalElemen
return true;
}
auto is_draw = xml_element.attribute(QStringLiteral("is_draw")) == QLatin1String("true")
? true : false;
m_uuid = QUuid(xml_element.attribute(QStringLiteral("uuid")));
QUuid uuid_(xml_element.attribute(QStringLiteral("uuid")));
if (xml_element.hasAttribute(QStringLiteral("element_uuid")))
{
QUuid uuid_(xml_element.attribute(QStringLiteral("element_uuid")));
if (is_draw) {
for (auto terminal : terminal_vector) {
if (terminal->uuid() == uuid_)
{
@ -79,8 +79,6 @@ bool RealTerminal::fromXml(QDomElement xml_element, const QVector<TerminalElemen
break;
}
}
} else {
m_uuid = uuid_;
}
return true;
@ -94,9 +92,9 @@ 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("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;
}

View File

@ -246,6 +246,22 @@ QSharedPointer<RealTerminal> 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<RealTerminal> TerminalStrip::realTerminalForUuid(const QUuid &uuid) const
{
for (const auto &t : qAsConst(m_real_terminals)) {
if (t->uuid() == uuid) {
return t;
}
}
return QSharedPointer<RealTerminal>();
}
/**
* @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;
}

View File

@ -86,6 +86,7 @@ class TerminalStrip : public QObject
QSharedPointer<PhysicalTerminal> physicalTerminal (const QSharedPointer<RealTerminal> &real_terminal) const;
QVector<QSharedPointer<PhysicalTerminal>> physicalTerminal() const;
QSharedPointer<RealTerminal> realTerminal(Element *terminal) const;
QSharedPointer<RealTerminal> realTerminalForUuid(const QUuid &uuid) const;
bool setOrderTo(const QVector<QSharedPointer<PhysicalTerminal>> &sorted_vector);
bool groupTerminals(const QSharedPointer<PhysicalTerminal> &receiver_terminal, const QVector<QSharedPointer<RealTerminal>> &added_terminals);

View File

@ -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<QSharedPointer<RealTerminal> > 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

View File

@ -22,6 +22,7 @@
#include <QUuid>
#include <QPointer>
#include <QColor>
#include <QDomDocument>
#include <QVector>
class RealTerminal;
@ -42,6 +43,10 @@ class TerminalStripBridge
void setColor(const QColor &color);
QVector<QSharedPointer<RealTerminal>> 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<QSharedPointer<RealTerminal>> &real_terminals);
void removeTerminals(const QVector<QSharedPointer<RealTerminal>> &real_terminals);

View File

@ -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;
}
}