diff --git a/sources/TerminalStrip/realterminal.h b/sources/TerminalStrip/realterminal.h index 4a4ef07ad..36f0cc924 100644 --- a/sources/TerminalStrip/realterminal.h +++ b/sources/TerminalStrip/realterminal.h @@ -26,7 +26,7 @@ class TerminalStrip; class Element; class TerminalElement; class PhysicalTerminal; -struct TerminalStripBridge; +class TerminalStripBridge; /** * @brief The RealTerminal class diff --git a/sources/TerminalStrip/terminalstrip.cpp b/sources/TerminalStrip/terminalstrip.cpp index abd09ee32..e913dfb7a 100644 --- a/sources/TerminalStrip/terminalstrip.cpp +++ b/sources/TerminalStrip/terminalstrip.cpp @@ -22,9 +22,9 @@ #include "../elementprovider.h" #include "../qetxml.h" #include "../autoNum/assignvariables.h" -#include "../../utils/qetutils.h" #include "physicalterminal.h" #include "realterminal.h" +#include "terminalstripbridge.h" using shared_real_terminal = QSharedPointer; using shared_physical_terminal = QSharedPointer; @@ -480,29 +480,20 @@ bool TerminalStrip::setBridge(const QVector> &real_ if (!isBridgeable(real_terminals)) { return false; } - QVector> real_terminals_vector; - for (const auto &real_terminal : real_terminals) + auto bridge = bridgeFor(real_terminals); + if (bridge.isNull()) { - if (real_terminal) { - real_terminals_vector.append(real_terminal); - } - } - - auto bridge = bridgeFor(real_terminals_vector); - if (bridge.isNull()) { - bridge = QSharedPointer::create(); + bridge = QSharedPointer(new TerminalStripBridge(this)); m_bridge.append(bridge); } - for (const auto &real_t : qAsConst(real_terminals_vector)) + if (bridge->addTerminals(real_terminals)) { - if (!bridge->real_terminals.contains(real_t)) - bridge->real_terminals.append(real_t); + emit bridgeChanged();; + return true; } - - emit bridgeChanged(); - return true; + return false; } /** @@ -520,18 +511,8 @@ bool TerminalStrip::setBridge(const QSharedPointer &bridge, return false; } - bool b_ = false; - for (const auto &real_t : real_terminals) + if (bridge->addTerminals(real_terminals)) { - if (real_t && - !bridge->real_terminals.contains(real_t)) - { - bridge->real_terminals.append(real_t); - b_ = true; - } - } - - if (b_) { emit bridgeChanged(); return true; } @@ -551,10 +532,7 @@ void TerminalStrip::unBridge(const QVector> &real_t if (canUnBridge(real_terminals)) { auto bridge_ = isBridged(real_terminals.first()); - for (const auto &real_t : qAsConst(real_terminals)) { - bridge_->real_terminals.removeOne(real_t); - } - + bridge_->removeTerminals(real_terminals); emit bridgeChanged(); } } @@ -564,7 +542,7 @@ void TerminalStrip::unBridge(const QVector> &real_t * @param m_real_terminals * @return True if all terminals of @a real_terminals can be unbridged. * For this method return True, all terminals must be bridged together, - * be consecutive and in an one or the both extremities of the bridge. + * be consecutive and in one or the both extremities of the bridge. */ bool TerminalStrip::canUnBridge(const QVector > &real_terminals) const { @@ -634,7 +612,7 @@ QSharedPointer TerminalStrip::isBridged(const QSharedPointe if (real_terminal) { for (const auto &bridge_ : qAsConst(m_bridge)) { - if (bridge_->real_terminals.contains(real_terminal)) + if (bridge_->realTerminals().contains(real_terminal)) return bridge_; } } diff --git a/sources/TerminalStrip/terminalstrip.h b/sources/TerminalStrip/terminalstrip.h index 3171149f2..5837ac7f4 100644 --- a/sources/TerminalStrip/terminalstrip.h +++ b/sources/TerminalStrip/terminalstrip.h @@ -32,13 +32,7 @@ class PhysicalTerminal; class TerminalStripIndex; class TerminalElement; class TerminalStrip; - -struct TerminalStripBridge -{ - QVector> real_terminals; - QColor color_ = Qt::darkGray; - QUuid uuid_ = QUuid::createUuid(); -}; +class TerminalStripBridge; /** * @brief The TerminalStrip class @@ -55,13 +49,11 @@ class TerminalStrip : public QObject Q_OBJECT public: - static QVector bridgeColor() {return QVector{Qt::red, Qt::blue, Qt::white, Qt::darkGray, Qt::black};} - signals: void orderChanged(); //Emitted when the order of the physical terminal is changed void bridgeChanged(); - public: + TerminalStrip(QETProject *project); TerminalStrip(const QString &installation, diff --git a/sources/TerminalStrip/terminalstripbridge.cpp b/sources/TerminalStrip/terminalstripbridge.cpp new file mode 100644 index 000000000..c6c87a029 --- /dev/null +++ b/sources/TerminalStrip/terminalstripbridge.cpp @@ -0,0 +1,84 @@ +/* + Copyright 2006-2021 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include "terminalstripbridge.h" +#include "realterminal.h" +#include "terminalstrip.h" + +TerminalStripBridge::TerminalStripBridge(TerminalStrip *parent_strip) : + m_strip(parent_strip) +{} + +/** + * @brief TerminalStripBridge::color + * @return The color of this bridge + */ +QColor TerminalStripBridge::color() const { + return m_color; +} + +/** + * @brief TerminalStripBridge::realTerminals + * @return the real terminals who are bridged by this bridge + */ +QVector > TerminalStripBridge::realTerminals() const { + return m_real_terminals; +} + +/** + * @brief TerminalStripBridge::addTerminals + * @param real_terminals + * @return Add terminals of @a real_terminals to this bridge. + * If a terminal is already bridged by this bridge, the terminal is ignored. + * If at least one terminal doesn't belong to the same strip of this bridge + * this function do nothing and return false. + */ +bool TerminalStripBridge::addTerminals(const QVector > &real_terminals) +{ + QVector> to_append; + for (const auto &real_t : real_terminals) + { + if (!real_t.isNull()) + { + if (real_t->parentStrip() != m_strip) { + return false; + } + if (!m_real_terminals.contains(real_t)) { + to_append.append(real_t); + } + } else { + return false; + } + } + + m_real_terminals.append(to_append); + return true; +} + +/** + * @brief TerminalStripBridge::removeTerminals + * @param real_terminal + * Remove all real terminal of @real_terminals from this bridge. + * This function doesn't make any check, they just remove if exist. + * @sa TerminalStrip::canUnBridge + */ +void TerminalStripBridge::removeTerminals(const QVector> &real_terminals) +{ + for (const auto &real_t : real_terminals) { + m_real_terminals.removeOne(real_t); + } +} diff --git a/sources/TerminalStrip/terminalstripbridge.h b/sources/TerminalStrip/terminalstripbridge.h new file mode 100644 index 000000000..715bd7755 --- /dev/null +++ b/sources/TerminalStrip/terminalstripbridge.h @@ -0,0 +1,51 @@ +/* + Copyright 2006-2021 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#ifndef TERMINALSTRIPBRIDGE_H +#define TERMINALSTRIPBRIDGE_H + +#include +#include +#include +#include + +class RealTerminal; +class TerminalStrip; + +class TerminalStripBridge +{ + public: + static QVector bridgeColor() {return QVector{Qt::red, Qt::blue, Qt::white, Qt::darkGray, Qt::black};} + + TerminalStripBridge(TerminalStrip *parent_strip = nullptr); + + QColor color() const; + QVector> realTerminals() const; + bool addTerminals(const QVector> &real_terminals); + void removeTerminals(const QVector> &real_terminals); + + + private: + QPointer m_strip; + QVector> m_real_terminals; + QColor m_color = Qt::darkGray; + QUuid m_uuid = QUuid::createUuid(); +}; + + + +#endif // TERMINALSTRIPBRIDGE_H diff --git a/sources/TerminalStrip/ui/terminalstripeditor.cpp b/sources/TerminalStrip/ui/terminalstripeditor.cpp index d9e941b6e..c8afaf339 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditor.cpp @@ -37,6 +37,7 @@ #include "../../utils/qetutils.h" #include "../physicalterminal.h" #include "../realterminal.h" +#include "../terminalstripbridge.h" #include @@ -63,7 +64,7 @@ TerminalStripEditor::TerminalStripEditor(QETProject *project, QWidget *parent) : #endif //Setup the bridge color - ui->m_bridge_color_cb->setColors(TerminalStrip::bridgeColor().toList()); + ui->m_bridge_color_cb->setColors(TerminalStripBridge::bridgeColor().toList()); setUpUndoConnections(); diff --git a/sources/TerminalStrip/ui/terminalstripmodel.cpp b/sources/TerminalStrip/ui/terminalstripmodel.cpp index 007129e86..83a97718c 100644 --- a/sources/TerminalStrip/ui/terminalstripmodel.cpp +++ b/sources/TerminalStrip/ui/terminalstripmodel.cpp @@ -20,6 +20,7 @@ #include "../../qetgraphicsitem/element.h" #include "../physicalterminal.h" #include "../realterminal.h" +#include "../terminalstripbridge.h" #include #include #include @@ -416,7 +417,7 @@ modelRealTerminalData TerminalStripModel::modelRealTerminalDataForIndex(const QM void TerminalStripModel::buildBridgePixmap(const QSize &pixmap_size) { m_bridges_pixmaps.clear(); - for (auto color_ : TerminalStrip::bridgeColor()) + for (auto color_ : TerminalStripBridge::bridgeColor()) { QPen pen; pen.setColor(color_); @@ -656,7 +657,7 @@ QPixmap TerminalStripModel::bridgePixmapFor(const QModelIndex &index) const if (next_t) next_bridge = next_t->bridge(); - auto color_ = bridge_->color_; + auto color_ = bridge_->color(); auto pixmap_ = m_bridges_pixmaps.value(color_); //Current real terminal between two bridged terminal @@ -749,7 +750,7 @@ QPixmap TerminalStripModel::bridgePixmapFor(const QModelIndex &index) const if (previous_bridge == m_terminal_strip->isBridged(next_data.real_terminal)) { if (previous_bridge) { - return m_bridges_pixmaps.value(previous_bridge->color_).none_; + return m_bridges_pixmaps.value(previous_bridge->color()).none_; } }