diff --git a/b_asic/schedule.py b/b_asic/schedule.py index 237430a32daaa1fc2bd2fd3650cff01c7f5a615e..5d7c11c21e2f90bd37078146a4d2f3e7c7430541 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 ca021deb566638656b379b41f0408ac177f111fd..a182ad2ee6ee1a52f7292862442c52892ce340c4 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 258934a49c9718dc146b610468f4eaf9a9a96219..e960997add05a8919f8a718bb2b0d2fa7385bd34 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 1270e5ff6c742ccb885ec3648d0df66fbfd0087e..b7fce2575050268b12ca444fbf00eec0121e9879 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 988fccca5543f232852997822bbd4bffe722b161..8c80d33f2e9444bb866445356d5efa088c1711b8 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__)