blob: f10746f314429f0601257d52cd0c86ddbae30525 [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
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -080078 def input_combobox_choice(self, combo):
79 text = combo.get_active_text()
80 if text is not None:
81 print("Combo Clicked on: " + text)
82 set_field(text)
83
John Park91e69732019-03-03 13:12:43 -080084 def __init__(self):
85 Gtk.Window.__init__(self)
86
87 self.set_default_size(1.5 * SCREEN_SIZE, SCREEN_SIZE)
88
89 flowBox = Gtk.FlowBox()
90 flowBox.set_valign(Gtk.Align.START)
91 flowBox.set_selection_mode(Gtk.SelectionMode.NONE)
92
93 flowBox.set_valign(Gtk.Align.START)
94
95 self.add(flowBox)
96
97 container = Gtk.Fixed()
98 flowBox.add(container)
99
100 self.eventBox = Gtk.EventBox()
101 container.add(self.eventBox)
102
103 self.eventBox.set_events(Gdk.EventMask.BUTTON_PRESS_MASK
104 | Gdk.EventMask.BUTTON_RELEASE_MASK
105 | Gdk.EventMask.POINTER_MOTION_MASK
106 | Gdk.EventMask.SCROLL_MASK
107 | Gdk.EventMask.KEY_PRESS_MASK)
108
109 #add the graph box
110 self.drawing_area = GTK_Widget()
111 self.eventBox.add(self.drawing_area)
112
vlad56329f42020-06-12 21:41:08 -0700113 self.method_connect("delete-event", basic_window.quit_main_loop)
John Park91e69732019-03-03 13:12:43 -0800114 self.method_connect("key-release-event", self.key_press)
115 self.method_connect("button-release-event", self.button_press)
116 self.method_connect("configure-event", self.configure)
117 self.method_connect("motion_notify_event", self.mouse_move)
118
119 self.file_name_box = Gtk.Entry()
120 self.file_name_box.set_size_request(200, 40)
121
Ravago Jonesab49f432021-03-03 21:18:49 -0800122 self.file_name_box.set_text(FIELD.json_name)
John Park91e69732019-03-03 13:12:43 -0800123 self.file_name_box.set_editable(True)
124
125 container.put(self.file_name_box, 0, 0)
126
kyle0e5a9f32021-01-23 15:02:19 -0800127 self.long_input = Gtk.SpinButton()
128 self.long_input.set_size_request(100, 20)
129 self.long_input.set_numeric(True)
kyle96e46e12021-02-10 21:47:55 -0800130 self.long_input.set_range(0, 5)
131 self.long_input.set_digits(3)
132 self.long_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800133 self.long_input.connect("value-changed", self.long_changed)
134 self.long_label = Gtk.Label()
kyle96e46e12021-02-10 21:47:55 -0800135 self.long_label.set_text("Longitudinal Acceleration Restriction")
136 self.long_input.set_value(
137 self.drawing_area.points.getConstraint(
138 "LONGITUDINAL_ACCELERATION"))
kyle0e5a9f32021-01-23 15:02:19 -0800139
140 self.lat_input = Gtk.SpinButton()
141 self.lat_input.set_size_request(100, 20)
142 self.lat_input.set_numeric(True)
kyle96e46e12021-02-10 21:47:55 -0800143 self.lat_input.set_range(0, 5)
144 self.lat_input.set_digits(3)
145 self.lat_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800146 self.lat_input.connect("value-changed", self.lat_changed)
147 self.lat_label = Gtk.Label()
kyle96e46e12021-02-10 21:47:55 -0800148 self.lat_label.set_text("Lateral Acceleration Restriction")
149 self.lat_input.set_value(
150 self.drawing_area.points.getConstraint("LATERAL_ACCELERATION"))
kyle0e5a9f32021-01-23 15:02:19 -0800151
kyle96e46e12021-02-10 21:47:55 -0800152 self.vel_input = Gtk.SpinButton()
153 self.vel_input.set_size_request(100, 20)
154 self.vel_input.set_numeric(True)
155 self.vel_input.set_range(0, 10)
156 self.vel_input.set_digits(3)
157 self.vel_input.set_increments(0.1, 100)
158 self.vel_input.connect("value-changed", self.vel_changed)
159 self.vel_label = Gtk.Label()
160 self.vel_label.set_text(
161 "Velocity Restriction"
162 ) #note: the velocity restrictions are not yet working, they need to be hooked up later
kyle0e5a9f32021-01-23 15:02:19 -0800163
164 self.vol_input = Gtk.SpinButton()
165 self.vol_input.set_size_request(100, 20)
166 self.vol_input.set_numeric(True)
kyle96e46e12021-02-10 21:47:55 -0800167 self.vol_input.set_range(0, 12)
168 self.vol_input.set_digits(3)
169 self.vol_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800170 self.vol_input.connect("value-changed", self.vol_changed)
kyle0e5a9f32021-01-23 15:02:19 -0800171 self.vol_label = Gtk.Label()
172 self.vol_label.set_text("Voltage Restriction")
kyle96e46e12021-02-10 21:47:55 -0800173 self.vol_input.set_value(
174 self.drawing_area.points.getConstraint("VOLTAGE"))
kyle0e5a9f32021-01-23 15:02:19 -0800175
176 container.put(self.long_input, 0, 60)
177 container.put(self.lat_input, 0, 110)
kyle96e46e12021-02-10 21:47:55 -0800178 container.put(self.vel_input, 0, 160)
kyle0e5a9f32021-01-23 15:02:19 -0800179 container.put(self.vol_input, 0, 210)
180 container.put(self.long_label, 0, 40)
181 container.put(self.lat_label, 0, 90)
kyle96e46e12021-02-10 21:47:55 -0800182 container.put(self.vel_label, 0, 140)
kyle0e5a9f32021-01-23 15:02:19 -0800183 container.put(self.vol_label, 0, 190)
184
John Park909c0392020-03-05 23:56:30 -0800185 self.output_json = Gtk.Button.new_with_label("Output")
186 self.output_json.set_size_request(100, 40)
187 self.output_json.connect("clicked", self.output_json_clicked)
188
189 self.input_json = Gtk.Button.new_with_label("Import")
190 self.input_json.set_size_request(100, 40)
191 self.input_json.connect("clicked", self.input_json_clicked)
192
193 container.put(self.output_json, 210, 0)
194 container.put(self.input_json, 320, 0)
195
John Park91e69732019-03-03 13:12:43 -0800196
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800197 #Dropdown feature
198 self.label = Gtk.Label("Change Map:")
199 self.label.set_size_request(100,40)
200 container.put(self.label,430,0)
201
202 game_store = Gtk.ListStore(str)
203 games = [
204 "2020 Field",
205 "2019 Field",
206 "2021 Galactic Search ARed",
207 "2021 Galactic Search ABlue",
208 "2021 Galactic Search BRed",
209 "2021 Galactic Search BBlue",
210 "2021 AutoNav Barrel Racing",
211 "2021 AutoNav Slalom",
212 "2021 AutoNav Bounce",
213 ]
214
215 self.game_combo = Gtk.ComboBoxText()
216 self.game_combo.set_entry_text_column(0)
217 self.game_combo.connect("changed", self.input_combobox_choice)
218
219 for game in games:
220 self.game_combo.append_text(game)
221
222 self.game_combo.set_active(0)
223 self.game_combo.set_size_request(100,40)
224 container.put(self.game_combo,440,30)
225
226 self.show_all()
John Park91e69732019-03-03 13:12:43 -0800227
228window = GridWindow()
229RunApp()