blob: 73f0460aa54d53745b67d1450b495d726ff55ec7 [file] [log] [blame]
John Park91e69732019-03-03 13:12:43 -08001#!/usr/bin/python3
2import gi
3from path_edit import *
4import numpy as np
5gi.require_version('Gtk', '3.0')
6from gi.repository import Gdk, Gtk, GLib
7import cairo
vlad56329f42020-06-12 21:41:08 -07008import basic_window
John Park91e69732019-03-03 13:12:43 -08009
Ravago Jones26f7ad02021-02-05 15:45:59 -080010
John Park91e69732019-03-03 13:12:43 -080011class GridWindow(Gtk.Window):
12 def method_connect(self, event, cb):
13 def handler(obj, *args):
14 cb(*args)
15
John Park91e69732019-03-03 13:12:43 -080016 self.connect(event, handler)
17
18 def mouse_move(self, event):
James Kuszmaulb2b89b22020-02-29 13:27:05 -080019 # Changes event.x and event.y to be relative to the center.
John Park91e69732019-03-03 13:12:43 -080020 x = event.x - self.drawing_area.window_shape[0] / 2
21 y = self.drawing_area.window_shape[1] / 2 - event.y
22 scale = self.drawing_area.get_current_scale()
23 event.x = x / scale + self.drawing_area.center[0]
24 event.y = y / scale + self.drawing_area.center[1]
25 self.drawing_area.mouse_move(event)
26 self.queue_draw()
27
28 def button_press(self, event):
James Kuszmaulb2b89b22020-02-29 13:27:05 -080029 original_x = event.x
30 original_y = event.y
John Park91e69732019-03-03 13:12:43 -080031 x = event.x - self.drawing_area.window_shape[0] / 2
32 y = self.drawing_area.window_shape[1] / 2 - event.y
33 scale = 2 * self.drawing_area.get_current_scale()
34 event.x = x / scale + self.drawing_area.center[0]
35 event.y = y / scale + self.drawing_area.center[1]
36 self.drawing_area.do_button_press(event)
James Kuszmaulb2b89b22020-02-29 13:27:05 -080037 event.x = original_x
38 event.y = original_y
John Park91e69732019-03-03 13:12:43 -080039
40 def key_press(self, event):
John Park91e69732019-03-03 13:12:43 -080041 self.drawing_area.do_key_press(event, self.file_name_box.get_text())
42 self.queue_draw()
43
44 def configure(self, event):
John Park91e69732019-03-03 13:12:43 -080045 self.drawing_area.window_shape = (event.width, event.height)
46
John Park909c0392020-03-05 23:56:30 -080047 def output_json_clicked(self, button):
48 print("OUTPUT JSON CLICKED")
49 self.drawing_area.export_json(self.file_name_box.get_text())
50
51 def input_json_clicked(self, button):
52 print("INPUT JSON CLICKED")
53 self.drawing_area.import_json(self.file_name_box.get_text())
kyle96e46e12021-02-10 21:47:55 -080054 self.long_input.set_value(
55 self.drawing_area.points.getConstraint(
56 "LONGITUDINAL_ACCELERATION"))
57 self.lat_input.set_value(
58 self.drawing_area.points.getConstraint("LATERAL_ACCELERATION"))
59 self.vol_input.set_value(
60 self.drawing_area.points.getConstraint("VOLTAGE"))
John Park91e69732019-03-03 13:12:43 -080061
kyle0e5a9f32021-01-23 15:02:19 -080062 def long_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080063 value = self.long_input.get_value()
64 self.drawing_area.points.setConstraint("LONGITUDINAL_ACCELERATION",
65 value)
kyle0e5a9f32021-01-23 15:02:19 -080066
67 def lat_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080068 value = self.lat_input.get_value()
69 self.drawing_area.points.setConstraint("LATERAL_ACCELERATION", value)
kyle0e5a9f32021-01-23 15:02:19 -080070
kyle96e46e12021-02-10 21:47:55 -080071 def vel_changed(self, button):
72 value = self.vel_input.get_value()
kyle0e5a9f32021-01-23 15:02:19 -080073
74 def vol_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080075 value = self.vol_input.get_value()
76 self.drawing_area.points.setConstraint("VOLTAGE", value)
kyle0e5a9f32021-01-23 15:02:19 -080077
John Park91e69732019-03-03 13:12:43 -080078 def __init__(self):
79 Gtk.Window.__init__(self)
80
81 self.set_default_size(1.5 * SCREEN_SIZE, SCREEN_SIZE)
82
83 flowBox = Gtk.FlowBox()
84 flowBox.set_valign(Gtk.Align.START)
85 flowBox.set_selection_mode(Gtk.SelectionMode.NONE)
86
87 flowBox.set_valign(Gtk.Align.START)
88
89 self.add(flowBox)
90
91 container = Gtk.Fixed()
92 flowBox.add(container)
93
94 self.eventBox = Gtk.EventBox()
95 container.add(self.eventBox)
96
97 self.eventBox.set_events(Gdk.EventMask.BUTTON_PRESS_MASK
98 | Gdk.EventMask.BUTTON_RELEASE_MASK
99 | Gdk.EventMask.POINTER_MOTION_MASK
100 | Gdk.EventMask.SCROLL_MASK
101 | Gdk.EventMask.KEY_PRESS_MASK)
102
103 #add the graph box
104 self.drawing_area = GTK_Widget()
105 self.eventBox.add(self.drawing_area)
106
vlad56329f42020-06-12 21:41:08 -0700107 self.method_connect("delete-event", basic_window.quit_main_loop)
John Park91e69732019-03-03 13:12:43 -0800108 self.method_connect("key-release-event", self.key_press)
109 self.method_connect("button-release-event", self.button_press)
110 self.method_connect("configure-event", self.configure)
111 self.method_connect("motion_notify_event", self.mouse_move)
112
113 self.file_name_box = Gtk.Entry()
114 self.file_name_box.set_size_request(200, 40)
115
James Kuszmaulb2b89b22020-02-29 13:27:05 -0800116 self.file_name_box.set_text("output_file_name.json")
John Park91e69732019-03-03 13:12:43 -0800117 self.file_name_box.set_editable(True)
118
119 container.put(self.file_name_box, 0, 0)
120
kyle0e5a9f32021-01-23 15:02:19 -0800121 self.long_input = Gtk.SpinButton()
122 self.long_input.set_size_request(100, 20)
123 self.long_input.set_numeric(True)
kyle96e46e12021-02-10 21:47:55 -0800124 self.long_input.set_range(0, 5)
125 self.long_input.set_digits(3)
126 self.long_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800127 self.long_input.connect("value-changed", self.long_changed)
128 self.long_label = Gtk.Label()
kyle96e46e12021-02-10 21:47:55 -0800129 self.long_label.set_text("Longitudinal Acceleration Restriction")
130 self.long_input.set_value(
131 self.drawing_area.points.getConstraint(
132 "LONGITUDINAL_ACCELERATION"))
kyle0e5a9f32021-01-23 15:02:19 -0800133
134 self.lat_input = Gtk.SpinButton()
135 self.lat_input.set_size_request(100, 20)
136 self.lat_input.set_numeric(True)
kyle96e46e12021-02-10 21:47:55 -0800137 self.lat_input.set_range(0, 5)
138 self.lat_input.set_digits(3)
139 self.lat_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800140 self.lat_input.connect("value-changed", self.lat_changed)
141 self.lat_label = Gtk.Label()
kyle96e46e12021-02-10 21:47:55 -0800142 self.lat_label.set_text("Lateral Acceleration Restriction")
143 self.lat_input.set_value(
144 self.drawing_area.points.getConstraint("LATERAL_ACCELERATION"))
kyle0e5a9f32021-01-23 15:02:19 -0800145
kyle96e46e12021-02-10 21:47:55 -0800146 self.vel_input = Gtk.SpinButton()
147 self.vel_input.set_size_request(100, 20)
148 self.vel_input.set_numeric(True)
149 self.vel_input.set_range(0, 10)
150 self.vel_input.set_digits(3)
151 self.vel_input.set_increments(0.1, 100)
152 self.vel_input.connect("value-changed", self.vel_changed)
153 self.vel_label = Gtk.Label()
154 self.vel_label.set_text(
155 "Velocity Restriction"
156 ) #note: the velocity restrictions are not yet working, they need to be hooked up later
kyle0e5a9f32021-01-23 15:02:19 -0800157
158 self.vol_input = Gtk.SpinButton()
159 self.vol_input.set_size_request(100, 20)
160 self.vol_input.set_numeric(True)
kyle96e46e12021-02-10 21:47:55 -0800161 self.vol_input.set_range(0, 12)
162 self.vol_input.set_digits(3)
163 self.vol_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800164 self.vol_input.connect("value-changed", self.vol_changed)
kyle0e5a9f32021-01-23 15:02:19 -0800165 self.vol_label = Gtk.Label()
166 self.vol_label.set_text("Voltage Restriction")
kyle96e46e12021-02-10 21:47:55 -0800167 self.vol_input.set_value(
168 self.drawing_area.points.getConstraint("VOLTAGE"))
kyle0e5a9f32021-01-23 15:02:19 -0800169
170 container.put(self.long_input, 0, 60)
171 container.put(self.lat_input, 0, 110)
kyle96e46e12021-02-10 21:47:55 -0800172 container.put(self.vel_input, 0, 160)
kyle0e5a9f32021-01-23 15:02:19 -0800173 container.put(self.vol_input, 0, 210)
174 container.put(self.long_label, 0, 40)
175 container.put(self.lat_label, 0, 90)
kyle96e46e12021-02-10 21:47:55 -0800176 container.put(self.vel_label, 0, 140)
kyle0e5a9f32021-01-23 15:02:19 -0800177 container.put(self.vol_label, 0, 190)
178
John Park909c0392020-03-05 23:56:30 -0800179 self.output_json = Gtk.Button.new_with_label("Output")
180 self.output_json.set_size_request(100, 40)
181 self.output_json.connect("clicked", self.output_json_clicked)
182
183 self.input_json = Gtk.Button.new_with_label("Import")
184 self.input_json.set_size_request(100, 40)
185 self.input_json.connect("clicked", self.input_json_clicked)
186
187 container.put(self.output_json, 210, 0)
188 container.put(self.input_json, 320, 0)
189
John Park91e69732019-03-03 13:12:43 -0800190 self.show_all()
191
192
193window = GridWindow()
194RunApp()