summaryrefslogtreecommitdiffstats
path: root/Lib/lib-stdwin/FormSplit.py
blob: 4f0bd01fd941abf3e316dbb279710c471bdc7779 (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
# A FormSplit lets you place its children exactly where you want them
# (including silly places!).
# It does no explicit geometry management except moving its children
# when it is moved.
# The interface to place children is as follows.
# Before you add a child, you may specify its (left, top) position
# relative to the FormSplit.  If you don't specify a position for
# a child, it goes right below the previous child; the first child
# goes to (0, 0) by default.
# NB: This places data attributes named form_* on its children.
# XXX Yes, I know, there should be options to do all sorts of relative
# placement, but for now this will do.

from Split import Split

class FormSplit() = Split():
	#
	def create(self, parent):
		self.next_left = self.next_top = 0
		self.last_child = None
		return Split.create(self, parent)
	#
	def minsize(self, m):
		max_width, max_height = 0, 0
		for c in self.children:
			c.form_width, c.form_height = c.minsize(m)
			max_width = max(max_width, c.form_width + c.form_left)
			max_height = max(max_height, c.form_height + c.form_top)
		return max_width, max_height
	#
	def getbounds(self):
		return self.bounds
	#
	def setbounds(self, bounds):
		self.bounds = bounds
		fleft, ftop = bounds[0]
		for c in self.children:
			left, top = c.form_left + fleft, c.form_top + ftop
			right, bottom = left + c.form_width, top + c.form_height
			c.setbounds((left, top), (right, bottom))
	#
	def placenext(self, (left, top)):
		self.next_left = left
		self.next_top = top
		self.last_child = None
	#
	def addchild(self, child):
		if self.last_child:
			width, height = \
			    self.last_child.minsize(self.beginmeasuring())
			self.next_top = self.next_top + height
		child.form_left = self.next_left
		child.form_top = self.next_top
		Split.addchild(self, child)
		self.last_child = child
	#