mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			169 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
# A 'WindowParent' is the only module that uses real stdwin functionality.
 | 
						|
# It is the root of the tree.
 | 
						|
# It should have exactly one child when realized.
 | 
						|
#
 | 
						|
# There is also some support for a standard main loop here.
 | 
						|
 | 
						|
import stdwin
 | 
						|
from stdwinevents import *
 | 
						|
 | 
						|
from TransParent import ManageOneChild
 | 
						|
 | 
						|
Error = 'WindowParent.Error'	# Exception
 | 
						|
 | 
						|
WindowList = []			# List containing all windows
 | 
						|
 | 
						|
class WindowParent() = ManageOneChild():
 | 
						|
	#
 | 
						|
	def create(self, (title, size)):
 | 
						|
		self.title = title
 | 
						|
		self.size = size		# (width, height)
 | 
						|
		self._reset()
 | 
						|
		return self
 | 
						|
	#
 | 
						|
	def _reset(self):
 | 
						|
		self.child = None
 | 
						|
		self.win = None
 | 
						|
		self.itimer = 0
 | 
						|
		self.do_mouse = 0
 | 
						|
		self.do_keybd = 0
 | 
						|
		self.do_timer = 0
 | 
						|
		self.do_altdraw = 0
 | 
						|
		self.pending_destroy = 0
 | 
						|
		self.close_hook = None
 | 
						|
	#
 | 
						|
	def destroy(self):
 | 
						|
		if self.win in WindowList:
 | 
						|
			WindowList.remove(self.win)
 | 
						|
		if self.child: self.child.destroy()
 | 
						|
		self._reset()
 | 
						|
	#
 | 
						|
	def delayed_destroy(self):
 | 
						|
		# This interface to be used by 'Close' buttons etc.;
 | 
						|
		# destroying a window from within a button hook
 | 
						|
		# is not a good idea...
 | 
						|
		self.pending_destroy = 1
 | 
						|
	#
 | 
						|
	def close_trigger(self):
 | 
						|
		if self.close_hook: self.close_hook(self)
 | 
						|
	#
 | 
						|
	def need_mouse(self, child): self.do_mouse = 1
 | 
						|
	def no_mouse(self, child): self.do_mouse = 0
 | 
						|
	#
 | 
						|
	def need_keybd(self, child): self.do_keybd = 1
 | 
						|
	def no_keybd(self, child): self.do_keybd = 0
 | 
						|
	#
 | 
						|
	def need_timer(self, child): self.do_timer = 1
 | 
						|
	def no_timer(self, child): self.do_timer = 0
 | 
						|
	#
 | 
						|
	def need_altdraw(self, child): self.do_altdraw = 1
 | 
						|
	def no_altdraw(self, child): self.do_altdraw = 0
 | 
						|
	#
 | 
						|
	def realize(self):
 | 
						|
		if self.win:
 | 
						|
			raise Error, 'realize(): called twice'
 | 
						|
		if not self.child:
 | 
						|
			raise Error, 'realize(): no child'
 | 
						|
		size = self.child.minsize(self.beginmeasuring())
 | 
						|
		self.size = max(self.size[0], size[0]), \
 | 
						|
					max(self.size[1], size[1])
 | 
						|
		# XXX Don't... stdwin.setdefscrollbars(0, 0)
 | 
						|
		stdwin.setdefwinsize(self.size)
 | 
						|
		self.win = stdwin.open(self.title)
 | 
						|
		self.win.setdocsize(self.size)
 | 
						|
		if self.itimer:
 | 
						|
			self.win.settimer(self.itimer)
 | 
						|
		bounds = (0, 0), self.win.getwinsize()
 | 
						|
		self.child.setbounds(bounds)
 | 
						|
		self.child.realize()
 | 
						|
		self.win.dispatch = self.dispatch
 | 
						|
		WindowList.append(self.win)
 | 
						|
	#
 | 
						|
	def fixup(self):
 | 
						|
		self.size = self.child.minsize(self.beginmeasuring())
 | 
						|
		self.win.setdocsize(self.size)
 | 
						|
		bounds = (0, 0), self.win.getwinsize()
 | 
						|
		self.child.setbounds(bounds)
 | 
						|
		# Force a redraw of the entire window:
 | 
						|
		self.win.change((0, 0), (10000, 10000))
 | 
						|
	#
 | 
						|
	def beginmeasuring(self):
 | 
						|
		# Return something with which a child can measure text
 | 
						|
		if self.win:
 | 
						|
			return self.win.begindrawing()
 | 
						|
		else:
 | 
						|
			return stdwin
 | 
						|
	#
 | 
						|
	def begindrawing(self):
 | 
						|
		if self.win:
 | 
						|
			return self.win.begindrawing()
 | 
						|
		else:
 | 
						|
			raise Error, 'begindrawing(): not realized yet'
 | 
						|
	#
 | 
						|
	def getwindow(self):
 | 
						|
		if self.win:
 | 
						|
			return self.win
 | 
						|
		else:
 | 
						|
			raise Error, 'getwindow(): not realized yet'
 | 
						|
	#
 | 
						|
	def change(self, area):
 | 
						|
		if self.win:
 | 
						|
			self.win.change(area)
 | 
						|
	#
 | 
						|
	def scroll(self, args):
 | 
						|
		if self.win:
 | 
						|
			self.win.scroll(args)
 | 
						|
	#
 | 
						|
	def settimer(self, itimer):
 | 
						|
		if self.win:
 | 
						|
			self.win.settimer(itimer)
 | 
						|
		else:
 | 
						|
			self.itimer = itimer
 | 
						|
	#
 | 
						|
	# Only call dispatch once we are realized
 | 
						|
	#
 | 
						|
	def dispatch(self, (type, win, detail)):
 | 
						|
		if type = WE_DRAW:
 | 
						|
			d = self.win.begindrawing()
 | 
						|
			self.child.draw(d, detail)
 | 
						|
			del d
 | 
						|
			if self.do_altdraw: self.child.altdraw(detail)
 | 
						|
		elif type = WE_MOUSE_DOWN:
 | 
						|
			if self.do_mouse: self.child.mouse_down(detail)
 | 
						|
		elif type = WE_MOUSE_MOVE:
 | 
						|
			if self.do_mouse: self.child.mouse_move(detail)
 | 
						|
		elif type = WE_MOUSE_UP:
 | 
						|
			if self.do_mouse: self.child.mouse_up(detail)
 | 
						|
		elif type in (WE_CHAR, WE_COMMAND):
 | 
						|
			if self.do_keybd: self.child.keybd(type, detail)
 | 
						|
		elif type = WE_TIMER:
 | 
						|
			if self.do_timer: self.child.timer()
 | 
						|
		elif type = WE_SIZE:
 | 
						|
			self.fixup()
 | 
						|
		elif type = WE_CLOSE:
 | 
						|
			self.close_trigger()
 | 
						|
		if self.pending_destroy:
 | 
						|
			self.destroy()
 | 
						|
	#
 | 
						|
 | 
						|
def MainLoop():
 | 
						|
	while WindowList:
 | 
						|
		Dispatch(stdwin.getevent())
 | 
						|
 | 
						|
def Dispatch(event):
 | 
						|
	window = event[1]
 | 
						|
	if window in WindowList:
 | 
						|
		window.dispatch(event)
 | 
						|
	else:
 | 
						|
		stdwin.fleep()
 | 
						|
 | 
						|
# Interface used by WindowSched:
 | 
						|
 | 
						|
def CountWindows():
 | 
						|
	return len(WindowList)
 | 
						|
 | 
						|
def AnyWindow():
 | 
						|
	if not WindowList:
 | 
						|
		return None
 | 
						|
	else:
 | 
						|
		return WindowList[0]
 |