blob: f6e3a0c16762cdba35fddf1c87fa1b15f0b10d8d [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
10class GridWindow(Gtk.Window):
11 def method_connect(self, event, cb):
12 def handler(obj, *args):
13 cb(*args)
14
John Park91e69732019-03-03 13:12:43 -080015 self.connect(event, handler)
16
17 def mouse_move(self, event):
James Kuszmaulb2b89b22020-02-29 13:27:05 -080018 # Changes event.x and event.y to be relative to the center.
John Park91e69732019-03-03 13:12:43 -080019 x = event.x - self.drawing_area.window_shape[0] / 2
20 y = self.drawing_area.window_shape[1] / 2 - event.y
21 scale = self.drawing_area.get_current_scale()
22 event.x = x / scale + self.drawing_area.center[0]
23 event.y = y / scale + self.drawing_area.center[1]
24 self.drawing_area.mouse_move(event)
25 self.queue_draw()
26
27 def button_press(self, event):
James Kuszmaulb2b89b22020-02-29 13:27:05 -080028 original_x = event.x
29 original_y = event.y
John Park91e69732019-03-03 13:12:43 -080030 x = event.x - self.drawing_area.window_shape[0] / 2
31 y = self.drawing_area.window_shape[1] / 2 - event.y
32 scale = 2 * self.drawing_area.get_current_scale()
33 event.x = x / scale + self.drawing_area.center[0]
34 event.y = y / scale + self.drawing_area.center[1]
35 self.drawing_area.do_button_press(event)
James Kuszmaulb2b89b22020-02-29 13:27:05 -080036 event.x = original_x
37 event.y = original_y
John Park91e69732019-03-03 13:12:43 -080038
39 def key_press(self, event):
John Park91e69732019-03-03 13:12:43 -080040 self.drawing_area.do_key_press(event, self.file_name_box.get_text())
41 self.queue_draw()
42
43 def configure(self, event):
John Park91e69732019-03-03 13:12:43 -080044 self.drawing_area.window_shape = (event.width, event.height)
45
John Park909c0392020-03-05 23:56:30 -080046 def output_json_clicked(self, button):
47 print("OUTPUT JSON CLICKED")
48 self.drawing_area.export_json(self.file_name_box.get_text())
49
50 def input_json_clicked(self, button):
51 print("INPUT JSON CLICKED")
52 self.drawing_area.import_json(self.file_name_box.get_text())
John Park91e69732019-03-03 13:12:43 -080053
54 def __init__(self):
55 Gtk.Window.__init__(self)
56
57 self.set_default_size(1.5 * SCREEN_SIZE, SCREEN_SIZE)
58
59 flowBox = Gtk.FlowBox()
60 flowBox.set_valign(Gtk.Align.START)
61 flowBox.set_selection_mode(Gtk.SelectionMode.NONE)
62
63 flowBox.set_valign(Gtk.Align.START)
64
65 self.add(flowBox)
66
67 container = Gtk.Fixed()
68 flowBox.add(container)
69
70 self.eventBox = Gtk.EventBox()
71 container.add(self.eventBox)
72
73 self.eventBox.set_events(Gdk.EventMask.BUTTON_PRESS_MASK
74 | Gdk.EventMask.BUTTON_RELEASE_MASK
75 | Gdk.EventMask.POINTER_MOTION_MASK
76 | Gdk.EventMask.SCROLL_MASK
77 | Gdk.EventMask.KEY_PRESS_MASK)
78
79 #add the graph box
80 self.drawing_area = GTK_Widget()
81 self.eventBox.add(self.drawing_area)
82
vlad56329f42020-06-12 21:41:08 -070083 self.method_connect("delete-event", basic_window.quit_main_loop)
John Park91e69732019-03-03 13:12:43 -080084 self.method_connect("key-release-event", self.key_press)
85 self.method_connect("button-release-event", self.button_press)
86 self.method_connect("configure-event", self.configure)
87 self.method_connect("motion_notify_event", self.mouse_move)
88
89 self.file_name_box = Gtk.Entry()
90 self.file_name_box.set_size_request(200, 40)
91
James Kuszmaulb2b89b22020-02-29 13:27:05 -080092 self.file_name_box.set_text("output_file_name.json")
John Park91e69732019-03-03 13:12:43 -080093 self.file_name_box.set_editable(True)
94
95 container.put(self.file_name_box, 0, 0)
96
John Park909c0392020-03-05 23:56:30 -080097 self.output_json = Gtk.Button.new_with_label("Output")
98 self.output_json.set_size_request(100, 40)
99 self.output_json.connect("clicked", self.output_json_clicked)
100
101 self.input_json = Gtk.Button.new_with_label("Import")
102 self.input_json.set_size_request(100, 40)
103 self.input_json.connect("clicked", self.input_json_clicked)
104
105 container.put(self.output_json, 210, 0)
106 container.put(self.input_json, 320, 0)
107
John Park91e69732019-03-03 13:12:43 -0800108 self.show_all()
109
110
111window = GridWindow()
112RunApp()