mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-23 10:30:53 +01:00
Code refactoring
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
/************************************************************************************/
|
/************************************************************************************/
|
||||||
/************************************************************************************/
|
/************************************************************************************/
|
||||||
/************************************************************************************/
|
/************************************************************************************/
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
* @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)
|
|
||||||
{
|
{
|
||||||
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_);
|
return RealTerminalData();
|
||||||
returned_data.setTerminalFunction(edited_data.function_);
|
}
|
||||||
returned_data.setTerminalLED(edited_data.led_);
|
|
||||||
|
|
||||||
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<physical_data.real_terminals_vector.count() ; ++i)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************
|
/***********************************************************
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user