import Tkinter
import ImageTk
import Image
import PIL.ImageOps as ImageOps

class ImageViewer(Tkinter.Toplevel):
	def __init__(self, image, title):
		Tkinter.Toplevel.__init__(self)
		self.canvas = Tkinter.Canvas(self)
		self.canvas.pack(expand=1, fill=Tkinter.BOTH)
		self.picId = self.canvas.create_image(0, 0, anchor="nw")
		self.image = ImageOps.fit(image, (500, 300))
		self.geometry("500x300")
		self.tkImage = ImageTk.PhotoImage(self.image)
		self.canvas.itemconfig(self.picId, image=self.tkImage)
		self.title(title)
		self.bind("w", self.close)
	
	def close(self, ev=None):
		self.withdraw()


class Ui(Tkinter.Tk):
	def __init__(self, fName):
		Tkinter.Tk.__init__(self)
		self.leftView, self.rightView = None, None
		self.canvas = Tkinter.Canvas(self)
		self.canvas.pack(fill=Tkinter.BOTH, expand=1)
		self.picId = self.canvas.create_image(0, 0, anchor="nw")
		self.image = ImageOps.fit(Image.open(fName), (1000, 600))
		self.geometry("%dx%d"%self.image.size)
		self.tkImage = ImageTk.PhotoImage(self.image)
		self.canvas.itemconfig(self.picId, image=self.tkImage)
		self.title("Symmetrizer")
		self._doBindings()

	def _doBindings(self):
		self.bind("q", lambda ev: self.quit())
		self.bind("d", lambda ev: self.displaySplit())
		self.bind("s", lambda ev: self.saveCurrent())
		self.bind("<Button-1>", self._startmove)
		self.bind("<B1-Motion>", self._domove)

	def _startmove(self, event):
		if hasattr(self, "lineId"):
			self.canvas.delete(self.lineId)
		self.lastx = event.x
		self.lineId = self.canvas.create_line(event.x, 0, event.x, 600)
	
	def _domove(self, event):
		self._startmove(event)
	
	def splitStuff(self):
		szX, szY = self.image.size
		leftHalf = self.image.crop((0, 0, self.lastx, szY))
		leftImage = Image.new("RGB", (2*self.lastx, szY))
		rightHalf = self.image.crop((self.lastx, 0, szX, szY))
		rightImage = Image.new("RGB", (2*(szX-self.lastx), szY))
		leftImage.paste(leftHalf, (0, 0))
		leftImage.paste(
			ImageOps.mirror(leftHalf), (leftHalf.size[0], 0))
		rightImage.paste(
			ImageOps.mirror(rightHalf), (0, 0))
		rightImage.paste(rightHalf, (rightHalf.size[0], 0))
		return leftImage, rightImage

	def displaySplit(self):
		left, right = self.splitStuff()
		self.leftView = ImageViewer(left, "links")
		self.rightView = ImageViewer(right, "rechts")

	def saveCurrent(self):
		left, right = self.splitStuff()
		left.save("left.jpeg", "jpeg")
		right.save("right.jpeg", "jpeg")
		print "Saved to right.jpeg and left.jpeg"

if __name__=="__main__":
	import sys
	root = Ui(sys.argv[1])
	root.mainloop()
