Code refactoring

This commit is contained in:
joshua
2021-08-23 20:44:53 +02:00
parent 80601a415a
commit 4dd2dc259f
5 changed files with 156 additions and 88 deletions

View File

@@ -468,16 +468,6 @@ int TerminalStrip::physicalTerminalCount() const {
return m_physical_terminals.size(); 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 TerminalStrip::index(int index)
{ {
TerminalStripIndex tsi_; TerminalStripIndex tsi_;
@@ -500,6 +490,29 @@ TerminalStripIndex TerminalStrip::index(int index)
return tsi_; 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 * @brief TerminalStrip::terminalElement
* @return A vector of all terminal element owned by this strip * @return A vector of all terminal element owned by this strip
@@ -582,33 +595,6 @@ bool TerminalStrip::fromXml(QDomElement &xml_element)
return true; 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 * @brief TerminalStrip::realTerminal
* @param terminal * @param terminal
@@ -659,6 +645,27 @@ Element *TerminalStrip::elementForRealTerminal(QSharedPointer<RealTerminal> rt)
return rt.data()->element(); return rt.data()->element();
} }
RealTerminalData TerminalStrip::realTerminalData(QSharedPointer<RealTerminal> 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;
}
/************************************************************************************/ /************************************************************************************/
/************************************************************************************/ /************************************************************************************/
/************************************************************************************/ /************************************************************************************/

View File

@@ -31,12 +31,12 @@ class TerminalStripIndex;
class TerminalElement; class TerminalElement;
struct RealTerminalData struct RealTerminalData
{ {
QSharedPointer<RealTerminal> m_real_terminal; QSharedPointer<RealTerminal> m_real_terminal;
int pos_ = 0, int level_ = 0;
level_ = 0;
QString label_, QString label_,
Xref_, Xref_,
@@ -49,6 +49,14 @@ struct RealTerminalData
bool led_ = false, bool led_ = false,
is_element = false; is_element = false;
};
struct PhysicalTerminalData
{
QVector<RealTerminalData> real_terminals_vector;
int pos_ = -1;
QSharedPointer<PhysicalTerminal> physical_terminal;
}; };
/** /**
@@ -91,9 +99,9 @@ class TerminalStrip : public QObject
bool haveTerminal (Element *terminal); bool haveTerminal (Element *terminal);
int physicalTerminalCount() const; int physicalTerminalCount() const;
int realTerminalCount() const;
TerminalStripIndex index(int index = 0); TerminalStripIndex index(int index = 0);
RealTerminalData realTerminalData(int real_terminal_index);
PhysicalTerminalData physicalTerminalData(int index);
QVector<QPointer<Element>> terminalElement() const; QVector<QPointer<Element>> terminalElement() const;
@@ -101,10 +109,12 @@ class TerminalStrip : public QObject
QDomElement toXml(QDomDocument &parent_document); QDomElement toXml(QDomDocument &parent_document);
bool fromXml(QDomElement &xml_element); bool fromXml(QDomElement &xml_element);
Element *elementForRealTerminal(QSharedPointer<RealTerminal> rt) const;
private: private:
QSharedPointer<RealTerminal> realTerminal(Element *terminal); QSharedPointer<RealTerminal> realTerminal(Element *terminal);
QSharedPointer<PhysicalTerminal> physicalTerminal(QSharedPointer<RealTerminal> terminal); QSharedPointer<PhysicalTerminal> physicalTerminal(QSharedPointer<RealTerminal> terminal);
Element *elementForRealTerminal(QSharedPointer<RealTerminal> rt) const; RealTerminalData realTerminalData(QSharedPointer<RealTerminal> real_terminal);
private: private:
TerminalStripData m_data; TerminalStripData m_data;

View File

@@ -434,9 +434,17 @@ void TerminalStripEditor::on_m_dialog_button_box_clicked(QAbstractButton *button
if (m_model) if (m_model)
{ {
auto modified_data = m_model->editedTerminalsData(); for (auto modified_data : m_model->modifiedRealTerminalData())
for (auto elmt : modified_data.keys()) { {
m_project->undoStack()->push(new ChangeElementDataCommand(elmt, modified_data.value(elmt))); 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));
}
} }
} }

View File

@@ -42,6 +42,7 @@ const int ROW_COUNT = 9;
static QVector<bool> UNMODIFIED_CELL_VECTOR{false, false, false, false, false, false, false, false, false, false}; static QVector<bool> UNMODIFIED_CELL_VECTOR{false, false, false, false, false, false, false, false, false, false};
/** /**
* @brief TerminalStripModel::TerminalStripModel * @brief TerminalStripModel::TerminalStripModel
* @param terminal_strip * @param terminal_strip
@@ -62,7 +63,12 @@ int TerminalStripModel::rowCount(const QModelIndex &parent) const
return 0; 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 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 QVariant TerminalStripModel::data(const QModelIndex &index, int role) const
{ {
if (index.row() >= m_real_terminal_data.size()) { if (index.row() >= rowCount(QModelIndex())) {
return QVariant(); return QVariant();
} }
auto rtd = m_real_terminal_data.at(index.row()); const auto rtd = dataAtRow(index.row());
if (role == Qt::DisplayRole) if (role == Qt::DisplayRole)
{ {
switch (index.column()) { switch (index.column()) {
case POS_CELL : return rtd.pos_; case POS_CELL : return index.row();
case LEVEL_CELL : return rtd.level_; case LEVEL_CELL : return rtd.level_;
case LABEL_CELL : return rtd.label_; case LABEL_CELL : return rtd.label_;
case XREF_CELL : return rtd.Xref_; 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) 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; bool modified_ = false;
int modified_cell = -1; int modified_cell = -1;
auto column_ = index.column(); auto column_ = index.column();
@@ -152,7 +158,7 @@ bool TerminalStripModel::setData(const QModelIndex &index, const QVariant &value
//Set the modification to the terminal data //Set the modification to the terminal data
if (modified_) if (modified_)
{ {
m_real_terminal_data.replace(index.row(), rtd); replaceDataAtRow(rtd, index.row());
if (rtd.m_real_terminal) if (rtd.m_real_terminal)
{ {
@@ -211,32 +217,24 @@ Qt::ItemFlags TerminalStripModel::flags(const QModelIndex &index) const
} }
/** /**
* @brief TerminalStripModel::editedTerminals * @brief TerminalStripModel::modifiedRealTerminalData
* @return a hash with for keys the edited element and for value the ElementData with modified properties * @return the modified real terminal data
*/ */
QHash<Element *, ElementData> TerminalStripModel::editedTerminalsData() const QVector<RealTerminalData> TerminalStripModel::modifiedRealTerminalData() const
{ {
QHash<Element *, ElementData> returned_hash; QVector<RealTerminalData> returned_vector;
QVector<RealTerminalData> rtd_vector = m_real_terminal_data;
const auto modified_real_terminal = m_modified_cell.keys(); const auto modified_real_terminal = m_modified_cell.keys();
for (auto const &rt : modified_real_terminal) //loop over modified real terminal
{ for (const auto &ptd : m_physical_terminal_data) {
for (auto const &rtd : rtd_vector) //loop over real terminal data to retrieve the data associated with real terminal for (const auto &rtd : ptd.real_terminals_vector) {
{ if (modified_real_terminal.contains(rtd.m_real_terminal)) {
if (rtd.m_real_terminal == rt) returned_vector.append(rtd);
{
auto element = m_terminal_strip->elementForRealTerminal(rt);
if (element) {
returned_hash.insert(element, modifiedData(element->elementData(), rtd));
}
break;
} }
} }
} }
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.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); *element = m_terminal_strip->elementForRealTerminal(data.m_real_terminal);
} }
@@ -267,28 +265,72 @@ bool TerminalStripModel::isXrefCell(const QModelIndex &index, Element **element)
void TerminalStripModel::fillRealTerminalData() void TerminalStripModel::fillRealTerminalData()
{ {
//Get all physical terminal
if (m_terminal_strip) { if (m_terminal_strip) {
for (int i=0 ; i < m_terminal_strip->realTerminalCount() ; ++i) { for (auto i=0 ; i < m_terminal_strip->physicalTerminalCount() ; ++i) {
m_real_terminal_data.append(m_terminal_strip->realTerminalData(i)); m_physical_terminal_data.append(m_terminal_strip->physicalTerminalData(i));
} }
} }
} }
RealTerminalData TerminalStripModel::dataAtRow(int row) const
{
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;
}
}
}
}
return RealTerminalData();
}
/** /**
* @brief TerminalStripModel::modifiedData * @brief TerminalStripModel::replaceDataAtRow
* @param previous_data * Replace the data at row \p row by \p data
* @param edited_data * @param data
* @return an ElementData with the change made in \p edited_data applied to \p original_data * @param row
*/ */
ElementData TerminalStripModel::modifiedData(const ElementData &original_data, const RealTerminalData &edited_data) void TerminalStripModel::replaceDataAtRow(RealTerminalData data, int row)
{ {
ElementData returned_data = original_data; if (row > rowCount(QModelIndex())) {
return;
}
else
{
auto current_row = 0;
auto current_physical = 0;
returned_data.setTerminalType(edited_data.type_); for (const auto &physical_data : qAsConst(m_physical_terminal_data))
returned_data.setTerminalFunction(edited_data.function_); {
returned_data.setTerminalLED(edited_data.led_); auto current_real = 0;
for (int i=0 ; i<physical_data.real_terminals_vector.count() ; ++i)
return returned_data; {
if (current_row == row) {
auto physical_data = m_physical_terminal_data.at(current_physical);
physical_data.real_terminals_vector.replace(current_real, data);
m_physical_terminal_data.replace(current_physical, physical_data);
return;
} else {
++current_real;
++current_row;
}
}
++current_physical;
}
}
} }
/*********************************************************** /***********************************************************

View File

@@ -40,17 +40,18 @@ class TerminalStripModel : public QAbstractTableModel
virtual QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; virtual QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
virtual Qt::ItemFlags flags (const QModelIndex &index) const override; virtual Qt::ItemFlags flags (const QModelIndex &index) const override;
QHash<Element *, ElementData> editedTerminalsData() const; QVector<RealTerminalData> modifiedRealTerminalData() const;
bool isXrefCell(const QModelIndex &index, Element **element = nullptr); bool isXrefCell(const QModelIndex &index, Element **element = nullptr);
private: private:
void fillRealTerminalData(); 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: private:
QPointer<TerminalStrip> m_terminal_strip; QPointer<TerminalStrip> m_terminal_strip;
QVector<RealTerminalData> m_real_terminal_data; QVector<PhysicalTerminalData> m_physical_terminal_data;
QHash<QSharedPointer<RealTerminal>, QVector<bool>> m_modified_cell; QHash<QSharedPointer<RealTerminal>, QVector<bool>> m_modified_cell;
}; };