class RectangleException(Exception):
	pass

class Rectangle(list):
	"""
		This is basically a copy of pygame's "rect" class, but slower and in pure Python.
	"""
	def __init__(self, vals=[0, 0, 0, 0]):
		if len(vals) != 4:
			raise RectangleException("Rectangle must have four values")
		else:
			list.__init__(self, vals)
	
	def Set(self, *args):
		self.__init__(*args)
	
	def PointInRect(self, pos):
		return pos[0] < self.Right() and pos[0] > self.Left() and pos[1] < self.Bottom() and pos[1] > self.Top()
	
	def Width(self, val=None):
		if val:
			self[2] = val
		return self[2]
	
	def Height(self, val=None):
		if val:
			self[3] = val
		return self[3]
	
	def Right(self, val=None):
		if val:
			self[0] = val - self[2]
		return self[0] + self[2]
	
	def Left(self, val=None):
		if val:
			self[0] = val
		return self[0]
	
	def Top(self, val=None):
		if val:
			self[1] = val
		return self[1]
	
	def Bottom(self, val=None):
		if val:
			self[1] = val - self[3]
		return self[1] + self[3]
	
	def Position(self, val=None):
		if val:
			self[:2] = val
		return self[:2]
	
	def CenterX(self, val=None):
		if val:
			self[0] = val - self[2] / 2
		return self[0] + self[2] / 2
	
	def CenterY(self, val=None):
		if val:
			self[1] = val - self[3] / 2
		return self[1] + self[3] / 2
	
	def Center(self, val=None):
		if val:
			if len(val) == 2:
				self[0] = val[0] - self[2] / 2
				self[1] = val[1] - self[3] / 2
			else:
				raise RectangleException("Can only set Center to a two value list")
		return [self[0] + self[2] / 2, self[1] + self[3] / 2]
	
	def Grow(self, *amount):
		self[2] += amount[0]
		self[3] += amount[1]
		return self
	
	def Absolute(self):
		""" Rectify negative width/height """
		for x in (2, 3):
			if self[x] < 0:
				self[x - 2] += self[x]
				self[x] = -self[x]
		return self
	
	def Clip(self, rectangle):
		newrect = Rectangle(rectangle)
		newleft = max(newrect.Left(), self.Left())
		newtop = max(newrect.Top(), self.Top())
		newwidth = min(newrect.Right(), self.Right()) - newleft
		newheight = min(newrect.Bottom(), self.Bottom()) - newtop
		newrect.Left(newleft)
		newrect.Top(newtop)
		newrect.Width(newwidth)
		newrect.Height(newheight)
		return newrect


