From f2f9289911b530f7b9dbae36a8c252cf50fb69bc Mon Sep 17 00:00:00 2001
From: Oscar Gustafsson <oscar.gustafsson@gmail.com>
Date: Mon, 8 May 2023 10:38:37 +0200
Subject: [PATCH] Swap operation redraws schedule

---
 b_asic/schedule.py                      | 13 +++++++++++++
 b_asic/scheduler_gui/main_window.py     |  8 ++++++++
 b_asic/scheduler_gui/operation_item.py  |  3 ++-
 b_asic/scheduler_gui/scheduler_event.py |  2 ++
 b_asic/scheduler_gui/scheduler_item.py  |  7 +++++++
 5 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/b_asic/schedule.py b/b_asic/schedule.py
index 237430a3..5d7c11c2 100644
--- a/b_asic/schedule.py
+++ b/b_asic/schedule.py
@@ -345,6 +345,19 @@ class Schedule:
         self._schedule_time = time
         return self
 
+    def swap_io_of_operation(self, operation_id: GraphID) -> None:
+        """
+        Swap the inputs (and outputs) of operation.
+
+        Parameters
+        ----------
+        operation_id : GraphID
+            The GraphID of the operation to swap.
+
+        """
+        self._original_sfg.swap_io_of_operation(operation_id)
+        self._sfg.swap_io_of_operation(operation_id)
+
     @property
     def sfg(self) -> SFG:
         """The SFG of the current schedule."""
diff --git a/b_asic/scheduler_gui/main_window.py b/b_asic/scheduler_gui/main_window.py
index ca021deb..a182ad2e 100644
--- a/b_asic/scheduler_gui/main_window.py
+++ b/b_asic/scheduler_gui/main_window.py
@@ -245,6 +245,7 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
             if factor > 1:
                 self.schedule.increase_time_resolution(factor)
                 self.open(self.schedule)
+                print(f"schedule.increase_time_resolution({factor})")
                 self.update_statusbar(f"Time resolution increased by a factor {factor}")
         else:  # Cancelled
             self.update_statusbar("Cancelled")
@@ -263,6 +264,7 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
             if int(factor) > 1:
                 self.schedule.decrease_time_resolution(int(factor))
                 self.open(self.schedule)
+                print(f"schedule.decrease_time_resolution({factor})")
                 self.update_statusbar(f"Time resolution decreased by a factor {factor}")
         else:  # Cancelled
             self.update_statusbar("Cancelled")
@@ -392,6 +394,7 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
             self._graph._signals.schedule_time_changed.disconnect(
                 self.info_table_update_schedule
             )
+            self._graph._signals.reopen.disconnect(self._reopen_schedule)
             self._graph.removeSceneEventFilters(self._graph.event_items)
             self._scene.removeItem(self._graph)
             self.menu_close_schedule.setEnabled(False)
@@ -638,12 +641,17 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
             self.info_table_update_schedule
         )
         self._graph._signals.redraw_all.connect(self._redraw_all)
+        self._graph._signals.reopen.connect(self._reopen_schedule)
         self.info_table_fill_schedule(self._schedule)
         self.update_statusbar(self.tr("Schedule loaded successfully"))
 
     def _redraw_all(self) -> None:
         self._graph._redraw_all()
 
+    @Slot()
+    def _reopen_schedule(self) -> None:
+        self.open(self._schedule)
+
     def update_statusbar(self, msg: str) -> None:
         """
         Write *msg* to the statusbar with temporarily policy.
diff --git a/b_asic/scheduler_gui/operation_item.py b/b_asic/scheduler_gui/operation_item.py
index 258934a4..e960997a 100644
--- a/b_asic/scheduler_gui/operation_item.py
+++ b/b_asic/scheduler_gui/operation_item.py
@@ -83,6 +83,7 @@ class OperationItem(QGraphicsItemGroup):
         self._end_time = max(latency_offsets.values())
         self._port_items = []
         self._port_number_items = []
+        self._parent = parent
 
         self.setFlag(QGraphicsItem.ItemIsMovable)  # mouse move events
         self.setFlag(QGraphicsItem.ItemIsSelectable)  # mouse move events
@@ -311,4 +312,4 @@ class OperationItem(QGraphicsItemGroup):
         menu.exec_(self.cursor().pos())
 
     def _swap_io(self, event=None) -> None:
-        self._operation.swap_io()
+        self._parent._swap_io_of_operation(self._operation.graph_id)
diff --git a/b_asic/scheduler_gui/scheduler_event.py b/b_asic/scheduler_gui/scheduler_event.py
index 1270e5ff..b7fce257 100644
--- a/b_asic/scheduler_gui/scheduler_event.py
+++ b/b_asic/scheduler_gui/scheduler_event.py
@@ -37,6 +37,7 @@ class SchedulerEvent:  # PyQt5
         schedule_time_changed = Signal()
         component_moved = Signal(str)
         redraw_all = Signal()
+        reopen = Signal()
 
     _axes: Optional[AxesItem]
     _current_pos: QPointF
@@ -191,6 +192,7 @@ class SchedulerEvent:  # PyQt5
             event.accept()
         else:  # Right-button
             item._open_context_menu()
+            self._signals.redraw_all.emit()
 
     def operation_mouseReleaseEvent(self, event: QGraphicsSceneMouseEvent) -> None:
         """Change the cursor to OpenHandCursor when releasing an object."""
diff --git a/b_asic/scheduler_gui/scheduler_item.py b/b_asic/scheduler_gui/scheduler_item.py
index 988fccca..8c80d33f 100644
--- a/b_asic/scheduler_gui/scheduler_item.py
+++ b/b_asic/scheduler_gui/scheduler_item.py
@@ -258,6 +258,8 @@ class SchedulerItem(SchedulerEvent, QGraphicsItemGroup):  # PySide2 / PyQt5
         if self.schedule is None:
             raise ValueError("No schedule installed.")
         self.schedule.set_schedule_time(self.schedule.schedule_time + delta_time)
+        if delta_time:
+            print(f"schedule.set_schedule_time({self.schedule.schedule_time})")
         self._axes.set_width(self._axes.width + delta_time)
         # Redraw all lines
         self._redraw_all_lines()
@@ -352,5 +354,10 @@ class SchedulerItem(SchedulerEvent, QGraphicsItemGroup):  # PySide2 / PyQt5
                     self._signal_dict[component].add(gui_signal)
                     self._signal_dict[destination_component].add(gui_signal)
 
+    def _swap_io_of_operation(self, graph_id: str) -> None:
+        self._schedule.swap_io_of_operation(graph_id)
+        print(f"schedule.swap_io_of_operation({graph_id!r})")
+        self._signals.reopen.emit()
+
 
 pprint(SchedulerItem.__mro__)
-- 
GitLab