Network: Connect first undo command.

mesh
Pierre-Antoine Rouby 2023-06-08 16:09:00 +02:00
parent 454b5049d2
commit a44dc91ae9
4 changed files with 92 additions and 5 deletions

View File

@ -21,6 +21,8 @@ from Model.Network.Node import Node
from Model.Network.Edge import Edge from Model.Network.Edge import Edge
from Model.Network.Graph import Graph from Model.Network.Graph import Graph
from View.Network.UndoCommand import *
_translate = QCoreApplication.translate _translate = QCoreApplication.translate
@ -424,13 +426,21 @@ class GraphWidget(QGraphicsView):
self.texts[i].rename() self.texts[i].rename()
def enable_edge(self, edge, prev): 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.changeEdge.emit(self.sender())
self.changeNode.emit(self.sender()) self.changeNode.emit(self.sender())
self.display_update() self.display_update()
def reverse_edge(self, edge): def reverse_edge(self, edge):
edge.edge.reverse() self._undo.push(
ReverseEdgeCommand(
edge.edge
)
)
self.changeEdge.emit(self.sender()) self.changeEdge.emit(self.sender())
self.display_update() self.display_update()

View File

@ -5,6 +5,7 @@ from Model.Network.Edge import Edge
from Model.Network.Graph import Graph from Model.Network.Graph import Graph
from View.ASubWindow import ASubWindow from View.ASubWindow import ASubWindow
from View.Network.GraphWidget import GraphWidget from View.Network.GraphWidget import GraphWidget
from View.Network.UndoCommand import *
from PyQt5.QtCore import ( from PyQt5.QtCore import (
Qt, QRect, QVariant, QAbstractTableModel, pyqtSlot, pyqtSignal, Qt, QRect, QVariant, QAbstractTableModel, pyqtSlot, pyqtSignal,
@ -17,6 +18,7 @@ from PyQt5.QtWidgets import (
QApplication, QApplication,
) )
class ComboBoxDelegate(QItemDelegate): class ComboBoxDelegate(QItemDelegate):
def __init__(self, graph=None, parent=None): def __init__(self, graph=None, parent=None):
super(ComboBoxDelegate, self).__init__(parent) super(ComboBoxDelegate, self).__init__(parent)
@ -140,9 +142,29 @@ class GraphTableModel(QAbstractTableModel):
if (self.headers[index.column()] == "node1" or if (self.headers[index.column()] == "node1" or
self.headers[index.column()] == "node2"): self.headers[index.column()] == "node2"):
node = self.graph.node(value) 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: 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.dataChanged.emit(index, index, [Qt.DisplayRole])
self.layoutChanged.emit() self.layoutChanged.emit()

View File

@ -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()

View File

@ -33,7 +33,9 @@ class NetworkWindow(ASubMainWindow):
self.setup_title() 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.ui.setWindowTitle(self._title)
self.setup_sc() self.setup_sc()