From c0896c7ba76648fad549e28a6626cd5df00b78ca Mon Sep 17 00:00:00 2001 From: ispyisail Date: Tue, 4 Aug 2026 16:36:23 +1200 Subject: [PATCH] Add "Insert folio above/below" to the elements panel's folio menu "Add folio" always appends to the end of the project, ignoring whatever folio is currently selected in the left panel -- even though the panel already tracks the selected diagram's position for its existing move up/down/top actions, and QETProject::addNewDiagram(pos) already accepts an arbitrary insertion index, pushed as an undoable AddDiagramCommand (QetGraphicsTableFactory::create() already relies on this exact mechanism to insert a folio right after a specific one). Add two new context-menu actions that compute the target position from the selected diagram's folioIndex() and pass it straight through the existing machinery -- no changes needed to QETProject or AddDiagramCommand. New requestForNewDiagramAt/addDiagramToProjectAt signal/slot pair added alongside the existing requestForNewDiagram/addDiagramToProject rather than changing it, so the plain "Add folio" action's append-at-end behavior is untouched. --- sources/elementspanelwidget.cpp | 34 +++++++++++++++++++++++++++++++++ sources/elementspanelwidget.h | 5 +++++ sources/qetdiagrameditor.cpp | 20 +++++++++++++++++++ sources/qetdiagrameditor.h | 1 + 4 files changed, 60 insertions(+) diff --git a/sources/elementspanelwidget.cpp b/sources/elementspanelwidget.cpp index 7baf0afbe..f9a71c947 100644 --- a/sources/elementspanelwidget.cpp +++ b/sources/elementspanelwidget.cpp @@ -61,6 +61,8 @@ ElementsPanelWidget::ElementsPanelWidget(QWidget *parent) : QWidget(parent) { prj_edit_prop = new QAction(QET::Icons::DialogInformation, tr("Propriétés du projet"), this); prj_prop_diagram = new QAction(QET::Icons::DialogInformation, tr("Propriétés du folio"), this); prj_add_diagram = new QAction(QET::Icons::DiagramAdd, tr("Ajouter un folio"), this); + prj_insert_diagram_above = new QAction(QET::Icons::DiagramAdd, tr("Insérer un folio au-dessus"), this); + prj_insert_diagram_below = new QAction(QET::Icons::DiagramAdd, tr("Insérer un folio en dessous"), this); prj_duplicate_diagram = new QAction(QET::Icons::IC_CopyFile, tr("Copier et coller"), this); prj_del_diagram = new QAction(QET::Icons::DiagramDelete, tr("Supprimer ce folio"), this); prj_move_diagram_up = new QAction(QET::Icons::GoUp, tr("Remonter ce folio"), this); @@ -101,6 +103,8 @@ ElementsPanelWidget::ElementsPanelWidget(QWidget *parent) : QWidget(parent) { connect(prj_edit_prop, SIGNAL(triggered()), this, SLOT(editProjectProperties())); connect(prj_prop_diagram, SIGNAL(triggered()), this, SLOT(editDiagramProperties())); connect(prj_add_diagram, SIGNAL(triggered()), this, SLOT(newDiagram())); + connect(prj_insert_diagram_above, SIGNAL(triggered()), this, SLOT(insertDiagramAbove())); + connect(prj_insert_diagram_below, SIGNAL(triggered()), this, SLOT(insertDiagramBelow())); connect(prj_del_diagram, SIGNAL(triggered()), this, SLOT(deleteDiagram())); connect(prj_duplicate_diagram, SIGNAL(triggered()), this, SLOT(duplicateDiagram())); connect(prj_move_diagram_up, SIGNAL(triggered()), this, SLOT(moveDiagramUp())); @@ -245,6 +249,32 @@ void ElementsPanelWidget::newDiagram() } } +/** + @brief ElementsPanelWidget::insertDiagramAbove + Emit requestForNewDiagramAt with the position of the currently + selected diagram, inserting the new folio right before it. +*/ +void ElementsPanelWidget::insertDiagramAbove() +{ + if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { + QETProject *project = selected_diagram->project(); + emit(requestForNewDiagramAt(project, project->folioIndex(selected_diagram))); + } +} + +/** + @brief ElementsPanelWidget::insertDiagramBelow + Emit requestForNewDiagramAt with the position right after the + currently selected diagram, inserting the new folio right after it. +*/ +void ElementsPanelWidget::insertDiagramBelow() +{ + if (Diagram *selected_diagram = elements_panel -> selectedDiagram()) { + QETProject *project = selected_diagram->project(); + emit(requestForNewDiagramAt(project, project->folioIndex(selected_diagram) + 1)); + } +} + /** * Emet le signal requestForDiagramsDeletion avec les schemas selectionnes */ @@ -451,6 +481,8 @@ void ElementsPanelWidget::updateButtons() prj_del_diagram -> setEnabled(is_writable); prj_duplicate_diagram -> setEnabled(is_writable); + prj_insert_diagram_above -> setEnabled(is_writable); + prj_insert_diagram_below -> 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); @@ -504,6 +536,8 @@ void ElementsPanelWidget::handleContextMenu(const QPoint &pos) { break; case QET::Diagram: context_menu -> addAction(prj_prop_diagram); + context_menu -> addAction(prj_insert_diagram_above); + context_menu -> addAction(prj_insert_diagram_below); context_menu -> addAction(prj_del_diagram); context_menu -> addAction(prj_duplicate_diagram); context_menu -> addAction(prj_move_diagram_top); diff --git a/sources/elementspanelwidget.h b/sources/elementspanelwidget.h index ae7dac8e7..249ee88f7 100644 --- a/sources/elementspanelwidget.h +++ b/sources/elementspanelwidget.h @@ -46,6 +46,8 @@ class ElementsPanelWidget : public QWidget { *prj_edit_prop, *prj_prop_diagram, *prj_add_diagram, + *prj_insert_diagram_above, + *prj_insert_diagram_below, *prj_del_diagram, *prj_duplicate_diagram, *prj_move_diagram_up, @@ -66,6 +68,7 @@ class ElementsPanelWidget : public QWidget { signals: void requestForProject(QETProject *); void requestForNewDiagram(QETProject *); + void requestForNewDiagramAt(QETProject *, int); void requestForProjectClosing(QETProject *); void requestForProjectPropertiesEdition(QETProject *); void requestForDiagramPropertiesEdition(Diagram *); @@ -88,6 +91,8 @@ class ElementsPanelWidget : public QWidget { void editProjectProperties(); void editDiagramProperties(); void newDiagram(); + void insertDiagramAbove(); + void insertDiagramBelow(); void deleteDiagram(); void duplicateDiagram(); void moveDiagramUp(); diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 5b2ba6779..447af2b1d 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -185,6 +185,7 @@ void QETDiagramEditor::setUpElementsPanel() connect(pa, SIGNAL(requestForProjectClosing (QETProject *)), this, SLOT(closeProject(QETProject *))); connect(pa, SIGNAL(requestForProjectPropertiesEdition (QETProject *)), this, SLOT(editProjectProperties(QETProject *))); connect(pa, SIGNAL(requestForNewDiagram (QETProject *)), this, SLOT(addDiagramToProject(QETProject *))); + connect(pa, SIGNAL(requestForNewDiagramAt (QETProject *, int)), this, SLOT(addDiagramToProjectAt(QETProject *, int))); connect(pa, SIGNAL(requestForDiagramPropertiesEdition (Diagram *)), this, SLOT(editDiagramProperties(Diagram *))); connect(pa, SIGNAL(requestForDiagramsDeletion (const QList &)), this, SLOT(removeDiagrams(const QList &))); connect(pa, SIGNAL(requestForDiagramMoveUp (const QList &)), this, SLOT(moveDiagramUp(const QList&))); @@ -2274,6 +2275,25 @@ void QETDiagramEditor::addDiagramToProject(QETProject *project) project_view->project()->addNewDiagram(); } } + +/** + @brief QETDiagramEditor::addDiagramToProjectAt + Add a diagram to project, inserted at a specific position. + @param project + @param pos +*/ +void QETDiagramEditor::addDiagramToProjectAt(QETProject *project, int pos) +{ + if (!project) { + return; + } + + if (ProjectView *project_view = findProject(project)) + { + activateProject(project); + project_view->project()->addNewDiagram(pos); + } +} /** * @brief QETDiagramEditor::removeDiagram * Wrapper für einzelne Diagramme, um Abwärtskompatibilität zu erhalten. diff --git a/sources/qetdiagrameditor.h b/sources/qetdiagrameditor.h index 0114a186e..bdbf940f0 100644 --- a/sources/qetdiagrameditor.h +++ b/sources/qetdiagrameditor.h @@ -137,6 +137,7 @@ class QETDiagramEditor : public QETMainWindow void editDiagramProperties(DiagramView *); void editDiagramProperties(Diagram *); void addDiagramToProject(QETProject *); + void addDiagramToProjectAt(QETProject *, int); void removeDiagram(Diagram *); void removeDiagrams(const QList &diagrams); void removeDiagramFromProject();