Merge pull request #459 from Kellermorph/makro-fix

Fix and Improve Multi-selection for Diagram Operations
This commit is contained in:
Laurent Trinques
2026-05-14 03:18:20 +02:00
committed by GitHub
8 changed files with 459 additions and 257 deletions

View File

@@ -22,6 +22,7 @@
#include "qeticons.h" #include "qeticons.h"
#include "qetproject.h" #include "qetproject.h"
#include "titleblock/templatescollection.h" #include "titleblock/templatescollection.h"
#include <QApplication>
/* /*
Lorsque le flag ENABLE_PANEL_DND_CHECKS est defini, le panel d'elements Lorsque le flag ENABLE_PANEL_DND_CHECKS est defini, le panel d'elements
@@ -42,7 +43,7 @@ ElementsPanel::ElementsPanel(QWidget *parent) :
first_reload_(true) first_reload_(true)
{ {
// selection unique // selection unique
setSelectionMode(QAbstractItemView::SingleSelection); setSelectionMode(QAbstractItemView::ExtendedSelection);
setColumnCount(1); setColumnCount(1);
setExpandsOnDoubleClick(true); setExpandsOnDoubleClick(true);
setMouseTracking(true); setMouseTracking(true);
@@ -299,11 +300,14 @@ void ElementsPanel::reload()
} }
/** /**
@brief ElementsPanel::slot_clicked * @brief ElementsPanel::slot_clicked
handle click on qtwi * handle click on qtwi
@param qtwi item that was clickerd on * @param qtwi item that was clickerd on
*/ */
void ElementsPanel::slot_clicked(QTreeWidgetItem *clickedItem, int) { void ElementsPanel::slot_clicked(QTreeWidgetItem *clickedItem, int) {
if (QApplication::keyboardModifiers() & (Qt::ShiftModifier | Qt::ControlModifier)) {
return;
}
requestForItem(clickedItem); requestForItem(clickedItem);
} }
@@ -553,3 +557,20 @@ void ElementsPanel::keyPressEvent(QKeyEvent *event)
QTreeView::keyPressEvent(event); QTreeView::keyPressEvent(event);
} }
} }
/**
* @brief ElementsPanel::selectedDiagrams
* @return A list of all currently selected diagrams in the panel.
*/
QList<Diagram *> ElementsPanel::selectedDiagrams() const
{
QList<Diagram *> diagrams;
foreach (QTreeWidgetItem *item, selectedItems()) {
if (item->type() == QET::Diagram) {
if (Diagram *diagram = valueForItem<Diagram *>(item)) {
diagrams.append(diagram);
}
}
}
return diagrams;
}

View File

