Added undo button to spline UI

Signed-off-by: Ryan Yin <100028731@mvla.net>
Change-Id: I39a2f1ea9695206fba78cbe1c0c4dbbe525c469f
diff --git a/frc971/control_loops/python/path_edit.py b/frc971/control_loops/python/path_edit.py
index bf54f60..414245e 100755
--- a/frc971/control_loops/python/path_edit.py
+++ b/frc971/control_loops/python/path_edit.py
@@ -40,7 +40,8 @@
         self.graph = Graph()
         self.set_vexpand(True)
         self.set_hexpand(True)
-
+        # list of multisplines
+        self.multispline_stack = []
         # init field drawing
         # add default spline for testing purposes
         # init editing / viewing modes and pointer location
@@ -331,7 +332,14 @@
         self.queue_draw()
         self.graph.schedule_recalculate(self.points)
 
-    def clear_graph(self):
+    def attempt_append_multispline(self):
+        if (len(self.multispline_stack) == 0 or
+        self.points.toMultiSpline() != self.multispline_stack[-1]):
+            self.multispline_stack.append(self.points.toMultiSpline())
+
+    def clear_graph(self, should_attempt_append=True):
+        if should_attempt_append:
+            self.attempt_append_multispline()
         self.points = Points()
         #recalulate graph using new points
         self.graph.axis.clear()
@@ -340,11 +348,31 @@
         self.mode = Mode.kPlacing
         #redraw entire graph
         self.queue_draw()
-        #TODO: Make a way to undo clear
+
+
+    def undo(self):
+        try:
+            self.multispline_stack.pop()
+        except IndexError:
+            return
+        if len(self.multispline_stack) == 0:
+            self.clear_graph(should_attempt_append=False) #clear, don't do anything
+            return
+        multispline = self.multispline_stack[-1]
+        if multispline['spline_count'] > 0:
+            self.points.fromMultiSpline(multispline)
+            self.mode= Mode.kEditing
+        else:
+            self.mode = Mode.kPlacing
+            self.clear_graph(should_attempt_append=False)
+        self.queue_draw()
+
+
 
     def do_key_press_event(self, event):
         keyval = Gdk.keyval_to_lower(event.keyval)
-
+        if keyval == Gdk.KEY_z and event.state & Gdk.ModifierType.CONTROL_MASK:
+            self.undo()
         # TODO: This should be a button
         if keyval == Gdk.KEY_p:
             self.mode = Mode.kPlacing
@@ -360,6 +388,7 @@
             self.queue_draw()
 
     def do_button_release_event(self, event):
+        self.attempt_append_multispline()
         self.mousex, self.mousey = self.input_transform.transform_point(
             event.x, event.y)
         if self.mode == Mode.kEditing: