/* 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 TERMINALSTRIP_H #define TERMINALSTRIP_H #include #include #include #include "terminalstripdata.h" #include "../properties/elementdata.h" class Element; class RealTerminal; class QETProject; class PhysicalTerminal; class TerminalStripIndex; class TerminalElement; class TerminalStrip; struct TerminalStripBridge { QVector> real_terminals; QColor color_ = Qt::darkGray; QUuid uuid_ = QUuid::createUuid(); }; inline bool operator == (const TerminalStripBridge &bridge_1, const TerminalStripBridge &bridge_2) { return (bridge_1.uuid_ == bridge_2.uuid_); } inline uint qHash(const QWeakPointer &key, uint seed) { const auto bridge = key.toStrongRef(); if (bridge) { return qHash(bridge->uuid_, seed); } else { return qHash(QUuid (), seed); } } class RealTerminalData { friend class TerminalStrip; friend class PhysicalTerminalData; private: RealTerminalData(QSharedPointer real_terminal); RealTerminalData(QWeakPointer real_terminal); public: RealTerminalData() {} bool isNull() const; int level() const; QString label() const; QString Xref() const; QString cable() const; QString cableWire() const; QString conductor() const; ElementData::TerminalType type() const; ElementData::TerminalFunction function() const; bool isLed() const; bool isElement() const; bool isBridged() const; Element* element() const; QUuid elementUuid() const; QSharedPointer bridge() const; QWeakPointer realTerminal() const; private: QWeakPointer m_real_terminal; }; /** * @brief The PhysicalTerminalData * Conveniant struct to quickly get some values * of a PhysicalTerminal */ class PhysicalTerminalData { friend class TerminalStrip; private: PhysicalTerminalData(const TerminalStrip *strip, QSharedPointer terminal); public: PhysicalTerminalData(){} bool isNull() const; int pos() const; QUuid uuid() const; int realTerminalCount() const; QVector realTerminalDatas() const; QWeakPointer physicalTerminal() const; private: QPointer m_strip; QWeakPointer m_physical_terminal; }; //Code to use PhysicalTerminalData as key for QHash inline bool operator == (const PhysicalTerminalData &phy_1, const PhysicalTerminalData &phy_2) { return phy_1.uuid() == phy_2.uuid(); } inline uint qHash(const PhysicalTerminalData &key, uint seed) { return qHash(key.uuid(), seed); } /** * @brief The TerminalStrip class * This class hold all the datas and configurations * of a terminal strip (but the not the visual aspect). * A terminal strip have some informations (name comment etc...) * and is composed by one or several PhysicalTerminal. */ class TerminalStrip : public QObject { friend class TerminalStripModel; friend class RealTerminalData; 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, const QString &location, const QString &name, QETProject *project); void setInstallation(const QString &installation); QString installation() const {return m_data.m_installation;} void setLocation(const QString &location); QString location() const {return m_data.m_location;} void setName(const QString &name); QString name() const {return m_data.m_name;} void setComment(const QString &comment); QString comment() const {return m_data.m_comment;} void setDescription(const QString &description); QString description() const {return m_data.m_description;} QUuid uuid() const {return m_data.m_uuid;} TerminalStripData data() const; void setData(const TerminalStripData &data); bool addTerminal (Element *terminal); bool removeTerminal (Element *terminal); int pos(const QWeakPointer &terminal) const; int physicalTerminalCount() const; PhysicalTerminalData physicalTerminalData(int index) const; PhysicalTerminalData physicalTerminalData (const QWeakPointer &real_terminal) const; QVector physicalTerminalData() const; bool setOrderTo(const QVector &sorted_vector); bool groupTerminals(const PhysicalTerminalData &receiver_terminal, const QVector> &added_terminals); void unGroupTerminals(const QVector> &terminals_to_ungroup); bool setLevel(const QWeakPointer &real_terminal, int level); bool isBridgeable(const QVector> &real_terminals) const; bool setBridge(const QVector> &real_terminals); bool setBridge(const QSharedPointer &bridge, const QVector> &real_terminals); void unBridge(const QVector> &real_terminals); QSharedPointer bridgeFor(const QWeakPointer &real_terminal) const; RealTerminalData previousTerminalInLevel(const QWeakPointer &real_terminal) const; RealTerminalData nextTerminalInLevel(const QWeakPointer &real_terminal) const; RealTerminalData previousRealTerminal(const QWeakPointer &real_terminal) const; RealTerminalData nextRealTerminal(const QWeakPointer &real_terminal) const; RealTerminalData realTerminalDataFor(const QWeakPointer &real_terminal) const; QVector> terminalElement() const; static QString xmlTagName() {return QStringLiteral("terminal_strip");} QDomElement toXml(QDomDocument &parent_document); bool fromXml(QDomElement &xml_element); private: QSharedPointer realTerminal(Element *terminal); QSharedPointer physicalTerminal(QSharedPointer terminal) const; QSharedPointer isBridged(const QSharedPointer real_terminal) const; QSharedPointer bridgeFor (const QVector> &terminal_vector) const; void rebuildRealVector(); private: TerminalStripData m_data; QPointer m_project; QVector> m_terminal_elements_vector; QVector> m_real_terminals; QVector> m_physical_terminals; QVector> m_bridge; }; #endif // TERMINALSTRIP_H