mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-19 14:50:53 +01:00
Add a push button to automatically reorder the terminal strip
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
Copyright 2006-2021 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
QElectroTech is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
QElectroTech is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "sortterminalstripcommand.h"
|
||||
#include "../terminalstrip.h"
|
||||
|
||||
SortTerminalStripCommand::SortTerminalStripCommand(TerminalStrip *strip, QUndoCommand *parent) :
|
||||
QUndoCommand(parent),
|
||||
m_strip(strip)
|
||||
{
|
||||
setText(QObject::tr("Trier le bornier %1").arg(m_strip->name()));
|
||||
m_old_order = m_new_order = m_strip->physicalTerminalData();
|
||||
sort();
|
||||
}
|
||||
|
||||
void SortTerminalStripCommand::undo()
|
||||
{
|
||||
if (m_strip) {
|
||||
m_strip->setOrderTo(m_old_order);
|
||||
}
|
||||
}
|
||||
|
||||
void SortTerminalStripCommand::redo()
|
||||
{
|
||||
if (m_strip) {
|
||||
m_strip->setOrderTo(m_new_order);
|
||||
}
|
||||
}
|
||||
|
||||
void SortTerminalStripCommand::sort()
|
||||
{
|
||||
std::sort(m_new_order.begin(), m_new_order.end(), [](PhysicalTerminalData arg1, PhysicalTerminalData arg2)
|
||||
{
|
||||
QRegularExpression rx(QStringLiteral("^\\d+"));
|
||||
|
||||
QString str1;
|
||||
QString str2;
|
||||
int int1 =-1;
|
||||
int int2 =-1;
|
||||
|
||||
if (arg1.real_terminals_vector.count())
|
||||
{
|
||||
str1 = arg1.real_terminals_vector.first().label_;
|
||||
|
||||
auto match = rx.match(str1);
|
||||
if (match.hasMatch()) {
|
||||
int1 = match.captured(0).toInt();
|
||||
}
|
||||
}
|
||||
|
||||
if (arg2.real_terminals_vector.count())
|
||||
{
|
||||
str2 = arg2.real_terminals_vector.first().label_;
|
||||
|
||||
auto match = rx.match(str2);
|
||||
if (match.hasMatch()) {
|
||||
int2 = match.captured(0).toInt();
|
||||
}
|
||||
}
|
||||
|
||||
//Sort as numbers if both string
|
||||
//start at least by a digit and
|
||||
//the number of each string are different.
|
||||
//Else sort as string
|
||||
if (int1 >= 0 &&
|
||||
int2 >= 0 &&
|
||||
int1 != int2) {
|
||||
return int1<int2;
|
||||
}
|
||||
else {
|
||||
return str1<str2;
|
||||
}
|
||||
});
|
||||
}
|
||||
49
sources/TerminalStrip/UndoCommand/sortterminalstripcommand.h
Normal file
49
sources/TerminalStrip/UndoCommand/sortterminalstripcommand.h
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
Copyright 2006-2021 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
QElectroTech is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
QElectroTech is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef SORTTERMINALSTRIPCOMMAND_H
|
||||
#define SORTTERMINALSTRIPCOMMAND_H
|
||||
|
||||
#include <QUndoCommand>
|
||||
#include <QPointer>
|
||||
|
||||
class TerminalStrip;
|
||||
struct PhysicalTerminalData;
|
||||
|
||||
/**
|
||||
* @brief The SortTerminalStripCommand class
|
||||
* An undo command use to sort the terminals element who
|
||||
* compose a terminal strip
|
||||
*/
|
||||
class SortTerminalStripCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
SortTerminalStripCommand(TerminalStrip *strip, QUndoCommand *parent = nullptr);
|
||||
|
||||
void undo() override;
|
||||
void redo() override;
|
||||
|
||||
private:
|
||||
void sort();
|
||||
|
||||
private:
|
||||
QPointer<TerminalStrip> m_strip;
|
||||
QVector<PhysicalTerminalData> m_old_order,
|
||||
m_new_order;
|
||||
};
|
||||
|
||||
#endif // SORTTERMINALSTRIPCOMMAND_H
|
||||
@@ -473,7 +473,7 @@ int TerminalStrip::physicalTerminalCount() const {
|
||||
* @param index
|
||||
* @return The data of the physical terminal at index \p index
|
||||
*/
|
||||
PhysicalTerminalData TerminalStrip::physicalTerminalData(int index)
|
||||
PhysicalTerminalData TerminalStrip::physicalTerminalData(int index) const
|
||||
{
|
||||
PhysicalTerminalData ptd;
|
||||
|
||||
@@ -491,6 +491,56 @@ PhysicalTerminalData TerminalStrip::physicalTerminalData(int index)
|
||||
return ptd;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief TerminalStrip::physicalTerminalData
|
||||
* @return A vector of all physical terminal data owned by this terminal strip.
|
||||
* The order of the vector is the same as the order of the terminal in the strip
|
||||
*/
|
||||
QVector<PhysicalTerminalData> TerminalStrip::physicalTerminalData() const
|
||||
{
|
||||
QVector<PhysicalTerminalData> v_;
|
||||
for (auto i = 0 ; i<physicalTerminalCount() ; ++i) {
|
||||
v_.append(physicalTerminalData(i));
|
||||
}
|
||||
|
||||
return v_;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief TerminalStrip::setSortedTo
|
||||
* Sort the physical terminal owned by this strip in the same order
|
||||
* as \p sorted_vector.
|
||||
* \p sorted_vector must contain exaclty the same physical terminal as this strip
|
||||
* else this function do nothing.
|
||||
*
|
||||
* To avoid any mistake, you should call TerminalStrip::physicalTerminalData()
|
||||
* sort the returned vector and call this function with sorted vector, then you are sure
|
||||
* the vector contain the same values, no more no less.
|
||||
*
|
||||
* @param sorted_vector
|
||||
* @return true is successfully sorted.
|
||||
*/
|
||||
bool TerminalStrip::setOrderTo(QVector<PhysicalTerminalData> sorted_vector)
|
||||
{
|
||||
if (sorted_vector.size() != m_physical_terminals.size()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
QVector<QSharedPointer<PhysicalTerminal>> new_order;
|
||||
for (auto ptd : sorted_vector)
|
||||
{
|
||||
if (m_physical_terminals.contains(ptd.physical_terminal)) {
|
||||
new_order.append(ptd.physical_terminal);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
m_physical_terminals = new_order;
|
||||
emit orderChanged();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief TerminalStrip::terminalElement
|
||||
* @return A vector of all terminal element owned by this strip
|
||||
@@ -598,7 +648,7 @@ QSharedPointer<RealTerminal> TerminalStrip::realTerminal(Element *terminal)
|
||||
* @return the physical terminal linked to \p terminal.
|
||||
* The returned QSharedPointer can be null.
|
||||
*/
|
||||
QSharedPointer<PhysicalTerminal> TerminalStrip::physicalTerminal(QSharedPointer<RealTerminal> terminal)
|
||||
QSharedPointer<PhysicalTerminal> TerminalStrip::physicalTerminal(QSharedPointer<RealTerminal> terminal) const
|
||||
{
|
||||
shared_physical_terminal pt;
|
||||
|
||||
@@ -623,7 +673,7 @@ Element *TerminalStrip::elementForRealTerminal(QSharedPointer<RealTerminal> rt)
|
||||
return rt.data()->element();
|
||||
}
|
||||
|
||||
RealTerminalData TerminalStrip::realTerminalData(QSharedPointer<RealTerminal> real_terminal)
|
||||
RealTerminalData TerminalStrip::realTerminalData(QSharedPointer<RealTerminal> real_terminal) const
|
||||
{
|
||||
RealTerminalData rtd;
|
||||
|
||||
|
||||
@@ -72,6 +72,10 @@ class TerminalStrip : public QObject
|
||||
friend class TerminalStripModel;
|
||||
|
||||
Q_OBJECT
|
||||
public:
|
||||
signals:
|
||||
void orderChanged(); //Emitted when the order of the physical terminal is changed
|
||||
|
||||
public:
|
||||
TerminalStrip(QETProject *project);
|
||||
|
||||
@@ -100,8 +104,9 @@ class TerminalStrip : public QObject
|
||||
bool haveTerminal (Element *terminal);
|
||||
|
||||
int physicalTerminalCount() const;
|
||||
|
||||
PhysicalTerminalData physicalTerminalData(int index);
|
||||
PhysicalTerminalData physicalTerminalData(int index) const;
|
||||
QVector<PhysicalTerminalData> physicalTerminalData() const;
|
||||
bool setOrderTo(QVector<PhysicalTerminalData> sorted_vector);
|
||||
|
||||
QVector<QPointer<Element>> terminalElement() const;
|
||||
|
||||
@@ -113,8 +118,8 @@ class TerminalStrip : public QObject
|
||||
|
||||
private:
|
||||
QSharedPointer<RealTerminal> realTerminal(Element *terminal);
|
||||
QSharedPointer<PhysicalTerminal> physicalTerminal(QSharedPointer<RealTerminal> terminal);
|
||||
RealTerminalData realTerminalData(QSharedPointer<RealTerminal> real_terminal);
|
||||
QSharedPointer<PhysicalTerminal> physicalTerminal(QSharedPointer<RealTerminal> terminal) const;
|
||||
RealTerminalData realTerminalData(QSharedPointer<RealTerminal> real_terminal) const;
|
||||
|
||||
private:
|
||||
TerminalStripData m_data;
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "../../qeticons.h"
|
||||
#include "terminalstripmodel.h"
|
||||
#include "../diagram.h"
|
||||
#include "../UndoCommand/sortterminalstripcommand.h"
|
||||
|
||||
#include <QTreeWidgetItem>
|
||||
|
||||
@@ -273,6 +274,10 @@ void TerminalStripEditor::setCurrentStrip(TerminalStrip *strip_)
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_current_strip) {
|
||||
disconnect(m_current_strip, &TerminalStrip::orderChanged, this, &TerminalStripEditor::on_m_reload_pb_clicked);
|
||||
}
|
||||
|
||||
if (!strip_)
|
||||
{
|
||||
ui->m_installation_le ->clear();
|
||||
@@ -302,6 +307,8 @@ void TerminalStripEditor::setCurrentStrip(TerminalStrip *strip_)
|
||||
|
||||
m_model = new TerminalStripModel(strip_, this);
|
||||
ui->m_table_widget->setModel(m_model);
|
||||
|
||||
connect(m_current_strip, &TerminalStrip::orderChanged, this, &TerminalStripEditor::on_m_reload_pb_clicked);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -456,3 +463,14 @@ void TerminalStripEditor::on_m_dialog_button_box_clicked(QAbstractButton *button
|
||||
|
||||
on_m_reload_pb_clicked();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief TerminalStripEditor::on_m_auto_pos_pb_clicked
|
||||
*/
|
||||
void TerminalStripEditor::on_m_auto_ordering_pb_clicked()
|
||||
{
|
||||
if (m_project && m_current_strip) {
|
||||
m_project->undoStack()->push(new SortTerminalStripCommand(m_current_strip));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ class TerminalStripEditor : public QDialog
|
||||
void on_m_reload_pb_clicked();
|
||||
void on_m_terminal_strip_tw_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
|
||||
void on_m_dialog_button_box_clicked(QAbstractButton *button);
|
||||
void on_m_auto_ordering_pb_clicked();
|
||||
|
||||
private:
|
||||
Ui::TerminalStripEditor *ui;
|
||||
|
||||
@@ -13,72 +13,8 @@
|
||||
<property name="windowTitle">
|
||||
<string>Gestionnaire de borniers</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3" stretch="0,1">
|
||||
<item>
|
||||
<widget class="QWidget" name="widget_2" native="true">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_add_terminal_strip_pb">
|
||||
<property name="text">
|
||||
<string>Ajouter un bornier</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../qelectrotech.qrc">
|
||||
<normaloff>:/ico/16x16/list-add.png</normaloff>:/ico/16x16/list-add.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_remove_terminal_strip_pb">
|
||||
<property name="text">
|
||||
<string>Supprimer le bornier</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../qelectrotech.qrc">
|
||||
<normaloff>:/ico/16x16/list-remove.png</normaloff>:/ico/16x16/list-remove.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_reload_pb">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../qelectrotech.qrc">
|
||||
<normaloff>:/ico/16x16/view-refresh.png</normaloff>:/ico/16x16/view-refresh.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="0">
|
||||
<widget class="QSplitter" name="splitter">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
@@ -156,7 +92,7 @@
|
||||
<bool>true</bool>
|
||||
</attribute>
|
||||
<attribute name="verticalHeaderVisible">
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -239,6 +175,96 @@
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QWidget" name="widget" native="true">
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<item row="0" column="0">
|
||||
<widget class="QPushButton" name="m_auto_ordering_pb">
|
||||
<property name="text">
|
||||
<string>Position automatique</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QWidget" name="widget_2" native="true">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_add_terminal_strip_pb">
|
||||
<property name="text">
|
||||
<string>Ajouter un bornier</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../qelectrotech.qrc">
|
||||
<normaloff>:/ico/16x16/list-add.png</normaloff>:/ico/16x16/list-add.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_remove_terminal_strip_pb">
|
||||
<property name="text">
|
||||
<string>Supprimer le bornier</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../qelectrotech.qrc">
|
||||
<normaloff>:/ico/16x16/list-remove.png</normaloff>:/ico/16x16/list-remove.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_reload_pb">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../qelectrotech.qrc">
|
||||
<normaloff>:/ico/16x16/view-refresh.png</normaloff>:/ico/16x16/view-refresh.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
|
||||
Reference in New Issue
Block a user