@@ -49,6 +49,7 @@ class ElementsPanel : public GenericPanel {
// methods used to get what is represented by a particular visual item // methods used to get what is represented by a particular visual item
QString dirPathForItem(QTreeWidgetItem *); QString dirPathForItem(QTreeWidgetItem *);
QString filePathForItem(QTreeWidgetItem *); QString filePathForItem(QTreeWidgetItem *);
QList<Diagram *> selectedDiagrams() const;
signals: signals:
void requestForProject(QETProject *); void requestForProject(QETProject *);

View File

@@ -25,6 +25,7 @@
#include "qetproject.h" #include "qetproject.h"
#include "titleblock/templatedeleter.h" #include "titleblock/templatedeleter.h"
#include <QFileInfo> #include <QFileInfo>
#include <QMessageBox>
/* /*
When the ENABLE_PANEL_WIDGET_DND_CHECKS flag is set, the panel When the ENABLE_PANEL_WIDGET_DND_CHECKS flag is set, the panel
@@ -242,85 +243,134 @@ void ElementsPanelWidget::newDiagram()
} }
/** /**
Emet le signal requestForDiagramDeletion avec le schema selectionne * Emet le signal requestForDiagramsDeletion avec les schemas selectionnes
*/ */
void ElementsPanelWidget::deleteDiagram() void ElementsPanelWidget::deleteDiagram()
{ {
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { QList<Diagram *> diagrams_to_delete = elements_panel->selectedDiagrams();
emit(requestForDiagramDeletion(selected_diagram));
elements_panel->reload(); if (diagrams_to_delete.isEmpty()) return;
emit(requestForDiagramsDeletion(diagrams_to_delete));
elements_panel->reload();
}
/**
* Emits the requestForDiagramMoveUpTop signal with all selected diagrams.
*/
void ElementsPanelWidget::moveDiagramUpTop() {
QList<Diagram *> diagrams_to_move = elements_panel->selectedDiagrams();
if (diagrams_to_move.isEmpty()) return;
// Emit the entire list at once
emit requestForDiagramMoveUpTop(diagrams_to_move);
// Clear messy tree selection caused by moving items, then restore clean selection
elements_panel->clearSelection();
for (Diagram *d : diagrams_to_move) {
if (auto item = elements_panel->getItemForDiagram(d)) item->setSelected(true);
} }
} }
/** /**
Emet le signal requestForDiagramMoveUpTop avec le schema selectionne * Emits the requestForDiagramMoveUp signal with all selected diagrams.
+*/ */
void ElementsPanelWidget::moveDiagramUpTop() void ElementsPanelWidget::moveDiagramUp() {
{ QList<Diagram *> diagrams_to_move = elements_panel->selectedDiagrams();
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { if (diagrams_to_move.isEmpty()) return;
emit(requestForDiagramMoveUpTop(selected_diagram));
}
}
// Emit the entire list at once
emit requestForDiagramMoveUp(diagrams_to_move);
// Clear messy tree selection caused by moving items, then restore clean selection
/** elements_panel->clearSelection();
Emet le signal requestForDiagramMoveUp avec le schema selectionne for (Diagram *d : diagrams_to_move) {
*/ if (auto item = elements_panel->getItemForDiagram(d)) item->setSelected(true);
void ElementsPanelWidget::moveDiagramUp()
{
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) {
emit(requestForDiagramMoveUp(selected_diagram));
} }
} }
/** /**
Emet le signal requestForDiagramMoveDown avec le schema selectionne * Emits the requestForDiagramMoveDown signal with all selected diagrams.
*/ */
void ElementsPanelWidget::moveDiagramDown() void ElementsPanelWidget::moveDiagramDown() {
{ QList<Diagram *> diagrams_to_move = elements_panel->selectedDiagrams();
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { if (diagrams_to_move.isEmpty()) return;
emit(requestForDiagramMoveDown(selected_diagram));
// Emit the entire list at once
emit requestForDiagramMoveDown(diagrams_to_move);
// Clear messy tree selection caused by moving items, then restore clean selection
elements_panel->clearSelection();
for (Diagram *d : diagrams_to_move) {
if (auto item = elements_panel->getItemForDiagram(d)) item->setSelected(true);
} }
} }
/** /**
Emet le signal requestForDiagramMoveUpx10 avec le schema selectionne * Emits the requestForDiagramMoveUpx10 signal with all selected diagrams.
*/ */
void ElementsPanelWidget::moveDiagramUpx10() void ElementsPanelWidget::moveDiagramUpx10() {
{ QList<Diagram *> diagrams_to_move = elements_panel->selectedDiagrams();
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { if (diagrams_to_move.isEmpty()) return;
emit(requestForDiagramMoveUpx10(selected_diagram));
// Emit the entire list at once
emit requestForDiagramMoveUpx10(diagrams_to_move);
// Clear messy tree selection caused by moving items, then restore clean selection
elements_panel->clearSelection();
for (Diagram *d : diagrams_to_move) {
if (auto item = elements_panel->getItemForDiagram(d)) item->setSelected(true);
} }
} }
/** /**
Emet le signal requestForDiagramMoveUpx100 avec le schema selectionne * Emits the requestForDiagramMoveUpx100 signal with all selected diagrams.
*/ */
void ElementsPanelWidget::moveDiagramUpx100() void ElementsPanelWidget::moveDiagramUpx100() {
{ QList<Diagram *> diagrams_to_move = elements_panel->selectedDiagrams();
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { if (diagrams_to_move.isEmpty()) return;
emit(requestForDiagramMoveUpx100(selected_diagram));
// Emit the entire list at once
emit requestForDiagramMoveUpx100(diagrams_to_move);
// Clear messy tree selection caused by moving items, then restore clean selection
elements_panel->clearSelection();
for (Diagram *d : diagrams_to_move) {
if (auto item = elements_panel->getItemForDiagram(d)) item->setSelected(true);
} }
} }
/** /**
Emet le signal requestForDiagramMoveDownx10 avec le schema selectionne * Emits the requestForDiagramMoveDownx10 signal with all selected diagrams.
*/ */
void ElementsPanelWidget::moveDiagramDownx10() void ElementsPanelWidget::moveDiagramDownx10() {
{ QList<Diagram *> diagrams_to_move = elements_panel->selectedDiagrams();
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { if (diagrams_to_move.isEmpty()) return;
emit(requestForDiagramMoveDownx10(selected_diagram));
// Emit the entire list at once
emit requestForDiagramMoveDownx10(diagrams_to_move);
// Clear messy tree selection caused by moving items, then restore clean selection
elements_panel->clearSelection();
for (Diagram *d : diagrams_to_move) {
if (auto item = elements_panel->getItemForDiagram(d)) item->setSelected(true);
} }
} }
/** /**
Emet le signal requestForDiagramMoveDownx100 avec le schema selectionne * Emits the requestForDiagramMoveDownx100 signal with all selected diagrams.
*/ */
void ElementsPanelWidget::moveDiagramDownx100() void ElementsPanelWidget::moveDiagramDownx100() {
{ QList<Diagram *> diagrams_to_move = elements_panel->selectedDiagrams();
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { if (diagrams_to_move.isEmpty()) return;
emit(requestForDiagramMoveDownx100(selected_diagram));
// Emit the entire list at once
emit requestForDiagramMoveDownx100(diagrams_to_move);
// Clear messy tree selection caused by moving items, then restore clean selection
elements_panel->clearSelection();
for (Diagram *d : diagrams_to_move) {
if (auto item = elements_panel->getItemForDiagram(d)) item->setSelected(true);
} }
} }
@@ -378,21 +428,35 @@ void ElementsPanelWidget::updateButtons()
bool is_writable = !(elements_panel -> selectedProject() -> isReadOnly()); bool is_writable = !(elements_panel -> selectedProject() -> isReadOnly());
prj_add_diagram -> setEnabled(is_writable); prj_add_diagram -> setEnabled(is_writable);
} else if (current_type == QET::Diagram) { } else if (current_type == QET::Diagram) {
Diagram *selected_diagram = elements_panel -> selectedDiagram(); // Fetch ALL selected diagrams instead of just one
QETProject *selected_diagram_project = selected_diagram -> project(); QList<Diagram *> selected_diagrams = elements_panel -> selectedDiagrams();
bool is_writable = !(selected_diagram_project -> isReadOnly()); if (!selected_diagrams.isEmpty()) {
int project_diagrams_count = selected_diagram_project -> diagrams().count(); QETProject *selected_diagram_project = selected_diagrams.first() -> project();
int diagram_position = selected_diagram_project -> diagrams().indexOf(selected_diagram); bool is_writable = !(selected_diagram_project -> isReadOnly());
int project_diagrams_count = selected_diagram_project -> diagrams().count();
prj_del_diagram -> setEnabled(is_writable); // Find the highest (min) and lowest (max) index among the selection
prj_move_diagram_up -> setEnabled(is_writable && diagram_position > 0); int min_position = project_diagrams_count;
prj_move_diagram_down -> setEnabled(is_writable && diagram_position < project_diagrams_count - 1); int max_position = -1;
prj_move_diagram_top -> setEnabled(is_writable && diagram_position > 0);
prj_move_diagram_upx10 -> setEnabled(is_writable && diagram_position > 10); for (Diagram *diagram : selected_diagrams) {
prj_move_diagram_upx100 -> setEnabled(is_writable && diagram_position > 100); int pos = selected_diagram_project -> diagrams().indexOf(diagram);
prj_move_diagram_downx10 -> setEnabled(is_writable && diagram_position < project_diagrams_count - 10); if (pos < min_position) min_position = pos;
prj_move_diagram_downx100 -> setEnabled(is_writable && diagram_position < project_diagrams_count - 100); if (pos > max_position) max_position = pos;
}
prj_del_diagram -> setEnabled(is_writable);
prj_move_diagram_up -> setEnabled(is_writable && min_position > 0);
prj_move_diagram_down -> setEnabled(is_writable && max_position < project_diagrams_count - 1);
prj_move_diagram_top -> setEnabled(is_writable && min_position > 0);
// Adjusted to >= to allow exactly 10 or 100 steps if space permits
prj_move_diagram_upx10 -> setEnabled(is_writable && min_position > 10);
prj_move_diagram_upx100 -> setEnabled(is_writable && min_position > 100);
prj_move_diagram_downx10 -> setEnabled(is_writable && max_position < project_diagrams_count - 10);
prj_move_diagram_downx100 -> setEnabled(is_writable && max_position < project_diagrams_count - 100);
}
} else if (current_type == QET::TitleBlockTemplatesCollection) { } else if (current_type == QET::TitleBlockTemplatesCollection) {
TitleBlockTemplateLocation location = elements_panel -> templateLocationForItem(current_item); TitleBlockTemplateLocation location = elements_panel -> templateLocationForItem(current_item);
tbt_add -> setEnabled(!location.isReadOnly()); tbt_add -> setEnabled(!location.isReadOnly());
@@ -475,62 +539,57 @@ void ElementsPanelWidget::filterEdited(const QString &next_text) {
} }
/** /**
Treat key press event inside elements panel widget * Treat key press event inside elements panel widget
*/ */
void ElementsPanelWidget::keyPressEvent (QKeyEvent *e) { /**
switch(e -> key()) { * Treat key press event inside elements panel widget.
case Qt::Key_Delete: //delete diagram through elements panel widget * Respects the enabled/disabled state of the corresponding QActions.
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { */
emit(requestForDiagramDeletion(selected_diagram)); void ElementsPanelWidget::keyPressEvent(QKeyEvent *e) {
} switch(e->key()) {
break; case Qt::Key_Delete:
case Qt::Key_F3: if (prj_del_diagram && prj_del_diagram->isEnabled()) {
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { deleteDiagram();
elements_panel->setSelectedItem(elements_panel->getItemForDiagram(selected_diagram)); }
emit(requestForDiagramMoveUp(selected_diagram)); break;
} case Qt::Key_F3:
break; if (prj_move_diagram_up && prj_move_diagram_up->isEnabled()) {
case Qt::Key_F4: moveDiagramUp();
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { }
elements_panel->setSelectedItem(elements_panel->getItemForDiagram(selected_diagram)); break;
emit(requestForDiagramMoveDown(selected_diagram)); case Qt::Key_F4:
} if (prj_move_diagram_down && prj_move_diagram_down->isEnabled()) {
break; moveDiagramDown();
case Qt::Key_F5: }
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { break;
elements_panel->setSelectedItem(elements_panel->getItemForDiagram(selected_diagram)); case Qt::Key_F5:
emit(requestForDiagramMoveUpTop(selected_diagram)); if (prj_move_diagram_top && prj_move_diagram_top->isEnabled()) {
} moveDiagramUpTop();
}
break; break;
case Qt::Key_F6: case Qt::Key_F6:
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { if (prj_move_diagram_downx10 && prj_move_diagram_downx10->isEnabled()) {
elements_panel->setSelectedItem(elements_panel->getItemForDiagram(selected_diagram)); moveDiagramDownx10();
emit(requestForDiagramMoveDownx10(selected_diagram)); }
} break;
case Qt::Key_F7:
break; if (prj_move_diagram_downx100 && prj_move_diagram_downx100->isEnabled()) {
case Qt::Key_F7: moveDiagramDownx100();
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { }
elements_panel->setSelectedItem(elements_panel->getItemForDiagram(selected_diagram)); break;
emit(requestForDiagramMoveDownx100(selected_diagram)); case Qt::Key_F8:
} if (prj_move_diagram_upx10 && prj_move_diagram_upx10->isEnabled()) {
moveDiagramUpx10();
}
break; break;
case Qt::Key_F8: case Qt::Key_F9:
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { if (prj_move_diagram_upx100 && prj_move_diagram_upx100->isEnabled()) {
elements_panel->setSelectedItem(elements_panel->getItemForDiagram(selected_diagram)); moveDiagramUpx100();
emit(requestForDiagramMoveUpx10(selected_diagram)); }
} break;
default:
break; // Pass unhandled key events to the base class
case Qt::Key_F9: QWidget::keyPressEvent(e);
if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { break;
elements_panel->setSelectedItem(elements_panel->getItemForDiagram(selected_diagram)); }
emit(requestForDiagramMoveUpx100(selected_diagram));
}
break;
}
return;
} }

