From a44dc91ae94d5ea87d6d19eb975c51ac72d64aaa Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr> Date: Thu, 8 Jun 2023 16:09:00 +0200 Subject: [PATCH] Network: Connect first undo command. --- src/View/Network/GraphWidget.py | 14 +++++++-- src/View/Network/Table.py | 26 ++++++++++++++-- src/View/Network/UndoCommand.py | 53 +++++++++++++++++++++++++++++++++ src/View/Network/Window.py | 4 ++- 4 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 src/View/Network/UndoCommand.py diff --git a/src/View/Network/GraphWidget.py b/src/View/Network/GraphWidget.py index 0971d851..8cdcff55 100644 --- a/src/View/Network/GraphWidget.py +++ b/src/View/Network/GraphWidget.py @@ -21,6 +21,8 @@ from Model.Network.Node import Node from Model.Network.Edge import Edge from Model.Network.Graph import Graph +from View.Network.UndoCommand import * + _translate = QCoreApplication.translate @@ -424,13 +426,21 @@ class GraphWidget(QGraphicsView): self.texts[i].rename() def enable_edge(self, edge, prev): - edge.edge.enable(enable = not prev) + self._undo.push( + EnableEdgeCommand( + edge.edge, not prev + ) + ) self.changeEdge.emit(self.sender()) self.changeNode.emit(self.sender()) self.display_update() def reverse_edge(self, edge): - edge.edge.reverse() + self._undo.push( + ReverseEdgeCommand( + edge.edge + ) + ) self.changeEdge.emit(self.sender()) self.display_update() diff --git a/src/View/Network/Table.py b/src/View/Network/Table.py index 33bd3d33..3031350a 100644 --- a/src/View/Network/Table.py +++ b/src/View/Network/Table.py @@ -5,6 +5,7 @@ from Model.Network.Edge import Edge from Model.Network.Graph import Graph from View.ASubWindow import ASubWindow from View.Network.GraphWidget import GraphWidget +from View.Network.UndoCommand import * from PyQt5.QtCore import ( Qt, QRect, QVariant, QAbstractTableModel, pyqtSlot, pyqtSignal, @@ -17,6 +18,7 @@ from PyQt5.QtWidgets import ( QApplication, ) + class ComboBoxDelegate(QItemDelegate): def __init__(self, graph=None, parent=None): super(ComboBoxDelegate, self).__init__(parent) @@ -140,9 +142,29 @@ class GraphTableModel(QAbstractTableModel): if (self.headers[index.column()] == "node1" or self.headers[index.column()] == "node2"): node = self.graph.node(value) - self.rows[index.row()][self.headers[index.column()]] = node + self._undo.push( + SetCommand( + self.rows[index.row()], + self.headers[index.column()], + node + ) + ) + # self.rows[index.row()][self.headers[index.column()]] = node + elif self.headers[index.column()] == "enable": + self._undo.push( + EnableEdgeCommand( + self.rows[index.row()], value + ) + ) else: - self.rows[index.row()][self.headers[index.column()]] = value + self._undo.push( + SetCommand( + self.rows[index.row()], + self.headers[index.column()], + value + ) + ) + # self.rows[index.row()][self.headers[index.column()]] = value self.dataChanged.emit(index, index, [Qt.DisplayRole]) self.layoutChanged.emit() diff --git a/src/View/Network/UndoCommand.py b/src/View/Network/UndoCommand.py new file mode 100644 index 00000000..f845ed81 --- /dev/null +++ b/src/View/Network/UndoCommand.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- + +from copy import deepcopy +from tools import trace, timer + +from PyQt5.QtWidgets import ( + QMessageBox, QUndoCommand, QUndoStack, +) + +from Model.Network.Node import Node +from Model.Network.Edge import Edge +from Model.Network.Graph import Graph + +class SetCommand(QUndoCommand): + def __init__(self, element, column, new_value): + QUndoCommand.__init__(self) + + self._el = element + self._column = column + self._old = self._el[self._column] + self._new = new_value + + def undo(self): + self._el[self._column] = self._old + + def redo(self): + self._el[self._column] = self._new + +class EnableEdgeCommand(QUndoCommand): + def __init__(self, edge, enable): + QUndoCommand.__init__(self) + + self._edge = edge + self._old = self._edge._enable + self._enable = enable + + def undo(self): + self._edge.enable(enable = self._old) + + def redo(self): + self._edge.enable(enable = self._enable) + +class ReverseEdgeCommand(QUndoCommand): + def __init__(self, edge): + QUndoCommand.__init__(self) + + self._edge = edge + + def undo(self): + self._edge.reverse() + + def redo(self): + self._edge.reverse() diff --git a/src/View/Network/Window.py b/src/View/Network/Window.py index f3df8c15..8fdf3988 100644 --- a/src/View/Network/Window.py +++ b/src/View/Network/Window.py @@ -33,7 +33,9 @@ class NetworkWindow(ASubMainWindow): self.setup_title() - super(NetworkWindow, self).__init__(name=self._title, ui="Network", parent=parent) + super(NetworkWindow, self).__init__( + name=self._title, ui="Network", parent=parent + ) self.ui.setWindowTitle(self._title) self.setup_sc() -- GitLab