Initial revision
This commit is contained in:
parent
b3fa13cef7
commit
7df0c16b61
|
@ -0,0 +1,70 @@
|
|||
# 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 minsize(self, m):
|
||||
# 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.
|
||||
width, height = 0, 0
|
||||
for child in self.children:
|
||||
wi, he = child.minsize(m)
|
||||
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))
|
||||
#
|
|
@ -0,0 +1,70 @@
|
|||
# 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 minsize(self, m):
|
||||
# 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.
|
||||
width, height = 0, 0
|
||||
for child in self.children:
|
||||
wi, he = child.minsize(m)
|
||||
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))
|
||||
#
|
Loading…
Reference in New Issue