View File

@@ -69,13 +69,14 @@ class ElementsPanelWidget : public QWidget {
void requestForProjectPropertiesEdition(QETProject *); void requestForProjectPropertiesEdition(QETProject *);
void requestForDiagramPropertiesEdition(Diagram *); void requestForDiagramPropertiesEdition(Diagram *);
void requestForDiagramDeletion(Diagram *); void requestForDiagramDeletion(Diagram *);
void requestForDiagramMoveUp(Diagram *); void requestForDiagramsDeletion(const QList<Diagram *> &diagrams);
void requestForDiagramMoveDown(Diagram *); void requestForDiagramMoveUp(const QList<Diagram *> &diagrams);
void requestForDiagramMoveUpTop(Diagram *); void requestForDiagramMoveDown(const QList<Diagram *> &diagrams);
void requestForDiagramMoveUpx10(Diagram *); void requestForDiagramMoveUpTop(const QList<Diagram *> &diagrams);
void requestForDiagramMoveUpx100(Diagram *); void requestForDiagramMoveUpx10(const QList<Diagram *> &diagrams);
void requestForDiagramMoveDownx10(Diagram *); void requestForDiagramMoveUpx100(const QList<Diagram *> &diagrams);
void requestForDiagramMoveDownx100(Diagram *); void requestForDiagramMoveDownx10(const QList<Diagram *> &diagrams);
void requestForDiagramMoveDownx100(const QList<Diagram *> &diagrams);
public slots: public slots:
void openDirectoryForSelectedItem(); void openDirectoryForSelectedItem();

View File

@@ -364,11 +364,12 @@ QETResult ProjectView::noProjectResult() const
} }
/** /**
@brief ProjectView::removeDiagram * @brief ProjectView::removeDiagram
Remove a diagram (folio) of the project * Remove a diagram (folio) of the project
@param diagram_view : diagram view to remove * @param diagram_view : diagram view to remove
*/ * @param silent : if true, bypasses the confirmation message box
void ProjectView::removeDiagram(DiagramView *diagram_view) */
void ProjectView::removeDiagram(DiagramView *diagram_view, bool silent)
{ {
if (!diagram_view) if (!diagram_view)
return; return;
@@ -377,17 +378,18 @@ void ProjectView::removeDiagram(DiagramView *diagram_view)
if (!m_diagram_ids.values().contains(diagram_view)) if (!m_diagram_ids.values().contains(diagram_view))
return; return;
if (!silent) {
//Ask confirmation to user. //Ask confirmation to user.
int answer = QET::QetMessageBox::question( int answer = QET::QetMessageBox::question(
this, this,
tr("Supprimer le folio ?", "message box title"), tr("Supprimer le folio ?", "message box title"),
tr("Êtes-vous sûr de vouloir supprimer ce folio du projet ? Ce changement est irréversible.", "message box content"), tr("Êtes-vous sûr de vouloir supprimer ce folio du projet ? Ce changement est irréversible.", "message box content"),
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel,
QMessageBox::No QMessageBox::No
); );
if (answer != QMessageBox::Yes) { if (answer != QMessageBox::Yes) {
return; return;
}
} }
//Remove the diagram view of the tabs widget //Remove the diagram view of the tabs widget
@@ -405,14 +407,15 @@ void ProjectView::removeDiagram(DiagramView *diagram_view)
} }
/** /**
Enleve un schema du ProjectView * Enleve un schema du ProjectView
@param diagram Schema a enlever * @param diagram Schema a enlever
*/ * @param silent Si vrai, supprime sans demander confirmation
void ProjectView::removeDiagram(Diagram *diagram) { */
void ProjectView::removeDiagram(Diagram *diagram, bool silent) {
if (!diagram) return; if (!diagram) return;
if (DiagramView *diagram_view = findDiagram(diagram)) { if (DiagramView *diagram_view = findDiagram(diagram)) {
removeDiagram(diagram_view); removeDiagram(diagram_view, silent);
} }
} }
@@ -557,6 +560,56 @@ void ProjectView::moveDiagramUpx10(Diagram *diagram) {
moveDiagramUpx10(findDiagram(diagram)); moveDiagramUpx10(findDiagram(diagram));
} }
/**
* @brief ProjectView::moveDiagramUpx100
* Moves the diagram_view up / left x100
* @param diagram_view View to move
*/
void ProjectView::moveDiagramUpx100(DiagramView *diagram_view) {
if (!diagram_view) return;
int diagram_view_position = m_diagram_ids.key(diagram_view);
if (!diagram_view_position) {
// The diagram is the first of the project
return;
}
m_tab->tabBar()->moveTab(diagram_view_position, diagram_view_position - 100);
}
/**
* @brief ProjectView::moveDiagramUpx100
* Moves the diagram up / left x100
* @param diagram Diagram to move
*/
void ProjectView::moveDiagramUpx100(Diagram *diagram) {
moveDiagramUpx100(findDiagram(diagram));
}
/**
* @brief ProjectView::moveDiagramDownx100
* Moves the diagram_view down / right x100
* @param diagram_view View to move
*/
void ProjectView::moveDiagramDownx100(DiagramView *diagram_view) {
if (!diagram_view) return;
int diagram_view_position = m_diagram_ids.key(diagram_view);
if (diagram_view_position + 1 == m_diagram_ids.count()) {
// The diagram is the last of the project
return;
}
m_tab->tabBar()->moveTab(diagram_view_position, diagram_view_position + 100);
}
/**
* @brief ProjectView::moveDiagramDownx100
* Moves the diagram down / right x100
* @param diagram Diagram to move
*/
void ProjectView::moveDiagramDownx100(Diagram *diagram) {
moveDiagramDownx100(findDiagram(diagram));
}
/** /**
Deplace le schema diagram_view vers le bas / la droite x10 Deplace le schema diagram_view vers le bas / la droite x10
*/ */

