summaryrefslogtreecommitdiffstats
path: root/Lib/stdwin/CSplit.py
blob: a9d3556533e3e9007d1d80876deb48db87565d77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 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))
	#