# HG changeset patch # User Mike Pavone # Date 1245873921 0 # Node ID 0534bb8ee7ad0ab7eaf425ef4100cb6d92f6e30c # Parent 812673a8b1eaf4f324c688a03aa06c19178cf135 Added beginnings of graphical editor prototype diff -r 812673a8b1ea -r 0534bb8ee7ad editgraph.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/editgraph.py Wed Jun 24 20:05:21 2009 +0000 @@ -0,0 +1,97 @@ +import Tkinter +from tkFont import Font + +class Call(object): + def __init__(self, canvas, center, text = None, chars=None, padw = 20, padh = 4, fill="gray", outline="black",selectoutline="red"): + x,y = center + self.x = x + self.y = y + self.text = Tkinter.StringVar() + self.textlen = 0 + if text != None: + self.text.set(text) + self.textlen = len(text) + if chars == None: + chars = len(text)+3 + elif chars == None: + chars = 3 + self.textwidget = Tkinter.Entry(canvas, width=chars, textvariable=self.text, font=Font(family="Courier New", size=10)) + self.textwidget.bind('', self.textchanged, '+') + self.canvastext = canvas.create_window(x, y, window=self.textwidget) + box = canvas.bbox(self.canvastext) + self.width = box[2]-box[0]+padw + self.height = box[3]-box[1]+padh + hw = self.width / 2 + hh = self.height / 2 + ow = hw+10 + 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) + self.outline = outline + self.selectoutline = selectoutline + self.mousex = self.mousey = 0 + + def hittest(self, x, y): + ow = self.width / 2 + 10 + hh = self.height / 2 + return abs(x-self.x) <= ow and abs(y-self.y) <= hh + + def onclick(self, x, y): + canvas.itemconfig(self.poly, outline=self.selectoutline) + self.mousex = x + self.mousey = y + + def lostfocus(self): + canvas.itemconfig(self.poly, outline=self.outline) + + def ondrag(self, x, y): + self.x += x-self.mousex + self.y += y-self.mousey + self.mousex = x + self.mousey = y + hw = self.width / 2 + hh = self.height / 2 + ow = hw+10 + 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) + canvas.coords(self.canvastext, self.x, self.y) + + def textchanged(self,event): + text = self.text.get() + newlen = len(text) + print text + if newlen != self.textlen: + print 'length changed' + self.textlen = newlen + +grabbed = None +def onclick(event): + global grabbed + if grabbed != None: + grabbed.lostfocus() + grabbed = None + print "Click" + #TODO: Consider using quadtrees for performance + for i in range(len(nodes)-1,-1,-1): + node = nodes[i] + if node.hittest(event.x, event.y): + grabbed = node + print "Found hit!" + node.onclick(event.x, event.y) + break + +def ondrag(event): + global grabbed + if grabbed != None: + grabbed.ondrag(event.x, event.y) + +def ondoubleclick(event): + global nodes + nodes.append(Call(canvas, (event.x, event.y))) + +root = Tkinter.Tk() +canvas = Tkinter.Canvas(root, width=302,height=302) +nodes = [] +nodes.append(Call(canvas, (50,40), "Foo")) +canvas.bind('', onclick) +canvas.bind('', ondrag) +canvas.bind('', ondoubleclick) +canvas.pack() +root.mainloop()