mirror of
				https://github.com/python/cpython.git
				synced 2025-10-29 12:44:56 +00:00 
			
		
		
		
	
		
			
	
	
		
			57 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			57 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | # 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 | ||
|  | 	# |