View File

@@ -104,8 +104,8 @@ class ProjectView : public QWidget
void changeLastTab(); void changeLastTab();
public slots: public slots:
void removeDiagram(DiagramView *); void removeDiagram(DiagramView *diagram_view, bool silent = false);
void removeDiagram(Diagram *); void removeDiagram(Diagram *diagram, bool silent = false);
void showDiagram(DiagramView *); void showDiagram(DiagramView *);
void showDiagram(Diagram *); void showDiagram(Diagram *);
void editProjectProperties(); void editProjectProperties();
@@ -122,6 +122,10 @@ class ProjectView : public QWidget
void moveDiagramUpx10(Diagram *); void moveDiagramUpx10(Diagram *);
void moveDiagramDownx10(DiagramView *); void moveDiagramDownx10(DiagramView *);
void moveDiagramDownx10(Diagram *); void moveDiagramDownx10(Diagram *);
void moveDiagramUpx100(DiagramView *);
void moveDiagramUpx100(Diagram *);
void moveDiagramDownx100(DiagramView *);
void moveDiagramDownx100(Diagram *);
void exportProject(); void exportProject();
QETResult save(); QETResult save();
QETResult saveAs(); QETResult saveAs();

View File

@@ -16,7 +16,7 @@
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>. along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "qetdiagrameditor.h" #include "qetdiagrameditor.h"
#include <QCoreApplication>
#include "ElementsCollection/elementscollectionwidget.h" #include "ElementsCollection/elementscollectionwidget.h"
#include "QWidgetAnimation/qwidgetanimation.h" #include "QWidgetAnimation/qwidgetanimation.h"
#include "autoNum/ui/autonumberingdockwidget.h" #include "autoNum/ui/autonumberingdockwidget.h"
@@ -47,7 +47,7 @@
#include "TerminalStrip/ui/addterminalstripitemdialog.h" #include "TerminalStrip/ui/addterminalstripitemdialog.h"
#include "wiringlistexport.h" #include "wiringlistexport.h"
#include "ui/terminalnumberingdialog.h" #include "ui/terminalnumberingdialog.h"
#include <QDebug>
#ifdef BUILD_WITHOUT_KF5 #ifdef BUILD_WITHOUT_KF5
#else #else
# include <KAutoSaveFile> # include <KAutoSaveFile>
@@ -176,12 +176,14 @@ void QETDiagramEditor::setUpElementsPanel()
connect(pa, SIGNAL(requestForProjectPropertiesEdition (QETProject *)), this, SLOT(editProjectProperties(QETProject *))); connect(pa, SIGNAL(requestForProjectPropertiesEdition (QETProject *)), this, SLOT(editProjectProperties(QETProject *)));
connect(pa, SIGNAL(requestForNewDiagram (QETProject *)), this, SLOT(addDiagramToProject(QETProject *))); connect(pa, SIGNAL(requestForNewDiagram (QETProject *)), this, SLOT(addDiagramToProject(QETProject *)));
connect(pa, SIGNAL(requestForDiagramPropertiesEdition (Diagram *)), this, SLOT(editDiagramProperties(Diagram *))); connect(pa, SIGNAL(requestForDiagramPropertiesEdition (Diagram *)), this, SLOT(editDiagramProperties(Diagram *)));
connect(pa, SIGNAL(requestForDiagramDeletion (Diagram *)), this, SLOT(removeDiagram(Diagram *))); connect(pa, SIGNAL(requestForDiagramsDeletion (const QList<Diagram *> &)), this, SLOT(removeDiagrams(const QList<Diagram *> &)));
connect(pa, SIGNAL(requestForDiagramMoveUp (Diagram *)), this, SLOT(moveDiagramUp(Diagram *))); connect(pa, SIGNAL(requestForDiagramMoveUp (const QList<Diagram *> &)), this, SLOT(moveDiagramUp(const QList<Diagram *>&)));
connect(pa, SIGNAL(requestForDiagramMoveDown (Diagram *)), this, SLOT(moveDiagramDown(Diagram *))); connect(pa, SIGNAL(requestForDiagramMoveDown (const QList<Diagram *> &)), this, SLOT(moveDiagramDown(const QList<Diagram *>&)));
connect(pa, SIGNAL(requestForDiagramMoveUpTop (Diagram *)), this, SLOT(moveDiagramUpTop(Diagram *))); connect(pa, SIGNAL(requestForDiagramMoveUpTop (const QList<Diagram *> &)), this, SLOT(moveDiagramUpTop(const QList<Diagram *>&)));
connect(pa, SIGNAL(requestForDiagramMoveUpx10 (Diagram *)), this, SLOT(moveDiagramUpx10(Diagram *))); connect(pa, SIGNAL(requestForDiagramMoveUpx10 (const QList<Diagram *> &)), this, SLOT(moveDiagramUpx10(const QList<Diagram *>&)));
connect(pa, SIGNAL(requestForDiagramMoveDownx10 (Diagram *)), this, SLOT(moveDiagramDownx10(Diagram *))); connect(pa, SIGNAL(requestForDiagramMoveDownx10 (const QList<Diagram *> &)), this, SLOT(moveDiagramDownx10(const QList<Diagram *>&)));
connect(pa, SIGNAL(requestForDiagramMoveUpx100 (const QList<Diagram *> &)), this, SLOT(moveDiagramUpx100(const QList<Diagram *>&)));
connect(pa, SIGNAL(requestForDiagramMoveDownx100 (const QList<Diagram *> &)), this, SLOT(moveDiagramDownx100(const QList<Diagram *>&)));
} }
/** /**
@@ -2183,126 +2185,182 @@ void QETDiagramEditor::addDiagramToProject(QETProject *project)
project_view->project()->addNewDiagram(); project_view->project()->addNewDiagram();
} }
} }
/**
* @brief QETDiagramEditor::removeDiagram
* Wrapper für einzelne Diagramme, um Abwärtskompatibilität zu erhalten.
*/
void QETDiagramEditor::removeDiagram(Diagram *diagram)
{
if (!diagram) return;
QList<Diagram *> list;
list << diagram;
removeDiagrams(list);
}
/**
* @brief QETDiagramEditor::removeDiagrams
* Deletes a list of folios with a single query.
*/
void QETDiagramEditor::removeDiagrams(const QList<Diagram *> &diagrams)
{
if (diagrams.isEmpty()) return;
if (diagrams.count() == 1) {
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, tr("Supprimer le folio"),
tr("Êtes-vous sûr de vouloir supprimer ce folio ?"),
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::No) return;
} else {
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, tr("Supprimer les folios"),
tr("Êtes-vous sûr de vouloir supprimer les %1 folios sélectionnés ?").arg(diagrams.count()),
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::No) return;
}
ProjectView *project_view = nullptr;
if (QETProject *diagram_project = diagrams.first()->project()) {
project_view = findProject(diagram_project);
}
if (project_view) project_view->setUpdatesEnabled(false);
if (pa) pa->setUpdatesEnabled(false);
foreach (Diagram *diagram, diagrams) {
removeDiagramSilent(diagram);
}
if (pa) pa->setUpdatesEnabled(true);
if (project_view) project_view->setUpdatesEnabled(true);
emit syncElementsPanel();
}
/** /**
Supprime un schema de son projet Supprime un schema de son projet
@param diagram Schema a supprimer @param diagram Schema a supprimer
*/ */
void QETDiagramEditor::removeDiagram(Diagram *diagram) void QETDiagramEditor::removeDiagramSilent(Diagram *diagram)
{ {
if (!diagram) return; if (!diagram) return;
// recupere le projet contenant le schema
if (QETProject *diagram_project = diagram -> project()) { if (QETProject *diagram_project = diagram -> project()) {
// recupere la vue sur ce projet
if (ProjectView *project_view = findProject(diagram_project)) { if (ProjectView *project_view = findProject(diagram_project)) {
// affiche le schema en question
project_view -> showDiagram(diagram);
// supprime le schema // supprime le schema
project_view -> removeDiagram(diagram); project_view -> removeDiagram(diagram, true);
}
}
}
void QETDiagramEditor::moveDiagramUp(const QList<Diagram *> &diagrams) {
if (diagrams.isEmpty()) return;
QList<Diagram *> safeDiagrams = diagrams;
if (QETProject *diagram_project = safeDiagrams.first()->project()) {
if (!diagram_project->isReadOnly()) {
if (ProjectView *project_view = findProject(diagram_project)) {
// Forward loop for moving up
for (int i = 0; i < safeDiagrams.size(); ++i) {
project_view->moveDiagramUp(safeDiagrams.at(i));
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
}
}
} }
} }
} }
/** void QETDiagramEditor::moveDiagramDown(const QList<Diagram *> &diagrams) {
Change l'ordre des schemas d'un projet, en decalant le schema vers le haut / if (diagrams.isEmpty()) return;
la gauche QList<Diagram *> safeDiagrams = diagrams;
@param diagram Schema a decaler vers le haut / la gauche if (QETProject *diagram_project = safeDiagrams.first()->project()) {
*/ if (!diagram_project->isReadOnly()) {
void QETDiagramEditor::moveDiagramUp(Diagram *diagram) if (ProjectView *project_view = findProject(diagram_project)) {
{ // Backward loop for moving down
if (!diagram) return; for (int i = safeDiagrams.size() - 1; i >= 0; --i) {
project_view->moveDiagramDown(safeDiagrams.at(i));
// recupere le projet contenant le schema QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
if (QETProject *diagram_project = diagram -> project()) { }
if (diagram_project -> isReadOnly()) return; }
// recupere la vue sur ce projet
if (ProjectView *project_view = findProject(diagram_project)) {
project_view -> moveDiagramUp(diagram);
} }
} }
} }
/** void QETDiagramEditor::moveDiagramUpTop(const QList<Diagram *> &diagrams) {
Change l'ordre des schemas d'un projet, en decalant le schema vers le bas / if (diagrams.isEmpty()) return;
la droite QList<Diagram *> safeDiagrams = diagrams;
@param diagram Schema a decaler vers le bas / la droite if (QETProject *diagram_project = safeDiagrams.first()->project()) {
*/ if (!diagram_project->isReadOnly()) {
void QETDiagramEditor::moveDiagramDown(Diagram *diagram) if (ProjectView *project_view = findProject(diagram_project)) {
{ // Backward loop to preserve relative order of the selected items when moving to top
if (!diagram) return; for (int i = safeDiagrams.size() - 1; i >= 0; --i) {
project_view->moveDiagramUpTop(safeDiagrams.at(i));
// recupere le projet contenant le schema QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
if (QETProject *diagram_project = diagram -> project()) { }
if (diagram_project -> isReadOnly()) return; }
// recupere la vue sur ce projet
if (ProjectView *project_view = findProject(diagram_project)) {
project_view -> moveDiagramDown(diagram);
} }
} }
} }
/** void QETDiagramEditor::moveDiagramUpx10(const QList<Diagram *> &diagrams) {
Change l'ordre des schemas d'un projet, en decalant le schema vers le haut / if (diagrams.isEmpty()) return;
la gauche en position 0 QList<Diagram *> safeDiagrams = diagrams;
@param diagram Schema a decaler vers le haut / la gauche en position 0 if (QETProject *diagram_project = safeDiagrams.first()->project()) {
*/ if (!diagram_project->isReadOnly()) {
void QETDiagramEditor::moveDiagramUpTop(Diagram *diagram) if (ProjectView *project_view = findProject(diagram_project)) {
{ // Forward loop for moving up
if (!diagram) return; for (int i = 0; i < safeDiagrams.size(); ++i) {
project_view->moveDiagramUpx10(safeDiagrams.at(i));
// recupere le projet contenant le schema QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
if (QETProject *diagram_project = diagram -> project()) { }
if (diagram_project -> isReadOnly()) return; }
// recupere la vue sur ce projet
if (ProjectView *project_view = findProject(diagram_project)) {
project_view -> moveDiagramUpTop(diagram);
} }
} }
} }
void QETDiagramEditor::moveDiagramDownx10(const QList<Diagram *> &diagrams) {
/** if (diagrams.isEmpty()) return;
Change l'ordre des schemas d'un projet, en decalant le schema vers le haut / QList<Diagram *> safeDiagrams = diagrams;
la gauche x10 if (QETProject *diagram_project = safeDiagrams.first()->project()) {
@param diagram Schema a decaler vers le haut / la gauche x10 if (!diagram_project->isReadOnly()) {
*/ if (ProjectView *project_view = findProject(diagram_project)) {
void QETDiagramEditor::moveDiagramUpx10(Diagram *diagram) // Backward loop for moving down
{ for (int i = safeDiagrams.size() - 1; i >= 0; --i) {
if (!diagram) return; project_view->moveDiagramDownx10(safeDiagrams.at(i));
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
// recupere le projet contenant le schema }
if (QETProject *diagram_project = diagram -> project()) { }
if (diagram_project -> isReadOnly()) return;
// recupere la vue sur ce projet
if (ProjectView *project_view = findProject(diagram_project)) {
project_view -> moveDiagramUpx10(diagram);
} }
} }
} }
/** void QETDiagramEditor::moveDiagramUpx100(const QList<Diagram *> &diagrams) {
Change l'ordre des schemas d'un projet, en decalant le schema vers le bas / if (diagrams.isEmpty()) return;
la droite x10 QList<Diagram *> safeDiagrams = diagrams;
@param diagram Schema a decaler vers le bas / la droite x10 if (QETProject *diagram_project = safeDiagrams.first()->project()) {
*/ if (!diagram_project->isReadOnly()) {
void QETDiagramEditor::moveDiagramDownx10(Diagram *diagram) if (ProjectView *project_view = findProject(diagram_project)) {
{ // Forward loop for moving up
if (!diagram) return; for (int i = 0; i < safeDiagrams.size(); ++i) {
project_view->moveDiagramUpx100(safeDiagrams.at(i));
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
}
}
}
}
}
// recupere le projet contenant le schema void QETDiagramEditor::moveDiagramDownx100(const QList<Diagram *> &diagrams) {
if (QETProject *diagram_project = diagram -> project()) { if (diagrams.isEmpty()) return;
if (diagram_project -> isReadOnly()) return; QList<Diagram *> safeDiagrams = diagrams;
if (QETProject *diagram_project = safeDiagrams.first()->project()) {
// recupere la vue sur ce projet if (!diagram_project->isReadOnly()) {
if (ProjectView *project_view = findProject(diagram_project)) { if (ProjectView *project_view = findProject(diagram_project)) {
project_view -> moveDiagramDownx10(diagram); // Backward loop for moving down
for (int i = safeDiagrams.size() - 1; i >= 0; --i) {
project_view->moveDiagramDownx100(safeDiagrams.at(i));
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
}
}
} }
} }
} }

