Mercurial > repos > rhope
comparison editgraph.py @ 23:0534bb8ee7ad
Added beginnings of graphical editor prototype
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 24 Jun 2009 20:05:21 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
22:812673a8b1ea | 23:0534bb8ee7ad |
---|---|
1 import Tkinter | |
2 from tkFont import Font | |
3 | |
4 class Call(object): | |
5 def __init__(self, canvas, center, text = None, chars=None, padw = 20, padh = 4, fill="gray", outline="black",selectoutline="red"): | |
6 x,y = center | |
7 self.x = x | |
8 self.y = y | |
9 self.text = Tkinter.StringVar() | |
10 self.textlen = 0 | |
11 if text != None: | |
12 self.text.set(text) | |
13 self.textlen = len(text) | |
14 if chars == None: | |
15 chars = len(text)+3 | |
16 elif chars == None: | |
17 chars = 3 | |
18 self.textwidget = Tkinter.Entry(canvas, width=chars, textvariable=self.text, font=Font(family="Courier New", size=10)) | |
19 self.textwidget.bind('<Key>', self.textchanged, '+') | |
20 self.canvastext = canvas.create_window(x, y, window=self.textwidget) | |
21 box = canvas.bbox(self.canvastext) | |
22 self.width = box[2]-box[0]+padw | |
23 self.height = box[3]-box[1]+padh | |
24 hw = self.width / 2 | |
25 hh = self.height / 2 | |
26 ow = hw+10 | |
27 self.poly = canvas.create_polygon(x-hw,y-hh, x+hw,y-hh, x+ow,y, x+hw,y+hh, x-hw,y+hh, x-ow,y, fill=fill, outline=outline) | |
28 self.outline = outline | |
29 self.selectoutline = selectoutline | |
30 self.mousex = self.mousey = 0 | |
31 | |
32 def hittest(self, x, y): | |
33 ow = self.width / 2 + 10 | |
34 hh = self.height / 2 | |
35 return abs(x-self.x) <= ow and abs(y-self.y) <= hh | |
36 | |
37 def onclick(self, x, y): | |
38 canvas.itemconfig(self.poly, outline=self.selectoutline) | |
39 self.mousex = x | |
40 self.mousey = y | |
41 | |
42 def lostfocus(self): | |
43 canvas.itemconfig(self.poly, outline=self.outline) | |
44 | |
45 def ondrag(self, x, y): | |
46 self.x += x-self.mousex | |
47 self.y += y-self.mousey | |
48 self.mousex = x | |
49 self.mousey = y | |
50 hw = self.width / 2 | |
51 hh = self.height / 2 | |
52 ow = hw+10 | |
53 canvas.coords(self.poly, self.x-hw,self.y-hh, self.x+hw,self.y-hh, self.x+ow,self.y, self.x+hw,self.y+hh, self.x-hw,self.y+hh, self.x-ow,self.y) | |
54 canvas.coords(self.canvastext, self.x, self.y) | |
55 | |
56 def textchanged(self,event): | |
57 text = self.text.get() | |
58 newlen = len(text) | |
59 print text | |
60 if newlen != self.textlen: | |
61 print 'length changed' | |
62 self.textlen = newlen | |
63 | |
64 grabbed = None | |
65 def onclick(event): | |
66 global grabbed | |
67 if grabbed != None: | |
68 grabbed.lostfocus() | |
69 grabbed = None | |
70 print "Click" | |
71 #TODO: Consider using quadtrees for performance | |
72 for i in range(len(nodes)-1,-1,-1): | |
73 node = nodes[i] | |
74 if node.hittest(event.x, event.y): | |
75 grabbed = node | |
76 print "Found hit!" | |
77 node.onclick(event.x, event.y) | |
78 break | |
79 | |
80 def ondrag(event): | |
81 global grabbed | |
82 if grabbed != None: | |
83 grabbed.ondrag(event.x, event.y) | |
84 | |
85 def ondoubleclick(event): | |
86 global nodes | |
87 nodes.append(Call(canvas, (event.x, event.y))) | |
88 | |
89 root = Tkinter.Tk() | |
90 canvas = Tkinter.Canvas(root, width=302,height=302) | |
91 nodes = [] | |
92 nodes.append(Call(canvas, (50,40), "Foo")) | |
93 canvas.bind('<Button-1>', onclick) | |
94 canvas.bind('<B1-Motion>', ondrag) | |
95 canvas.bind('<Double-Button-1>', ondoubleclick) | |
96 canvas.pack() | |
97 root.mainloop() |