blob: 666710e4d104a491999e86d91de0c5b8a033011d [file] [log] [blame]
John Park91e69732019-03-03 13:12:43 -08001#!/usr/bin/python3
Ravago Jones6d460fe2021-07-03 16:59:55 -07002
3# matplotlib overrides fontconfig locations, so has to be imported before gtk
4import matplotlib
John Park91e69732019-03-03 13:12:43 -08005import gi
Ravago Jones6d460fe2021-07-03 16:59:55 -07006from path_edit import FieldWidget
Jason Anderson-Youngb3378152022-10-26 20:07:37 -07007from path_edit import Mode # still being tested
Ravago Jones6d460fe2021-07-03 16:59:55 -07008from basic_window import RunApp
9from constants import FIELDS, FIELD, SCREEN_SIZE
Ravago Jones5127ccc2022-07-31 16:32:45 -070010
John Park91e69732019-03-03 13:12:43 -080011gi.require_version('Gtk', '3.0')
12from gi.repository import Gdk, Gtk, GLib
13import cairo
vlad56329f42020-06-12 21:41:08 -070014import basic_window
Ravago Jones6d460fe2021-07-03 16:59:55 -070015import os
Ravago Jones26f7ad02021-02-05 15:45:59 -080016
Ravago Jones36c92f02021-07-24 16:35:33 -070017
John Park91e69732019-03-03 13:12:43 -080018class GridWindow(Gtk.Window):
Ravago Jones5127ccc2022-07-31 16:32:45 -070019
John Park91e69732019-03-03 13:12:43 -080020 def method_connect(self, event, cb):
Ravago Jones5127ccc2022-07-31 16:32:45 -070021
John Park91e69732019-03-03 13:12:43 -080022 def handler(obj, *args):
23 cb(*args)
24
John Park91e69732019-03-03 13:12:43 -080025 self.connect(event, handler)
26
Ryan Yin85f861f2021-09-16 17:55:11 -070027 def clear_clicked(self, button):
Ravago Jonesfa8da562022-07-02 18:10:22 -070028 self.field.clear()
Ryan Yin85f861f2021-09-16 17:55:11 -070029
Jason Anderson-Youngb3378152022-10-26 20:07:37 -070030 def toggle_view_clicked(self, button):
31 temp_variable = self.field.mode
32
33 if self.field.mode != Mode.kViewing:
34 self.field.mode = Mode.kViewing
milind-u0f9c2112023-03-11 20:36:19 -080035 self.field.queue_draw()
Jason Anderson-Youngb3378152022-10-26 20:07:37 -070036 Gtk.Button.set_label(self.toggle_view, "Switch to Editing Mode")
37
38 else:
39 self.field.mode = self.field.previous_mode
milind-u0f9c2112023-03-11 20:36:19 -080040 self.field.queue_draw()
Jason Anderson-Youngb3378152022-10-26 20:07:37 -070041 if self.field.mode == Mode.kEditing:
42 Gtk.Button.set_label(self.toggle_view,
43 "Switch to Viewing Mode")
44
45 self.field.previous_mode = temp_variable
46
John Park909c0392020-03-05 23:56:30 -080047 def output_json_clicked(self, button):
Ravago Jones6d460fe2021-07-03 16:59:55 -070048 self.field.export_json(self.file_name_box.get_text())
John Park909c0392020-03-05 23:56:30 -080049
50 def input_json_clicked(self, button):
Ravago Jones6d460fe2021-07-03 16:59:55 -070051 self.field.import_json(self.file_name_box.get_text())
kyle96e46e12021-02-10 21:47:55 -080052 self.long_input.set_value(
Ravago Jonesfa8da562022-07-02 18:10:22 -070053 self.field.active_multispline.getConstraint(
54 "LONGITUDINAL_ACCELERATION"))
kyle96e46e12021-02-10 21:47:55 -080055 self.lat_input.set_value(
Ravago Jonesfa8da562022-07-02 18:10:22 -070056 self.field.active_multispline.getConstraint(
57 "LATERAL_ACCELERATION"))
58 self.vol_input.set_value(
59 self.field.active_multispline.getConstraint("VOLTAGE"))
John Park91e69732019-03-03 13:12:43 -080060
Ryan Yind8be3882021-10-13 20:59:41 -070061 def undo_func(self, *args):
62 self.field.undo()
Ravago Jones8da89c42022-07-17 19:34:06 -070063
Nathan Leong295f7302022-07-23 16:09:31 -070064 def new_spline_clicked(self, *args):
65 self.field.new_spline()
66
67 def new_multispline_clicked(self, *args):
68 self.field.new_multispline()
69
kyle0e5a9f32021-01-23 15:02:19 -080070 def long_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080071 value = self.long_input.get_value()
Ravago Jonesfa8da562022-07-02 18:10:22 -070072 self.field.active_multispline.setConstraint(
73 "LONGITUDINAL_ACCELERATION", value)
74 self.field.graph.schedule_recalculate(self.field.multisplines)
kyle0e5a9f32021-01-23 15:02:19 -080075
76 def lat_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080077 value = self.lat_input.get_value()
Ravago Jonesfa8da562022-07-02 18:10:22 -070078 self.field.active_multispline.setConstraint("LATERAL_ACCELERATION",
79 value)
80 self.field.graph.schedule_recalculate(self.field.multisplines)
kyle0e5a9f32021-01-23 15:02:19 -080081
kyle96e46e12021-02-10 21:47:55 -080082 def vel_changed(self, button):
83 value = self.vel_input.get_value()
kyle0e5a9f32021-01-23 15:02:19 -080084
85 def vol_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080086 value = self.vol_input.get_value()
Ravago Jonesfa8da562022-07-02 18:10:22 -070087 self.field.active_multispline.setConstraint("VOLTAGE", value)
88 self.field.graph.schedule_recalculate(self.field.multisplines)
kyle0e5a9f32021-01-23 15:02:19 -080089
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -080090 def input_combobox_choice(self, combo):
91 text = combo.get_active_text()
92 if text is not None:
93 print("Combo Clicked on: " + text)
Ravago Jones086a8872021-08-07 15:49:40 -070094 self.field.set_field(FIELDS[text])
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -080095
John Park91e69732019-03-03 13:12:43 -080096 def __init__(self):
97 Gtk.Window.__init__(self)
98
99 self.set_default_size(1.5 * SCREEN_SIZE, SCREEN_SIZE)
100
Ravago Jones6d460fe2021-07-03 16:59:55 -0700101 container = Gtk.Grid()
102 container.set_vexpand(True)
103 self.add(container)
John Park91e69732019-03-03 13:12:43 -0800104
Ravago Jones6d460fe2021-07-03 16:59:55 -0700105 self.field = FieldWidget()
John Park91e69732019-03-03 13:12:43 -0800106
vlad56329f42020-06-12 21:41:08 -0700107 self.method_connect("delete-event", basic_window.quit_main_loop)
Ravago Jones76ecec82021-08-07 14:37:08 -0700108 self.method_connect("key-release-event", self.field.do_key_press_event)
John Park91e69732019-03-03 13:12:43 -0800109
110 self.file_name_box = Gtk.Entry()
Nathan Leong295f7302022-07-23 16:09:31 -0700111 self.file_name_box.set_size_request(50, 40)
Maxwell Henderson4a18b192023-03-10 15:04:04 -0800112 self.file_name_box.set_text("test.json")
John Park91e69732019-03-03 13:12:43 -0800113 self.file_name_box.set_editable(True)
114
kyle0e5a9f32021-01-23 15:02:19 -0800115 self.long_input = Gtk.SpinButton()
116 self.long_input.set_size_request(100, 20)
117 self.long_input.set_numeric(True)
Austin Schuhb9dc3f62021-03-31 20:06:49 -0700118 self.long_input.set_range(0, 20)
kyle96e46e12021-02-10 21:47:55 -0800119 self.long_input.set_digits(3)
120 self.long_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800121 self.long_input.connect("value-changed", self.long_changed)
122 self.long_label = Gtk.Label()
kyle96e46e12021-02-10 21:47:55 -0800123 self.long_label.set_text("Longitudinal Acceleration Restriction")
124 self.long_input.set_value(
Ravago Jonesfa8da562022-07-02 18:10:22 -0700125 self.field.active_multispline.getConstraint(
126 "LONGITUDINAL_ACCELERATION"))
kyle0e5a9f32021-01-23 15:02:19 -0800127
128 self.lat_input = Gtk.SpinButton()
129 self.lat_input.set_size_request(100, 20)
130 self.lat_input.set_numeric(True)
Austin Schuhb9dc3f62021-03-31 20:06:49 -0700131 self.lat_input.set_range(0, 20)
kyle96e46e12021-02-10 21:47:55 -0800132 self.lat_input.set_digits(3)
133 self.lat_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800134 self.lat_input.connect("value-changed", self.lat_changed)
135 self.lat_label = Gtk.Label()
kyle96e46e12021-02-10 21:47:55 -0800136 self.lat_label.set_text("Lateral Acceleration Restriction")
137 self.lat_input.set_value(
Ravago Jonesfa8da562022-07-02 18:10:22 -0700138 self.field.active_multispline.getConstraint(
139 "LATERAL_ACCELERATION"))
kyle0e5a9f32021-01-23 15:02:19 -0800140
kyle96e46e12021-02-10 21:47:55 -0800141 self.vel_input = Gtk.SpinButton()
142 self.vel_input.set_size_request(100, 20)
143 self.vel_input.set_numeric(True)
144 self.vel_input.set_range(0, 10)
145 self.vel_input.set_digits(3)
146 self.vel_input.set_increments(0.1, 100)
147 self.vel_input.connect("value-changed", self.vel_changed)
148 self.vel_label = Gtk.Label()
149 self.vel_label.set_text(
150 "Velocity Restriction"
151 ) #note: the velocity restrictions are not yet working, they need to be hooked up later
kyle0e5a9f32021-01-23 15:02:19 -0800152
153 self.vol_input = Gtk.SpinButton()
154 self.vol_input.set_size_request(100, 20)
155 self.vol_input.set_numeric(True)
kyle96e46e12021-02-10 21:47:55 -0800156 self.vol_input.set_range(0, 12)
157 self.vol_input.set_digits(3)
158 self.vol_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800159 self.vol_input.connect("value-changed", self.vol_changed)
kyle0e5a9f32021-01-23 15:02:19 -0800160 self.vol_label = Gtk.Label()
161 self.vol_label.set_text("Voltage Restriction")
Ravago Jonesfa8da562022-07-02 18:10:22 -0700162 self.vol_input.set_value(
163 self.field.active_multispline.getConstraint("VOLTAGE"))
kyle0e5a9f32021-01-23 15:02:19 -0800164
Ravago Jones6d460fe2021-07-03 16:59:55 -0700165 self.output_json = Gtk.Button.new_with_label("Export")
Nathan Leong295f7302022-07-23 16:09:31 -0700166 self.output_json.set_size_request(50, 40)
John Park909c0392020-03-05 23:56:30 -0800167 self.output_json.connect("clicked", self.output_json_clicked)
168
169 self.input_json = Gtk.Button.new_with_label("Import")
Nathan Leong295f7302022-07-23 16:09:31 -0700170 self.input_json.set_size_request(50, 40)
John Park909c0392020-03-05 23:56:30 -0800171 self.input_json.connect("clicked", self.input_json_clicked)
172
Ryan Yin85f861f2021-09-16 17:55:11 -0700173 self.clear = Gtk.Button.new_with_label("Clear")
Nathan Leong295f7302022-07-23 16:09:31 -0700174 self.clear.set_size_request(50, 40)
Ryan Yin85f861f2021-09-16 17:55:11 -0700175 self.clear.connect("clicked", self.clear_clicked)
Jason Anderson-Youngb3378152022-10-26 20:07:37 -0700176 #-----------currently being edited-----------#
Ryan Yind8be3882021-10-13 20:59:41 -0700177
Jason Anderson-Youngb3378152022-10-26 20:07:37 -0700178 self.toggle_view = Gtk.Button.new_with_label("Switch to Viewing Mode")
179 self.toggle_view.set_size_request(100, 40)
180 self.toggle_view.connect("clicked", self.toggle_view_clicked)
181 #--------------------------------------------#
Ryan Yind8be3882021-10-13 20:59:41 -0700182 self.undo = Gtk.Button.new_with_label("Undo (Ctrl + Z)")
Nathan Leong295f7302022-07-23 16:09:31 -0700183 self.undo.set_size_request(50, 40)
Ryan Yind8be3882021-10-13 20:59:41 -0700184 self.undo.connect("clicked", self.undo_func)
Nathan Leong295f7302022-07-23 16:09:31 -0700185
186 self.new_spline = Gtk.Button.new_with_label("Add Spline")
187 self.new_spline.set_size_request(50, 40)
188 self.new_spline.connect("clicked", self.new_spline_clicked)
189
190 self.new_multispline = Gtk.Button.new_with_label("Add Multispline")
191 self.new_multispline.set_size_request(50, 40)
192 self.new_multispline.connect("clicked", self.new_multispline_clicked)
193
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800194 #Dropdown feature
Ravago Jones6d460fe2021-07-03 16:59:55 -0700195 self.label = Gtk.Label()
196 self.label.set_text("Change Field:")
197 self.label.set_size_request(100, 40)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800198
199 game_store = Gtk.ListStore(str)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800200
201 self.game_combo = Gtk.ComboBoxText()
202 self.game_combo.set_entry_text_column(0)
203 self.game_combo.connect("changed", self.input_combobox_choice)
204
Ravago Jones6d460fe2021-07-03 16:59:55 -0700205 for game in FIELDS.keys():
206 self.game_combo.append_text(game)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800207
Ravago Jones76ecec82021-08-07 14:37:08 -0700208 if FIELD in FIELDS.values():
209 self.game_combo.set_active(list(FIELDS.values()).index(FIELD))
Ravago Jones6d460fe2021-07-03 16:59:55 -0700210 self.game_combo.set_size_request(100, 40)
211
212 limitControls = Gtk.FlowBox()
213 limitControls.set_min_children_per_line(1)
214 limitControls.set_max_children_per_line(2)
215 limitControls.add(self.long_label)
216 limitControls.add(self.long_input)
217
218 limitControls.add(self.lat_label)
219 limitControls.add(self.lat_input)
220
221 limitControls.add(self.vel_label)
222 limitControls.add(self.vel_input)
223
224 limitControls.add(self.vol_label)
225 limitControls.add(self.vol_input)
226
227 container.attach(limitControls, 5, 1, 1, 1)
228
229 jsonControls = Gtk.FlowBox()
Jason Anderson-Youngb3378152022-10-26 20:07:37 -0700230 jsonControls.set_min_children_per_line(8)
Ravago Jones6d460fe2021-07-03 16:59:55 -0700231 jsonControls.add(self.file_name_box)
232 jsonControls.add(self.output_json)
233 jsonControls.add(self.input_json)
Ryan Yin85f861f2021-09-16 17:55:11 -0700234 jsonControls.add(self.clear)
Jason Anderson-Youngb3378152022-10-26 20:07:37 -0700235 jsonControls.add(self.toggle_view) #----------------in progress
Ryan Yind8be3882021-10-13 20:59:41 -0700236 jsonControls.add(self.undo)
Nathan Leong295f7302022-07-23 16:09:31 -0700237 jsonControls.add(self.new_spline)
238 jsonControls.add(self.new_multispline)
Ravago Jones6d460fe2021-07-03 16:59:55 -0700239 container.attach(jsonControls, 1, 0, 1, 1)
240
241 container.attach(self.label, 4, 0, 1, 1)
242 container.attach(self.game_combo, 5, 0, 1, 1)
243
Ravago Jones76ecec82021-08-07 14:37:08 -0700244 container.attach(self.field, 1, 1, 4, 4)
Ravago Jones6d460fe2021-07-03 16:59:55 -0700245
246 container.attach(self.field.graph, 0, 10, 10, 1)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800247
248 self.show_all()
John Park91e69732019-03-03 13:12:43 -0800249
Ravago Jones6d460fe2021-07-03 16:59:55 -0700250
John Park91e69732019-03-03 13:12:43 -0800251window = GridWindow()
252RunApp()