changeset 23:0534bb8ee7ad

Added beginnings of graphical editor prototype
author Mike Pavone <pavone@retrodev.com>
date Wed, 24 Jun 2009 20:05:21 +0000
parents 812673a8b1ea
children 8b2b3f4a2a58
files editgraph.py
diffstat 1 files changed, 97 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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('<Key>', 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('<Button-1>', onclick)
+canvas.bind('<B1-Motion>', ondrag)
+canvas.bind('<Double-Button-1>', ondoubleclick)
+canvas.pack()
+root.mainloop()