Level terminals can be disassembled

This commit is contained in:
joshua
2021-10-04 21:26:51 +02:00
parent dca643f7aa
commit 828424cae8
7 changed files with 149 additions and 11 deletions

View File

@@ -49,6 +49,7 @@ TerminalStripEditor::TerminalStripEditor(QETProject *project, QWidget *parent) :
ui->m_table_widget->setItemDelegate(new TerminalStripModelDelegate(ui->m_terminal_strip_tw));
ui->m_remove_terminal_strip_pb->setDisabled(true);
ui->m_group_terminals_pb->setDisabled(true);
ui->m_ungroup_pb->setDisabled(true);
buildTree();
ui->m_terminal_strip_tw->expandRecursively(ui->m_terminal_strip_tw->rootIndex());
setUpUndoConnections();
@@ -348,10 +349,24 @@ void TerminalStripEditor::selectionChanged()
return;
}
auto index_list = ui->m_table_widget->selectionModel()->selectedIndexes();
auto terminal_vector = m_model->terminalsForIndex(index_list);
const auto index_list = ui->m_table_widget->selectionModel()->selectedIndexes();
const auto terminal_vector = m_model->physicalTerminalDataForIndex(index_list);
ui->m_group_terminals_pb->setEnabled(terminal_vector.size() > 1 ? true : false);
auto it_= std::find_if(terminal_vector.constBegin(), terminal_vector.constEnd(), [](auto &data)
{
if (data.real_terminals_vector.size() >= 2) {
return true;
} else {
return false;
}
});
ui->m_ungroup_pb->setDisabled(it_ == terminal_vector.constEnd());
}
/**
@@ -523,12 +538,24 @@ void TerminalStripEditor::on_m_group_terminals_pb_clicked()
{
if (m_model && m_current_strip)
{
auto ptd_vector = m_model->terminalsForIndex(ui->m_table_widget->selectionModel()->selectedIndexes());
auto ptd_vector = m_model->physicalTerminalDataForIndex(ui->m_table_widget->selectionModel()->selectedIndexes());
if (ptd_vector.size() >= 2)
{
auto receiver_ = ptd_vector.takeFirst();
m_current_strip->groupTerminal(receiver_, ptd_vector);
m_current_strip->groupTerminals(receiver_, ptd_vector);
}
}
}
/**
* @brief TerminalStripEditor::on_m_ungroup_pb_clicked
*/
void TerminalStripEditor::on_m_ungroup_pb_clicked()
{
if (m_model && m_current_strip)
{
const auto rtd_vector = m_model->realTerminalDataForIndex(ui->m_table_widget->selectionModel()->selectedIndexes());
m_current_strip->unGroupTerminals(rtd_vector);
}
}

View File

@@ -62,6 +62,8 @@ class TerminalStripEditor : public QDialog
void on_m_auto_ordering_pb_clicked();
void on_m_group_terminals_pb_clicked();
void on_m_ungroup_pb_clicked();
private:
Ui::TerminalStripEditor *ui;
QETProject *m_project = nullptr;

View File

@@ -178,7 +178,7 @@
<item row="1" column="1">
<widget class="QWidget" name="widget" native="true">
<layout class="QGridLayout" name="gridLayout_3">
<item row="2" column="0">
<item row="3" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -205,6 +205,13 @@
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="m_ungroup_pb">
<property name="text">
<string>Degrouper les bornes</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>

View File

@@ -276,7 +276,7 @@ bool TerminalStripModel::isXrefCell(const QModelIndex &index, Element **element)
* @return A vector of PhysicalTerminalData represented by index_list.
* If sereval index point to the same terminal the vector have only one PhysicalTerminalData
*/
QVector<PhysicalTerminalData> TerminalStripModel::terminalsForIndex(QModelIndexList index_list) const
QVector<PhysicalTerminalData> TerminalStripModel::physicalTerminalDataForIndex(QModelIndexList index_list) const
{
QVector<PhysicalTerminalData> vector_;
if (index_list.isEmpty()) {
@@ -299,6 +299,36 @@ QVector<PhysicalTerminalData> TerminalStripModel::terminalsForIndex(QModelIndexL
return vector_;
}
/**
* @brief TerminalStripModel::realTerminalDataForIndex
* @param index_list
* @return
*/
QVector<RealTerminalData> TerminalStripModel::realTerminalDataForIndex(QModelIndexList index_list) const
{
QVector<RealTerminalData> vector_;
if (index_list.isEmpty()) {
return vector_;
}
QSet<int> set_;
//We use a QSet to avoid insert several time the same terminal.
for (auto index : index_list) {
if (index.isValid()) {
set_.insert(index.row());
}
}
for (auto i : set_) {
const auto rtd_ = realDataAtIndex(i);
if (rtd_.level_ > -1) {
vector_.append(realDataAtIndex(i));
}
}
return vector_;
}
void TerminalStripModel::fillRealTerminalData()
{
//Get all physical terminal
@@ -406,6 +436,32 @@ PhysicalTerminalData TerminalStripModel::physicalDataAtIndex(int index) const
}
}
/**
* @brief TerminalStripModel::realDataAtIndex
* @param index
* @return the realTerminalData at index \p index.
*/
RealTerminalData TerminalStripModel::realDataAtIndex(int index) const
{
if (m_physical_terminal_data.isEmpty()) {
return RealTerminalData();
}
int current_checked_index = -1;
for (const auto & ptd_ : qAsConst(m_physical_terminal_data))
{
for (const auto & rtd_ : qAsConst(ptd_.real_terminals_vector)) {
++current_checked_index;
if (current_checked_index == index) {
return rtd_;
}
}
}
return RealTerminalData();
}
/***********************************************************
* Alittle delegate for add a combobox to edit type
* and a spinbox to edit the level of a terminal

View File

@@ -43,13 +43,15 @@ class TerminalStripModel : public QAbstractTableModel
QVector<RealTerminalData> modifiedRealTerminalData() const;
bool isXrefCell(const QModelIndex &index, Element **element = nullptr);
QVector<PhysicalTerminalData> terminalsForIndex(QModelIndexList index_list) const;
QVector<PhysicalTerminalData> physicalTerminalDataForIndex(QModelIndexList index_list) const;
QVector<RealTerminalData> realTerminalDataForIndex(QModelIndexList index_list) const;
private:
void fillRealTerminalData();
RealTerminalData dataAtRow(int row) const;
void replaceDataAtRow(RealTerminalData data, int row);
PhysicalTerminalData physicalDataAtIndex(int index) const;
RealTerminalData realDataAtIndex(int index) const;
private:
QPointer<TerminalStrip> m_terminal_strip;