from ArrayOps import *
from EditableVectorShape import *
from EditableVectorSprite import *

class VectorEditor:
	"""
		Class for plugging into a pen-and-screen system for making polygon based drawings.
		
		PenDown and drag on the canvas starts a line.
		PenDown on a vertex and drag, continues the polygon.
		
		PenDown and up (no move) selects/unselects a vertex.
		PenDown and up on a polygon will select the whole polygon.
		PenDown and up on an empty space deselects all.
		PenDown and dragging selected vertexes moves them.
		
		Colorpicker changes the color of a shape.
		Status selector can be:
			OPEN = 0 		Open line.
			OUTLINE = 1		Outline shape.
			FILLED = 2		Filled shape.
			OUTLINEFILLED = 3	Outline and filled shape.
		Up and down buttons move the shape higher or lower in the draw priority list.
	"""
	spriteClass = EditableVectorSprite
	
	def __init__(self):
		self.size = [640, 480]
		self.sprite = self.spriteClass(self)
		self.down = None
		self.moved = False
		self.last = None
	
	def GetSize(self):
		return self.size
	
	def SetSize(self, size):
		self.sprite.SetSize(size)
	
	def PenDown(self, pos):
		self.down = pos
		self.moved = False
		self.sprite.SelectLast(pos)
	
	def PenTo(self, pos, rel):
		if self.down:
			if self.sprite.Selected():
				self.sprite.MoveSelected(rel)
			else:
				# if we're dragging off a vertex, add a new point
				if self.moved:
					# move the currentVertex point of this poly
					self.sprite.SetLastPoint(tuple(pos))
				else:
					# if we have a selected a last one
					if self.sprite.Last():
						self.sprite.Last().AddPoint(tuple(pos), self.down)
					else:
						# create a new poly with two points
						self.sprite.New([tuple(self.down), tuple(pos)])
			self.moved = True
		else:
			self.sprite.Hovering(pos)
	
	def PenUp(self, pos):
		self.down = None
		# clicked once
		if not self.moved:
			if not self.sprite.Select(pos):
				# else deselect everything
				self.sprite.DeselectAll()
		else:
			# if we've dragged a vertex within distance of another vertex:
			self.sprite.TestDragged()
	
	def Draw(self):
		self.sprite.Draw()
	
	###########
	# Actions #
	###########
	
	def DeleteSelected(self):
		self.sprite.DeleteSelected()
	

