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()