From 4dd2dc259f69317552bb98f6da0fe5bf59161fe0 Mon Sep 17 00:00:00 2001 From: joshua Date: Mon, 23 Aug 2021 20:44:53 +0200 Subject: [PATCH] Code refactoring --- sources/TerminalStrip/terminalstrip.cpp | 81 ++++++------ sources/TerminalStrip/terminalstrip.h | 20 ++- .../TerminalStrip/ui/terminalstripeditor.cpp | 14 +- .../TerminalStrip/ui/terminalstripmodel.cpp | 122 ++++++++++++------ sources/TerminalStrip/ui/terminalstripmodel.h | 7 +- 5 files changed, 156 insertions(+), 88 deletions(-) diff --git a/sources/TerminalStrip/terminalstrip.cpp b/sources/TerminalStrip/terminalstrip.cpp index 7d9a80076..945f236be 100644 --- a/sources/TerminalStrip/terminalstrip.cpp +++ b/sources/TerminalStrip/terminalstrip.cpp @@ -468,16 +468,6 @@ int TerminalStrip::physicalTerminalCount() const { return m_physical_terminals.size(); } -/** - * @brief TerminalStrip::realTerminalCount - * @return the number of real terminal. - * A real terminal is a part of a physical terminal. - */ -int TerminalStrip::realTerminalCount() const -{ - return m_real_terminals.size(); -} - TerminalStripIndex TerminalStrip::index(int index) { TerminalStripIndex tsi_; @@ -500,6 +490,29 @@ TerminalStripIndex TerminalStrip::index(int index) return tsi_; } +/** + * @brief TerminalStrip::physicalTerminalData + * @param index + * @return The data of the physical terminal at index \p index + */ +PhysicalTerminalData TerminalStrip::physicalTerminalData(int index) +{ + PhysicalTerminalData ptd; + + if (index < m_physical_terminals.size()) + { + auto physical_terminal = m_physical_terminals.at(index); + ptd.physical_terminal = physical_terminal; + ptd.pos_ = index; + for (auto real_terminal : physical_terminal->terminals()) { + auto rtd = realTerminalData(real_terminal); + ptd.real_terminals_vector.append(rtd); + } + } + + return ptd; +} + /** * @brief TerminalStrip::terminalElement * @return A vector of all terminal element owned by this strip @@ -582,33 +595,6 @@ bool TerminalStrip::fromXml(QDomElement &xml_element) return true; } -RealTerminalData TerminalStrip::realTerminalData(int real_terminal_index) -{ - RealTerminalData rtd; - if (m_real_terminals.isEmpty() || - real_terminal_index >= m_real_terminals.size()) { - return rtd; - } - - auto real_terminal = m_real_terminals.at(real_terminal_index); - auto physical_terminal = physicalTerminal(real_terminal); - - rtd.m_real_terminal = m_real_terminals.at(real_terminal_index); - rtd.pos_ = m_physical_terminals.indexOf(physical_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.type_ = real_terminal->type(); - rtd.function_ = real_terminal->function(); - rtd.led_ = real_terminal->led(); - rtd.is_element = real_terminal->isElement(); - - return rtd; -} - /** * @brief TerminalStrip::realTerminal * @param terminal @@ -659,6 +645,27 @@ Element *TerminalStrip::elementForRealTerminal(QSharedPointer rt) return rt.data()->element(); } +RealTerminalData TerminalStrip::realTerminalData(QSharedPointer real_terminal) +{ + RealTerminalData rtd; + + 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.type_ = real_terminal->type(); + rtd.function_ = real_terminal->function(); + rtd.led_ = real_terminal->led(); + rtd.is_element = real_terminal->isElement(); + + return rtd; +} + /************************************************************************************/ /************************************************************************************/ /************************************************************************************/ diff --git a/sources/TerminalStrip/terminalstrip.h b/sources/TerminalStrip/terminalstrip.h index 175a3c4f3..94e55de8b 100644 --- a/sources/TerminalStrip/terminalstrip.h +++ b/sources/TerminalStrip/terminalstrip.h @@ -31,12 +31,12 @@ class TerminalStripIndex; class TerminalElement; + struct RealTerminalData { QSharedPointer m_real_terminal; - int pos_ = 0, - level_ = 0; + int level_ = 0; QString label_, Xref_, @@ -49,6 +49,14 @@ struct RealTerminalData bool led_ = false, is_element = false; + +}; + +struct PhysicalTerminalData +{ + QVector real_terminals_vector; + int pos_ = -1; + QSharedPointer physical_terminal; }; /** @@ -91,9 +99,9 @@ class TerminalStrip : public QObject bool haveTerminal (Element *terminal); int physicalTerminalCount() const; - int realTerminalCount() const; TerminalStripIndex index(int index = 0); - RealTerminalData realTerminalData(int real_terminal_index); + + PhysicalTerminalData physicalTerminalData(int index); QVector> terminalElement() const; @@ -101,10 +109,12 @@ class TerminalStrip : public QObject QDomElement toXml(QDomDocument &parent_document); bool fromXml(QDomElement &xml_element); + Element *elementForRealTerminal(QSharedPointer rt) const; + private: QSharedPointer realTerminal(Element *terminal); QSharedPointer physicalTerminal(QSharedPointer terminal); - Element *elementForRealTerminal(QSharedPointer rt) const; + RealTerminalData realTerminalData(QSharedPointer real_terminal); private: TerminalStripData m_data; diff --git a/sources/TerminalStrip/ui/terminalstripeditor.cpp b/sources/TerminalStrip/ui/terminalstripeditor.cpp index a1a67f2ad..11e6e4756 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditor.cpp @@ -434,9 +434,17 @@ void TerminalStripEditor::on_m_dialog_button_box_clicked(QAbstractButton *button if (m_model) { - auto modified_data = m_model->editedTerminalsData(); - for (auto elmt : modified_data.keys()) { - m_project->undoStack()->push(new ChangeElementDataCommand(elmt, modified_data.value(elmt))); + for (auto modified_data : m_model->modifiedRealTerminalData()) + { + auto element = m_current_strip->elementForRealTerminal(modified_data.m_real_terminal); + if (element) { + auto current_data = element->elementData(); + current_data.setTerminalType(modified_data.type_); + current_data.setTerminalFunction(modified_data.function_); + current_data.setTerminalLED(modified_data.led_); + + m_project->undoStack()->push(new ChangeElementDataCommand(element, current_data)); + } } } diff --git a/sources/TerminalStrip/ui/terminalstripmodel.cpp b/sources/TerminalStrip/ui/terminalstripmodel.cpp index a1a6bea99..939325ab8 100644 --- a/sources/TerminalStrip/ui/terminalstripmodel.cpp +++ b/sources/TerminalStrip/ui/terminalstripmodel.cpp @@ -42,6 +42,7 @@ const int ROW_COUNT = 9; static QVector UNMODIFIED_CELL_VECTOR{false, false, false, false, false, false, false, false, false, false}; + /** * @brief TerminalStripModel::TerminalStripModel * @param terminal_strip @@ -62,7 +63,12 @@ int TerminalStripModel::rowCount(const QModelIndex &parent) const return 0; } - return m_terminal_strip->realTerminalCount(); + auto count = 0; + for (const auto &ptd : m_physical_terminal_data) { + count += ptd.real_terminals_vector.size(); + } + + return count; } int TerminalStripModel::columnCount(const QModelIndex &parent) const @@ -73,17 +79,17 @@ int TerminalStripModel::columnCount(const QModelIndex &parent) const QVariant TerminalStripModel::data(const QModelIndex &index, int role) const { - if (index.row() >= m_real_terminal_data.size()) { + if (index.row() >= rowCount(QModelIndex())) { return QVariant(); } - auto rtd = m_real_terminal_data.at(index.row()); + const auto rtd = dataAtRow(index.row()); if (role == Qt::DisplayRole) { switch (index.column()) { - case POS_CELL : return rtd.pos_; + case POS_CELL : return index.row(); case LEVEL_CELL : return rtd.level_; case LABEL_CELL : return rtd.label_; case XREF_CELL : return rtd.Xref_; @@ -122,7 +128,7 @@ QVariant TerminalStripModel::data(const QModelIndex &index, int role) const bool TerminalStripModel::setData(const QModelIndex &index, const QVariant &value, int role) { - auto rtd = m_real_terminal_data.at(index.row()); + auto rtd = dataAtRow(index.row()); bool modified_ = false; int modified_cell = -1; auto column_ = index.column(); @@ -152,7 +158,7 @@ bool TerminalStripModel::setData(const QModelIndex &index, const QVariant &value //Set the modification to the terminal data if (modified_) { - m_real_terminal_data.replace(index.row(), rtd); + replaceDataAtRow(rtd, index.row()); if (rtd.m_real_terminal) { @@ -211,32 +217,24 @@ Qt::ItemFlags TerminalStripModel::flags(const QModelIndex &index) const } /** - * @brief TerminalStripModel::editedTerminals - * @return a hash with for keys the edited element and for value the ElementData with modified properties + * @brief TerminalStripModel::modifiedRealTerminalData + * @return the modified real terminal data */ -QHash TerminalStripModel::editedTerminalsData() const +QVector TerminalStripModel::modifiedRealTerminalData() const { - QHash returned_hash; - - QVector rtd_vector = m_real_terminal_data; + QVector returned_vector; const auto modified_real_terminal = m_modified_cell.keys(); - for (auto const &rt : modified_real_terminal) //loop over modified real terminal - { - for (auto const &rtd : rtd_vector) //loop over real terminal data to retrieve the data associated with real terminal - { - if (rtd.m_real_terminal == rt) - { - auto element = m_terminal_strip->elementForRealTerminal(rt); - if (element) { - returned_hash.insert(element, modifiedData(element->elementData(), rtd)); - } - break; + + 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)) { + returned_vector.append(rtd); } } } - return returned_hash; + return returned_vector; } /** @@ -252,9 +250,9 @@ bool TerminalStripModel::isXrefCell(const QModelIndex &index, Element **element) { if (index.column() == XREF_CELL) { - if (index.row() < m_real_terminal_data.size()) + if (index.row() < rowCount()) { - auto data = m_real_terminal_data.at(index.row()); + const auto data = dataAtRow(index.row()); *element = m_terminal_strip->elementForRealTerminal(data.m_real_terminal); } @@ -267,28 +265,72 @@ bool TerminalStripModel::isXrefCell(const QModelIndex &index, Element **element) void TerminalStripModel::fillRealTerminalData() { + //Get all physical terminal if (m_terminal_strip) { - for (int i=0 ; i < m_terminal_strip->realTerminalCount() ; ++i) { - m_real_terminal_data.append(m_terminal_strip->realTerminalData(i)); + for (auto i=0 ; i < m_terminal_strip->physicalTerminalCount() ; ++i) { + m_physical_terminal_data.append(m_terminal_strip->physicalTerminalData(i)); } } } -/** - * @brief TerminalStripModel::modifiedData - * @param previous_data - * @param edited_data - * @return an ElementData with the change made in \p edited_data applied to \p original_data - */ -ElementData TerminalStripModel::modifiedData(const ElementData &original_data, const RealTerminalData &edited_data) +RealTerminalData TerminalStripModel::dataAtRow(int row) const { - ElementData returned_data = original_data; + if (row > rowCount(QModelIndex())) { + return RealTerminalData(); + } + else + { + auto current_row = 0; + for (const auto &physical_data : m_physical_terminal_data) + { + for (const auto &real_data : physical_data.real_terminals_vector) + { + if (current_row == row) { + return real_data; + } else { + ++current_row; + } + } + } + } - returned_data.setTerminalType(edited_data.type_); - returned_data.setTerminalFunction(edited_data.function_); - returned_data.setTerminalLED(edited_data.led_); + return RealTerminalData(); +} - return returned_data; +/** + * @brief TerminalStripModel::replaceDataAtRow + * Replace the data at row \p row by \p data + * @param data + * @param row + */ +void TerminalStripModel::replaceDataAtRow(RealTerminalData data, int row) +{ + if (row > rowCount(QModelIndex())) { + return; + } + else + { + auto current_row = 0; + auto current_physical = 0; + + for (const auto &physical_data : qAsConst(m_physical_terminal_data)) + { + auto current_real = 0; + for (int i=0 ; i editedTerminalsData() const; + QVector modifiedRealTerminalData() const; bool isXrefCell(const QModelIndex &index, Element **element = nullptr); private: void fillRealTerminalData(); - static ElementData modifiedData(const ElementData &original_data, const RealTerminalData &edited_data); + RealTerminalData dataAtRow(int row) const; + void replaceDataAtRow(RealTerminalData data, int row); private: QPointer m_terminal_strip; - QVector m_real_terminal_data; + QVector m_physical_terminal_data; QHash, QVector> m_modified_cell; };