View File

@@ -138,12 +138,15 @@ class QETDiagramEditor : public QETMainWindow
void editDiagramProperties(Diagram *); void editDiagramProperties(Diagram *);
void addDiagramToProject(QETProject *); void addDiagramToProject(QETProject *);
void removeDiagram(Diagram *); void removeDiagram(Diagram *);
void removeDiagrams(const QList<Diagram *> &diagrams);
void removeDiagramFromProject(); void removeDiagramFromProject();
void moveDiagramUp(Diagram *); void moveDiagramUp(const QList<Diagram *> &diagrams);
void moveDiagramDown(Diagram *); void moveDiagramDown(const QList<Diagram *> &diagrams);
void moveDiagramUpTop(Diagram *); void moveDiagramUpTop(const QList<Diagram *> &diagrams);
void moveDiagramUpx10(Diagram *); void moveDiagramUpx10(const QList<Diagram *> &diagrams);
void moveDiagramDownx10(Diagram *); void moveDiagramDownx10(const QList<Diagram *> &diagrams);
void moveDiagramUpx100(const QList<Diagram *> &diagrams);
void moveDiagramDownx100(const QList<Diagram *> &diagrams);
void reloadOldElementPanel(); void reloadOldElementPanel();
void diagramWasAdded(DiagramView *); void diagramWasAdded(DiagramView *);
void findElementInPanel(const ElementsLocation &); void findElementInPanel(const ElementsLocation &);
@@ -222,6 +225,8 @@ class QETDiagramEditor : public QETMainWindow
QList <QAction *> m_zoom_action_toolBar; ///Only zoom action must displayed in the toolbar QList <QAction *> m_zoom_action_toolBar; ///Only zoom action must displayed in the toolbar
void removeDiagramSilent(Diagram *diagram);
QMdiArea m_workspace; QMdiArea m_workspace;
QSignalMapper windowMapper; QSignalMapper windowMapper;
QDir open_dialog_dir; /// Directory to use for file dialogs such as File > save QDir open_dialog_dir; /// Directory to use for file dialogs such as File > save