# A CSplit is a Clock-shaped split: the children are grouped in a circle.
# The numbering is a little different from a real clock: the 12 o'clock
# position is called 0, not 12.  This is a little easier since Python
# usually counts from zero.  (BTW, there needn't be exactly 12 children.)


from math import pi, sin, cos
from Split import Split

class CSplit(Split):
	#
	def getminsize(self, (m, (width, height))):
		# Since things look best if the children are spaced evenly
		# along the circle (and often all children have the same
		# size anyway) we compute the max child size and assume
		# this is each child's size.
		for child in self.children:
			wi, he = child.getminsize(m, (0, 0))
			width = max(width, wi)
			height = max(height, he)
		# In approximation, the diameter of the circle we need is
		# (diameter of box) * (#children) / pi.
		# We approximate pi by 3 (so we slightly overestimate
		# our minimal size requirements -- not so bad).
		# Because the boxes stick out of the circle we add the
		# box size to each dimension.
		# Because we really deal with ellipses, do everything
		# separate in each dimension.
		n = len(self.children)
		return width + (width*n + 2)/3, height + (height*n + 2)/3
	#
	def getbounds(self):
		return self.bounds
	#
	def setbounds(self, bounds):
		self.bounds = bounds
		# Place the children.  This involves some math.
		# Compute center positions for children as if they were
		# ellipses with a diameter about 1/N times the
		# circumference of the big ellipse.
		# (There is some rounding involved to make it look
		# reasonable for small and large N alike.)
		# XXX One day Python will have automatic conversions...
		n = len(self.children)
		fn = float(n)
		if n == 0: return
		(left, top), (right, bottom) = bounds
		width, height = right-left, bottom-top
		child_width, child_height = width*3/(n+4), height*3/(n+4)
		half_width, half_height = \
			float(width-child_width)/2.0, \
			float(height-child_height)/2.0
		center_h, center_v = center = (left+right)/2, (top+bottom)/2
		fch, fcv = float(center_h), float(center_v)
		alpha = 2.0 * pi / fn
		for i in range(n):
			child = self.children[i]
			fi = float(i)
			fh, fv = \
				fch + half_width*sin(fi*alpha), \
				fcv - half_height*cos(fi*alpha)
			left, top = \
				int(fh) - child_width/2, \
				int(fv) - child_height/2
			right, bottom = \
				left + child_width, \
				top + child_height
			child.setbounds((left, top), (right, bottom))
	#
