blob: e07bc807dbc272e0e44dec124315d811f5f31dee [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
7from basic_window import RunApp
8from constants import FIELDS, FIELD, SCREEN_SIZE
John Park91e69732019-03-03 13:12:43 -08009gi.require_version('Gtk', '3.0')
10from gi.repository import Gdk, Gtk, GLib
11import cairo
vlad56329f42020-06-12 21:41:08 -070012import basic_window
Ravago Jones6d460fe2021-07-03 16:59:55 -070013import os
Ravago Jones26f7ad02021-02-05 15:45:59 -080014
Ravago Jones36c92f02021-07-24 16:35:33 -070015
John Park91e69732019-03-03 13:12:43 -080016class GridWindow(Gtk.Window):
17 def method_connect(self, event, cb):
18 def handler(obj, *args):
19 cb(*args)
20
John Park91e69732019-03-03 13:12:43 -080021 self.connect(event, handler)
22
Ryan Yin85f861f2021-09-16 17:55:11 -070023 def clear_clicked(self, button):
24 self.field.clear_graph()
25
John Park909c0392020-03-05 23:56:30 -080026 def output_json_clicked(self, button):
Ravago Jones6d460fe2021-07-03 16:59:55 -070027 self.field.export_json(self.file_name_box.get_text())
John Park909c0392020-03-05 23:56:30 -080028
29 def input_json_clicked(self, button):
Ravago Jones6d460fe2021-07-03 16:59:55 -070030 self.field.import_json(self.file_name_box.get_text())
kyle96e46e12021-02-10 21:47:55 -080031 self.long_input.set_value(
Ravago Jones6d460fe2021-07-03 16:59:55 -070032 self.field.points.getConstraint("LONGITUDINAL_ACCELERATION"))
kyle96e46e12021-02-10 21:47:55 -080033 self.lat_input.set_value(
Ravago Jones6d460fe2021-07-03 16:59:55 -070034 self.field.points.getConstraint("LATERAL_ACCELERATION"))
35 self.vol_input.set_value(self.field.points.getConstraint("VOLTAGE"))
John Park91e69732019-03-03 13:12:43 -080036
kyle0e5a9f32021-01-23 15:02:19 -080037 def long_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080038 value = self.long_input.get_value()
Ravago Jones6d460fe2021-07-03 16:59:55 -070039 self.field.points.setConstraint("LONGITUDINAL_ACCELERATION", value)
Ravago Jones76ecec82021-08-07 14:37:08 -070040 self.field.graph.schedule_recalculate(self.field.points)
kyle0e5a9f32021-01-23 15:02:19 -080041
42 def lat_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080043 value = self.lat_input.get_value()
Ravago Jones6d460fe2021-07-03 16:59:55 -070044 self.field.points.setConstraint("LATERAL_ACCELERATION", value)
Ravago Jones76ecec82021-08-07 14:37:08 -070045 self.field.graph.schedule_recalculate(self.field.points)
kyle0e5a9f32021-01-23 15:02:19 -080046
kyle96e46e12021-02-10 21:47:55 -080047 def vel_changed(self, button):
48 value = self.vel_input.get_value()
kyle0e5a9f32021-01-23 15:02:19 -080049
50 def vol_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080051 value = self.vol_input.get_value()
Ravago Jones6d460fe2021-07-03 16:59:55 -070052 self.field.points.setConstraint("VOLTAGE", value)
Ravago Jones76ecec82021-08-07 14:37:08 -070053 self.field.graph.schedule_recalculate(self.field.points)
kyle0e5a9f32021-01-23 15:02:19 -080054
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -080055 def input_combobox_choice(self, combo):
56 text = combo.get_active_text()
57 if text is not None:
58 print("Combo Clicked on: " + text)
Ravago Jones086a8872021-08-07 15:49:40 -070059 self.field.set_field(FIELDS[text])
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -080060
John Park91e69732019-03-03 13:12:43 -080061 def __init__(self):
62 Gtk.Window.__init__(self)
63
64 self.set_default_size(1.5 * SCREEN_SIZE, SCREEN_SIZE)
65
Ravago Jones6d460fe2021-07-03 16:59:55 -070066 container = Gtk.Grid()
67 container.set_vexpand(True)
68 self.add(container)
John Park91e69732019-03-03 13:12:43 -080069
Ravago Jones6d460fe2021-07-03 16:59:55 -070070 self.field = FieldWidget()
John Park91e69732019-03-03 13:12:43 -080071
vlad56329f42020-06-12 21:41:08 -070072 self.method_connect("delete-event", basic_window.quit_main_loop)
Ravago Jones76ecec82021-08-07 14:37:08 -070073 self.method_connect("key-release-event", self.field.do_key_press_event)
John Park91e69732019-03-03 13:12:43 -080074
75 self.file_name_box = Gtk.Entry()
76 self.file_name_box.set_size_request(200, 40)
Ravago Jonesc26b9162021-06-30 20:12:48 -070077 self.file_name_box.set_text(FIELD.field_id + ".json")
John Park91e69732019-03-03 13:12:43 -080078 self.file_name_box.set_editable(True)
79
kyle0e5a9f32021-01-23 15:02:19 -080080 self.long_input = Gtk.SpinButton()
81 self.long_input.set_size_request(100, 20)
82 self.long_input.set_numeric(True)
Austin Schuhb9dc3f62021-03-31 20:06:49 -070083 self.long_input.set_range(0, 20)
kyle96e46e12021-02-10 21:47:55 -080084 self.long_input.set_digits(3)
85 self.long_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -080086 self.long_input.connect("value-changed", self.long_changed)
87 self.long_label = Gtk.Label()
kyle96e46e12021-02-10 21:47:55 -080088 self.long_label.set_text("Longitudinal Acceleration Restriction")
89 self.long_input.set_value(
Ravago Jones6d460fe2021-07-03 16:59:55 -070090 self.field.points.getConstraint("LONGITUDINAL_ACCELERATION"))
kyle0e5a9f32021-01-23 15:02:19 -080091
92 self.lat_input = Gtk.SpinButton()
93 self.lat_input.set_size_request(100, 20)
94 self.lat_input.set_numeric(True)
Austin Schuhb9dc3f62021-03-31 20:06:49 -070095 self.lat_input.set_range(0, 20)
kyle96e46e12021-02-10 21:47:55 -080096 self.lat_input.set_digits(3)
97 self.lat_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -080098 self.lat_input.connect("value-changed", self.lat_changed)
99 self.lat_label = Gtk.Label()
kyle96e46e12021-02-10 21:47:55 -0800100 self.lat_label.set_text("Lateral Acceleration Restriction")
101 self.lat_input.set_value(
Ravago Jones6d460fe2021-07-03 16:59:55 -0700102 self.field.points.getConstraint("LATERAL_ACCELERATION"))
kyle0e5a9f32021-01-23 15:02:19 -0800103
kyle96e46e12021-02-10 21:47:55 -0800104 self.vel_input = Gtk.SpinButton()
105 self.vel_input.set_size_request(100, 20)
106 self.vel_input.set_numeric(True)
107 self.vel_input.set_range(0, 10)
108 self.vel_input.set_digits(3)
109 self.vel_input.set_increments(0.1, 100)
110 self.vel_input.connect("value-changed", self.vel_changed)
111 self.vel_label = Gtk.Label()
112 self.vel_label.set_text(
113 "Velocity Restriction"
114 ) #note: the velocity restrictions are not yet working, they need to be hooked up later
kyle0e5a9f32021-01-23 15:02:19 -0800115
116 self.vol_input = Gtk.SpinButton()
117 self.vol_input.set_size_request(100, 20)
118 self.vol_input.set_numeric(True)
kyle96e46e12021-02-10 21:47:55 -0800119 self.vol_input.set_range(0, 12)
120 self.vol_input.set_digits(3)
121 self.vol_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800122 self.vol_input.connect("value-changed", self.vol_changed)
kyle0e5a9f32021-01-23 15:02:19 -0800123 self.vol_label = Gtk.Label()
124 self.vol_label.set_text("Voltage Restriction")
Ravago Jones6d460fe2021-07-03 16:59:55 -0700125 self.vol_input.set_value(self.field.points.getConstraint("VOLTAGE"))
kyle0e5a9f32021-01-23 15:02:19 -0800126
Ravago Jones6d460fe2021-07-03 16:59:55 -0700127 self.output_json = Gtk.Button.new_with_label("Export")
John Park909c0392020-03-05 23:56:30 -0800128 self.output_json.set_size_request(100, 40)
129 self.output_json.connect("clicked", self.output_json_clicked)
130
131 self.input_json = Gtk.Button.new_with_label("Import")
132 self.input_json.set_size_request(100, 40)
133 self.input_json.connect("clicked", self.input_json_clicked)
134
Ryan Yin85f861f2021-09-16 17:55:11 -0700135 self.clear = Gtk.Button.new_with_label("Clear")
136 self.clear.set_size_request(100, 40)
137 self.clear.connect("clicked", self.clear_clicked)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800138 #Dropdown feature
Ravago Jones6d460fe2021-07-03 16:59:55 -0700139 self.label = Gtk.Label()
140 self.label.set_text("Change Field:")
141 self.label.set_size_request(100, 40)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800142
143 game_store = Gtk.ListStore(str)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800144
145 self.game_combo = Gtk.ComboBoxText()
146 self.game_combo.set_entry_text_column(0)
147 self.game_combo.connect("changed", self.input_combobox_choice)
148
Ravago Jones6d460fe2021-07-03 16:59:55 -0700149 for game in FIELDS.keys():
150 self.game_combo.append_text(game)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800151
Ravago Jones76ecec82021-08-07 14:37:08 -0700152 if FIELD in FIELDS.values():
153 self.game_combo.set_active(list(FIELDS.values()).index(FIELD))
Ravago Jones6d460fe2021-07-03 16:59:55 -0700154 self.game_combo.set_size_request(100, 40)
155
156 limitControls = Gtk.FlowBox()
157 limitControls.set_min_children_per_line(1)
158 limitControls.set_max_children_per_line(2)
159 limitControls.add(self.long_label)
160 limitControls.add(self.long_input)
161
162 limitControls.add(self.lat_label)
163 limitControls.add(self.lat_input)
164
165 limitControls.add(self.vel_label)
166 limitControls.add(self.vel_input)
167
168 limitControls.add(self.vol_label)
169 limitControls.add(self.vol_input)
170
171 container.attach(limitControls, 5, 1, 1, 1)
172
173 jsonControls = Gtk.FlowBox()
174 jsonControls.set_min_children_per_line(3)
175 jsonControls.add(self.file_name_box)
176 jsonControls.add(self.output_json)
177 jsonControls.add(self.input_json)
Ryan Yin85f861f2021-09-16 17:55:11 -0700178 jsonControls.add(self.clear)
Ravago Jones6d460fe2021-07-03 16:59:55 -0700179 container.attach(jsonControls, 1, 0, 1, 1)
180
181 container.attach(self.label, 4, 0, 1, 1)
182 container.attach(self.game_combo, 5, 0, 1, 1)
183
Ravago Jones76ecec82021-08-07 14:37:08 -0700184 container.attach(self.field, 1, 1, 4, 4)
Ravago Jones6d460fe2021-07-03 16:59:55 -0700185
186 container.attach(self.field.graph, 0, 10, 10, 1)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800187
188 self.show_all()
John Park91e69732019-03-03 13:12:43 -0800189
Ravago Jones6d460fe2021-07-03 16:59:55 -0700190
John Park91e69732019-03-03 13:12:43 -0800191window = GridWindow()
192RunApp()