diff --git a/sources/TerminalStrip/terminalstrip.cpp b/sources/TerminalStrip/terminalstrip.cpp index 8ca68fbbf..4a11234ee 100644 --- a/sources/TerminalStrip/terminalstrip.cpp +++ b/sources/TerminalStrip/terminalstrip.cpp @@ -629,14 +629,13 @@ RealTerminalData TerminalStrip::realTerminalData(QSharedPointer re auto physical_terminal = physicalTerminal(real_terminal); - rtd.m_real_terminal = real_terminal; rtd.level_ = physical_terminal->levelOf(real_terminal); rtd.label_ = real_terminal->label(); if (real_terminal->isElement()) { rtd.Xref_ = autonum::AssignVariables::genericXref(real_terminal->element()); rtd.uuid_ = real_terminal->elementUuid(); - rtd.element_ = qgraphicsitem_cast(real_terminal->element()); + rtd.element_ = real_terminal->element(); } rtd.type_ = real_terminal->type(); rtd.function_ = real_terminal->function(); diff --git a/sources/TerminalStrip/terminalstrip.h b/sources/TerminalStrip/terminalstrip.h index 5c1839c3f..e89182344 100644 --- a/sources/TerminalStrip/terminalstrip.h +++ b/sources/TerminalStrip/terminalstrip.h @@ -34,8 +34,6 @@ class TerminalElement; struct RealTerminalData { - QSharedPointer m_real_terminal; - int level_ = 0; QString label_, @@ -52,8 +50,7 @@ struct RealTerminalData bool led_ = false, is_element = false; - TerminalElement *element_ = nullptr; - + QPointer element_; }; struct PhysicalTerminalData diff --git a/sources/TerminalStrip/ui/terminalstripeditor.cpp b/sources/TerminalStrip/ui/terminalstripeditor.cpp index 4b739da4d..b15f59d65 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditor.cpp @@ -69,9 +69,6 @@ TerminalStripEditor::TerminalStripEditor(QETProject *project, QWidget *parent) : } } }); - connect(ui->m_table_widget, &QAbstractItemView::entered, [this](auto index) { - qDebug() <<"entered"; - }); } /** @@ -221,8 +218,8 @@ QTreeWidgetItem* TerminalStripEditor::addTerminalStrip(TerminalStrip *terminal_s terminal_item->setData(0, TerminalStripTreeWidget::UUID_USER_ROLE, real_t.uuid_.toString()); terminal_item->setIcon(0, QET::Icons::ElementTerminal); - if (real_t.is_element) { - m_uuid_terminal_H.insert(real_t.uuid_, real_t.element_); + if (real_t.element_) { + m_uuid_terminal_H.insert(real_t.uuid_, qgraphicsitem_cast(real_t.element_)); } } } @@ -440,7 +437,7 @@ void TerminalStripEditor::on_m_dialog_button_box_clicked(QAbstractButton *button { for (auto modified_data : m_model->modifiedRealTerminalData()) { - auto element = m_current_strip->elementForRealTerminal(modified_data.m_real_terminal); + auto element = modified_data.element_; if (element) { auto current_data = element->elementData(); current_data.setTerminalType(modified_data.type_); diff --git a/sources/TerminalStrip/ui/terminalstripmodel.cpp b/sources/TerminalStrip/ui/terminalstripmodel.cpp index fa2f73faa..b9e78e973 100644 --- a/sources/TerminalStrip/ui/terminalstripmodel.cpp +++ b/sources/TerminalStrip/ui/terminalstripmodel.cpp @@ -116,8 +116,8 @@ QVariant TerminalStripModel::data(const QModelIndex &index, int role) const } else if (role == Qt::BackgroundRole && index.column() <= CONDUCTOR_CELL ) { - if (m_modified_cell.contains(rtd.m_real_terminal) && - m_modified_cell.value(rtd.m_real_terminal).at(index.column())) + if (m_modified_cell.contains(rtd.element_) && + m_modified_cell.value(rtd.element_).at(index.column())) { return QBrush(Qt::yellow); } @@ -168,17 +168,17 @@ bool TerminalStripModel::setData(const QModelIndex &index, const QVariant &value { replaceDataAtRow(rtd, index.row()); - if (rtd.m_real_terminal) + if (rtd.element_) { QVector vector_; - if (m_modified_cell.contains(rtd.m_real_terminal)) { - vector_ = m_modified_cell.value(rtd.m_real_terminal); + if (m_modified_cell.contains(rtd.element_)) { + vector_ = m_modified_cell.value(rtd.element_); } else { vector_ = UNMODIFIED_CELL_VECTOR; } vector_.replace(modified_cell, true); - m_modified_cell.insert(rtd.m_real_terminal, vector_); + m_modified_cell.insert(rtd.element_, vector_); } return true; } @@ -236,7 +236,7 @@ QVector TerminalStripModel::modifiedRealTerminalData() const for (const auto &ptd : m_physical_terminal_data) { for (const auto &rtd : ptd.real_terminals_vector) { - if (modified_real_terminal.contains(rtd.m_real_terminal)) { + if (modified_real_terminal.contains(rtd.element_)) { returned_vector.append(rtd); } } @@ -254,18 +254,17 @@ QVector TerminalStripModel::modifiedRealTerminalData() const */ bool TerminalStripModel::isXrefCell(const QModelIndex &index, Element **element) { - if (index.model() == this && index.isValid()) + if (index.model() == this + && index.isValid() + && index.column() == XREF_CELL) { - if (index.column() == XREF_CELL) + if (index.row() < rowCount()) { - if (index.row() < rowCount()) - { - const auto data = dataAtRow(index.row()); - *element = m_terminal_strip->elementForRealTerminal(data.m_real_terminal); - + if (auto data = dataAtRow(index.row()) ; data.element_) { + *element = data.element_.data(); } - return true; } + return true; } return false; diff --git a/sources/TerminalStrip/ui/terminalstripmodel.h b/sources/TerminalStrip/ui/terminalstripmodel.h index 92afffcc9..27051667e 100644 --- a/sources/TerminalStrip/ui/terminalstripmodel.h +++ b/sources/TerminalStrip/ui/terminalstripmodel.h @@ -52,7 +52,7 @@ class TerminalStripModel : public QAbstractTableModel private: QPointer m_terminal_strip; QVector m_physical_terminal_data; - QHash, QVector> m_modified_cell; + QHash> m_modified_cell; }; class TerminalStripModelDelegate : public QStyledItemDelegate diff --git a/sources/properties/elementdata.cpp b/sources/properties/elementdata.cpp index 992cc61f7..01d57d21a 100644 --- a/sources/properties/elementdata.cpp +++ b/sources/properties/elementdata.cpp @@ -200,6 +200,21 @@ bool ElementData::terminalLed() const m_terminal_led; } +/** + * @brief ElementData::terminalPropertiesIsOverrided + * @return true if at least one sub properties of terminal type is overrided + */ +bool ElementData::terminalPropertiesIsOverrided() const +{ + if (m_terminal_type_is_override + || m_terminal_function_is_override + || m_terminal_led_is_override) { + return true; + } + + return false; +} + bool ElementData::operator==(const ElementData &data) const { if (data.m_type != m_type) { diff --git a/sources/properties/elementdata.h b/sources/properties/elementdata.h index d2f7819ee..d76700775 100644 --- a/sources/properties/elementdata.h +++ b/sources/properties/elementdata.h @@ -99,6 +99,7 @@ class ElementData : public PropertiesInterface void setTerminalLED(bool led); bool terminalLed() const; + bool terminalPropertiesIsOverrided() const; bool operator==(const ElementData &data) const; bool operator!=(const ElementData &data) const; diff --git a/sources/qetgraphicsitem/element.cpp b/sources/qetgraphicsitem/element.cpp index 0696a1bd0..642ea0a53 100644 --- a/sources/qetgraphicsitem/element.cpp +++ b/sources/qetgraphicsitem/element.cpp @@ -33,6 +33,7 @@ #include "dynamicelementtextitem.h" #include "elementtextitemgroup.h" #include "iostream" +#include "../qetxml.h" #include #include @@ -846,6 +847,28 @@ bool Element::fromXml(QDomElement &e, dc.fromXml(e.firstChildElement(QStringLiteral("elementInformations")), QStringLiteral("elementInformation")); + //Load override properties (For now, only used when the element is a terminal) + if (m_data.m_type == ElementData::Terminale) + { + + if (auto elmt_type_list = QETXML::subChild(e, QStringLiteral("properties"), QStringLiteral("element_type")) ; + elmt_type_list.size()) + { + auto elmt_type = elmt_type_list.first(); + m_data.setTerminalType( + m_data.terminalTypeFromString( + elmt_type.attribute(QStringLiteral("terminal_type")))); + + m_data.setTerminalFunction( + m_data.terminalFunctionFromString( + elmt_type.attribute(QStringLiteral("terminal_function")))); + + m_data.setTerminalLED( + QETXML::boolFromString( + elmt_type.attribute(QStringLiteral("terminal_led")), false)); + } + } + //We must to block the update of the alignment when load the information //otherwise the pos of the text will not be the same as it was at save time. for(DynamicElementTextItem *deti : m_dynamic_text_list) @@ -955,6 +978,23 @@ QDomElement Element::toXml( element.appendChild(infos); } + //Save override properties (For now, only used when the element is a terminal) + if (m_data.m_type == ElementData::Terminale) + { + QDomElement properties = document.createElement(QStringLiteral("properties")); + QDomElement element_type = document.createElement(QStringLiteral("element_type")); + + element_type.setAttribute(QStringLiteral("terminal_type"), + m_data.terminalTypeToString(m_data.terminalType())); + element_type.setAttribute(QStringLiteral("terminal_function"), + m_data.terminalFunctionToString(m_data.terminalFunction())); + element_type.setAttribute(QStringLiteral("terminal_led"), + QETXML::boolToString(m_data.terminalLed())); + + properties.appendChild(element_type); + element.appendChild(properties); + } + //Dynamic texts QDomElement dyn_text = document.createElement(QStringLiteral("dynamic_texts")); for (DynamicElementTextItem *deti : m_dynamic_text_list) diff --git a/sources/qetxml.cpp b/sources/qetxml.cpp index 42df0846d..ec667fe3a 100644 --- a/sources/qetxml.cpp +++ b/sources/qetxml.cpp @@ -584,6 +584,50 @@ QVector QETXML::findInDomElement(const QDomElement &dom_elmt, const namespace QETXML { +/** + * @brief boolToString + * @param value + * @return \p value converted to string + */ +QString boolToString(bool value) +{ + return value ? QStringLiteral("true") : + QStringLiteral("false"); +} + +/** + * @brief boolFromString return \p value converted to bool + * @param value : value to convert + * @param default_value : default value + * @param conv_ok : true if \p value is successfully converted + * @return + */ +bool boolFromString(const QString &value, bool default_value, bool *conv_ok) +{ + if (value == QStringLiteral("true") || + value == QStringLiteral("1")) { + if (conv_ok) { + *conv_ok = true; + } + return true; + } + + if (value == QStringLiteral("false") || + value == QStringLiteral("0")) { + if (conv_ok) { + *conv_ok = true; + } + return false; + } + + if(conv_ok) { + *conv_ok = false; + } + return default_value; +} + + + PropertyFlags debugReadXml(PropertyFlags flag, const QDomElement &e, const QString& attribute_name, const QString& attr, const QString& type) { if (flag == QETXML::PropertyFlags::NoValidConversion) @@ -873,7 +917,7 @@ bool validXmlProperty(const QDomElement& e) { if (!e.hasAttribute("value")) return false; - return true; + return true; } } diff --git a/sources/qetxml.h b/sources/qetxml.h index 6c84c74e9..8c60b1a27 100644 --- a/sources/qetxml.h +++ b/sources/qetxml.h @@ -89,6 +89,10 @@ namespace QETXML QVector findInDomElement(const QDomElement &dom_elmt, const QString &tag_name); + QString boolToString(bool value); + bool boolFromString(const QString &value, + bool default_value = true, + bool *conv_ok = nullptr); const QString integerS = "int"; const QString doubleS = "double";