From d3e9250ea47f189c82da3aa3252e6bc5e25a80df Mon Sep 17 00:00:00 2001
From: Oscar Gustafsson <oscar.gustafsson@gmail.com>
Date: Mon, 23 Jan 2023 16:05:12 +0100
Subject: [PATCH] Fix reverse wrapping

---
 b_asic/scheduler_gui/graphics_graph_event.py |  6 ++++
 b_asic/scheduler_gui/graphics_graph_item.py  | 29 ++++++++++++--------
 2 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/b_asic/scheduler_gui/graphics_graph_event.py b/b_asic/scheduler_gui/graphics_graph_event.py
index 7af6938a..8f06d4b0 100644
--- a/b_asic/scheduler_gui/graphics_graph_event.py
+++ b/b_asic/scheduler_gui/graphics_graph_event.py
@@ -229,8 +229,14 @@ class GraphicsGraphEvent:  # PyQt5
         self.set_item_inactive(item)
         self.set_new_starttime(item)
         pos = item.x()
+        redraw = False
+        if pos < 0:
+            pos += self.schedule.schedule_time
+            redraw = True
         if pos > self.schedule.schedule_time:
             pos = pos % self.schedule.schedule_time
+            redraw = True
+        if redraw:
             item.setX(pos)
             self._redraw_lines(item)
 
diff --git a/b_asic/scheduler_gui/graphics_graph_item.py b/b_asic/scheduler_gui/graphics_graph_item.py
index 053b67e5..07d83fa1 100644
--- a/b_asic/scheduler_gui/graphics_graph_item.py
+++ b/b_asic/scheduler_gui/graphics_graph_item.py
@@ -79,19 +79,20 @@ class GraphicsGraphItem(
         slacks = self.schedule.slacks(item.op_id)
         op_start_time = self.schedule.start_time_of_operation(item.op_id)
         if not -slacks[0] <= new_start_time - op_start_time <= slacks[1]:
+            # Cannot move due to dependencies
             return False
-        if pos < 0:
-            return False
-        if (
-            self.schedule.cyclic
-            and new_start_time > self.schedule.schedule_time + 1
-        ):
-            return False
-        if (
-            not self.schedule.cyclic
-            and new_start_time + end_time > self.schedule.schedule_time + 1
-        ):
-            return False
+        if self.schedule.cyclic:
+            if new_start_time < -1:
+                # Moving one position before left edge => wrap
+                return False
+            if new_start_time > self.schedule.schedule_time + 1:
+                # Moving one position after schedule_time => wrap
+                return False
+        else:
+            if pos < 0:
+                return False
+            if new_start_time + end_time > self.schedule.schedule_time:
+                return False
 
         return True
 
@@ -137,6 +138,10 @@ class GraphicsGraphItem(
             self.schedule.schedule_time + delta_time
         )
         self._axes.set_width(self._axes.width + delta_time)
+        # Redraw all lines
+        for signals in self._signal_dict.values():
+            for signal in signals:
+                signal.update_path()
 
     @property
     def schedule(self) -> Schedule:
-- 
GitLab