blob: ad3ae96d22c7dafcf9b015865d85427777ae7c27 [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
John Park91e69732019-03-03 13:12:43 -080015class GridWindow(Gtk.Window):
16 def method_connect(self, event, cb):
17 def handler(obj, *args):
18 cb(*args)
19
John Park91e69732019-03-03 13:12:43 -080020 self.connect(event, handler)
21
22 def mouse_move(self, event):
Ravago Jones6d460fe2021-07-03 16:59:55 -070023 self.field.mouse_move(event)
John Park91e69732019-03-03 13:12:43 -080024 self.queue_draw()
25
26 def button_press(self, event):
Ravago Jones6d460fe2021-07-03 16:59:55 -070027 self.field.button_press(event)
John Park91e69732019-03-03 13:12:43 -080028
29 def key_press(self, event):
Ravago Jones6d460fe2021-07-03 16:59:55 -070030 self.field.key_press(event, self.file_name_box.get_text())
John Park91e69732019-03-03 13:12:43 -080031 self.queue_draw()
32
33 def configure(self, event):
Ravago Jones6d460fe2021-07-03 16:59:55 -070034 self.field.window_shape = (event.width, event.height)
John Park91e69732019-03-03 13:12:43 -080035
John Park909c0392020-03-05 23:56:30 -080036 def output_json_clicked(self, button):
Ravago Jones6d460fe2021-07-03 16:59:55 -070037 self.field.export_json(self.file_name_box.get_text())
John Park909c0392020-03-05 23:56:30 -080038
39 def input_json_clicked(self, button):
Ravago Jones6d460fe2021-07-03 16:59:55 -070040 self.field.import_json(self.file_name_box.get_text())
kyle96e46e12021-02-10 21:47:55 -080041 self.long_input.set_value(
Ravago Jones6d460fe2021-07-03 16:59:55 -070042 self.field.points.getConstraint("LONGITUDINAL_ACCELERATION"))
kyle96e46e12021-02-10 21:47:55 -080043 self.lat_input.set_value(
Ravago Jones6d460fe2021-07-03 16:59:55 -070044 self.field.points.getConstraint("LATERAL_ACCELERATION"))
45 self.vol_input.set_value(self.field.points.getConstraint("VOLTAGE"))
John Park91e69732019-03-03 13:12:43 -080046
kyle0e5a9f32021-01-23 15:02:19 -080047 def long_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080048 value = self.long_input.get_value()
Ravago Jones6d460fe2021-07-03 16:59:55 -070049 self.field.points.setConstraint("LONGITUDINAL_ACCELERATION", value)
kyle0e5a9f32021-01-23 15:02:19 -080050
51 def lat_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080052 value = self.lat_input.get_value()
Ravago Jones6d460fe2021-07-03 16:59:55 -070053 self.field.points.setConstraint("LATERAL_ACCELERATION", value)
kyle0e5a9f32021-01-23 15:02:19 -080054
kyle96e46e12021-02-10 21:47:55 -080055 def vel_changed(self, button):
56 value = self.vel_input.get_value()
kyle0e5a9f32021-01-23 15:02:19 -080057
58 def vol_changed(self, button):
kyle96e46e12021-02-10 21:47:55 -080059 value = self.vol_input.get_value()
Ravago Jones6d460fe2021-07-03 16:59:55 -070060 self.field.points.setConstraint("VOLTAGE", value)
kyle0e5a9f32021-01-23 15:02:19 -080061
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -080062 def input_combobox_choice(self, combo):
63 text = combo.get_active_text()
64 if text is not None:
65 print("Combo Clicked on: " + text)
Ravago Jones6d460fe2021-07-03 16:59:55 -070066 #set_field(text)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -080067
John Park91e69732019-03-03 13:12:43 -080068 def __init__(self):
69 Gtk.Window.__init__(self)
70
71 self.set_default_size(1.5 * SCREEN_SIZE, SCREEN_SIZE)
72
Ravago Jones6d460fe2021-07-03 16:59:55 -070073 container = Gtk.Grid()
74 container.set_vexpand(True)
75 self.add(container)
John Park91e69732019-03-03 13:12:43 -080076
77 self.eventBox = Gtk.EventBox()
John Park91e69732019-03-03 13:12:43 -080078 self.eventBox.set_events(Gdk.EventMask.BUTTON_PRESS_MASK
79 | Gdk.EventMask.BUTTON_RELEASE_MASK
80 | Gdk.EventMask.POINTER_MOTION_MASK
81 | Gdk.EventMask.SCROLL_MASK
82 | Gdk.EventMask.KEY_PRESS_MASK)
83
Ravago Jones6d460fe2021-07-03 16:59:55 -070084 self.field = FieldWidget()
John Park91e69732019-03-03 13:12:43 -080085
vlad56329f42020-06-12 21:41:08 -070086 self.method_connect("delete-event", basic_window.quit_main_loop)
John Park91e69732019-03-03 13:12:43 -080087 self.method_connect("key-release-event", self.key_press)
88 self.method_connect("button-release-event", self.button_press)
89 self.method_connect("configure-event", self.configure)
90 self.method_connect("motion_notify_event", self.mouse_move)
91
92 self.file_name_box = Gtk.Entry()
93 self.file_name_box.set_size_request(200, 40)
Ravago Jonesc26b9162021-06-30 20:12:48 -070094 self.file_name_box.set_text(FIELD.field_id + ".json")
John Park91e69732019-03-03 13:12:43 -080095 self.file_name_box.set_editable(True)
96
kyle0e5a9f32021-01-23 15:02:19 -080097 self.long_input = Gtk.SpinButton()
98 self.long_input.set_size_request(100, 20)
99 self.long_input.set_numeric(True)
Austin Schuhb9dc3f62021-03-31 20:06:49 -0700100 self.long_input.set_range(0, 20)
kyle96e46e12021-02-10 21:47:55 -0800101 self.long_input.set_digits(3)
102 self.long_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800103 self.long_input.connect("value-changed", self.long_changed)
104 self.long_label = Gtk.Label()
kyle96e46e12021-02-10 21:47:55 -0800105 self.long_label.set_text("Longitudinal Acceleration Restriction")
106 self.long_input.set_value(
Ravago Jones6d460fe2021-07-03 16:59:55 -0700107 self.field.points.getConstraint("LONGITUDINAL_ACCELERATION"))
kyle0e5a9f32021-01-23 15:02:19 -0800108
109 self.lat_input = Gtk.SpinButton()
110 self.lat_input.set_size_request(100, 20)
111 self.lat_input.set_numeric(True)
Austin Schuhb9dc3f62021-03-31 20:06:49 -0700112 self.lat_input.set_range(0, 20)
kyle96e46e12021-02-10 21:47:55 -0800113 self.lat_input.set_digits(3)
114 self.lat_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800115 self.lat_input.connect("value-changed", self.lat_changed)
116 self.lat_label = Gtk.Label()
kyle96e46e12021-02-10 21:47:55 -0800117 self.lat_label.set_text("Lateral Acceleration Restriction")
118 self.lat_input.set_value(
Ravago Jones6d460fe2021-07-03 16:59:55 -0700119 self.field.points.getConstraint("LATERAL_ACCELERATION"))
kyle0e5a9f32021-01-23 15:02:19 -0800120
kyle96e46e12021-02-10 21:47:55 -0800121 self.vel_input = Gtk.SpinButton()
122 self.vel_input.set_size_request(100, 20)
123 self.vel_input.set_numeric(True)
124 self.vel_input.set_range(0, 10)
125 self.vel_input.set_digits(3)
126 self.vel_input.set_increments(0.1, 100)
127 self.vel_input.connect("value-changed", self.vel_changed)
128 self.vel_label = Gtk.Label()
129 self.vel_label.set_text(
130 "Velocity Restriction"
131 ) #note: the velocity restrictions are not yet working, they need to be hooked up later
kyle0e5a9f32021-01-23 15:02:19 -0800132
133 self.vol_input = Gtk.SpinButton()
134 self.vol_input.set_size_request(100, 20)
135 self.vol_input.set_numeric(True)
kyle96e46e12021-02-10 21:47:55 -0800136 self.vol_input.set_range(0, 12)
137 self.vol_input.set_digits(3)
138 self.vol_input.set_increments(0.1, 100)
kyle0e5a9f32021-01-23 15:02:19 -0800139 self.vol_input.connect("value-changed", self.vol_changed)
kyle0e5a9f32021-01-23 15:02:19 -0800140 self.vol_label = Gtk.Label()
141 self.vol_label.set_text("Voltage Restriction")
Ravago Jones6d460fe2021-07-03 16:59:55 -0700142 self.vol_input.set_value(self.field.points.getConstraint("VOLTAGE"))
kyle0e5a9f32021-01-23 15:02:19 -0800143
Ravago Jones6d460fe2021-07-03 16:59:55 -0700144 self.output_json = Gtk.Button.new_with_label("Export")
John Park909c0392020-03-05 23:56:30 -0800145 self.output_json.set_size_request(100, 40)
146 self.output_json.connect("clicked", self.output_json_clicked)
147
148 self.input_json = Gtk.Button.new_with_label("Import")
149 self.input_json.set_size_request(100, 40)
150 self.input_json.connect("clicked", self.input_json_clicked)
151
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800152 #Dropdown feature
Ravago Jones6d460fe2021-07-03 16:59:55 -0700153 self.label = Gtk.Label()
154 self.label.set_text("Change Field:")
155 self.label.set_size_request(100, 40)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800156
157 game_store = Gtk.ListStore(str)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800158
159 self.game_combo = Gtk.ComboBoxText()
160 self.game_combo.set_entry_text_column(0)
161 self.game_combo.connect("changed", self.input_combobox_choice)
162
Ravago Jones6d460fe2021-07-03 16:59:55 -0700163 for game in FIELDS.keys():
164 self.game_combo.append_text(game)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800165
166 self.game_combo.set_active(0)
Ravago Jones6d460fe2021-07-03 16:59:55 -0700167 self.game_combo.set_size_request(100, 40)
168
169 limitControls = Gtk.FlowBox()
170 limitControls.set_min_children_per_line(1)
171 limitControls.set_max_children_per_line(2)
172 limitControls.add(self.long_label)
173 limitControls.add(self.long_input)
174
175 limitControls.add(self.lat_label)
176 limitControls.add(self.lat_input)
177
178 limitControls.add(self.vel_label)
179 limitControls.add(self.vel_input)
180
181 limitControls.add(self.vol_label)
182 limitControls.add(self.vol_input)
183
184 container.attach(limitControls, 5, 1, 1, 1)
185
186 jsonControls = Gtk.FlowBox()
187 jsonControls.set_min_children_per_line(3)
188 jsonControls.add(self.file_name_box)
189 jsonControls.add(self.output_json)
190 jsonControls.add(self.input_json)
191 container.attach(jsonControls, 1, 0, 1, 1)
192
193 container.attach(self.label, 4, 0, 1, 1)
194 container.attach(self.game_combo, 5, 0, 1, 1)
195
196 self.eventBox.add(self.field)
197 container.attach(self.eventBox, 1, 1, 4, 4)
198
199 container.attach(self.field.graph, 0, 10, 10, 1)
Kenneth Nishiyamab45b7ba2021-01-27 21:45:34 -0800200
201 self.show_all()
John Park91e69732019-03-03 13:12:43 -0800202
Ravago Jones6d460fe2021-07-03 16:59:55 -0700203
John Park91e69732019-03-03 13:12:43 -0800204window = GridWindow()
205RunApp()