mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			223 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			223 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """usage: 
 | |
| newsettings = FontDialog(('Chicago', 0, 12, (0, 0, 0)))	# font name or id, style flags, size, color (color is ignored)
 | |
| if newsettings:
 | |
| 	fontsettings, tabsettings = newsettings
 | |
| 	font, style, size, color = fontsettings	# 'font' is always the font name, not the id number
 | |
| 	# do something
 | |
| """
 | |
| 
 | |
| import W
 | |
| import PyEdit
 | |
| import TextEdit
 | |
| import Qd
 | |
| import string
 | |
| import types
 | |
| import sys
 | |
| import MacOS
 | |
| if hasattr(MacOS, "SysBeep"):
 | |
| 	SysBeep = MacOS.SysBeep
 | |
| else:
 | |
| 	def SysBeep(*args):
 | |
| 		pass
 | |
| 
 | |
| _stylenames = ["Plain", "Bold", "Italic", "Underline", "Outline", "Shadow", "Condensed", "Extended"]
 | |
| 
 | |
| 
 | |
| class _FontDialog:
 | |
| 	
 | |
| 	#def __del__(self):
 | |
| 	#	print "doei!"
 | |
| 	
 | |
| 	def __init__(self, fontsettings, tabsettings):
 | |
| 		leftmargin = 60
 | |
| 		leftmargin2 = leftmargin - 16
 | |
| 		self.w = W.ModalDialog((440, 180), 'Font settings')
 | |
| 		self.w.fonttitle = W.TextBox((10, 12, leftmargin2, 14), "Font:", TextEdit.teJustRight)
 | |
| 		self.w.pop = W.FontMenu((leftmargin, 10, 16, 16), self.setfont)
 | |
| 		self.w.fontname = W.TextBox((leftmargin + 20, 12, 150, 14))
 | |
| 		self.w.sizetitle = W.TextBox((10, 38, leftmargin2, 14), "Size:", TextEdit.teJustRight)
 | |
| 		self.w.sizeedit = W.EditText((leftmargin, 35, 40, 20), "", self.checksize)
 | |
| 		styletop = 64
 | |
| 		self.w.styletitle = W.TextBox((10, styletop + 2, leftmargin2, 14), "Style:", TextEdit.teJustRight)
 | |
| 		for i in range(len(_stylenames)):
 | |
| 			top = styletop + (i % 4) * 20
 | |
| 			left = leftmargin + 80 * (i > 3) - 2
 | |
| 			if i:
 | |
| 				self.w[i] = W.CheckBox((left, top, 76, 16), _stylenames[i], self.dostyle)
 | |
| 			else:
 | |
| 				self.w[i] = W.CheckBox((left, top, 70, 16), _stylenames[i], self.doplain)
 | |
| 		
 | |
| 		if tabsettings:
 | |
| 			self.lasttab, self.tabmode = tabsettings
 | |
| 			self.w.tabsizetitle = W.TextBox((10, -26, leftmargin2, 14), "Tabsize:", TextEdit.teJustRight)
 | |
| 			self.w.tabsizeedit = W.EditText((leftmargin, -29, 40, 20), "", self.checktab)
 | |
| 			self.w.tabsizeedit.set(`self.lasttab`)
 | |
| 			radiobuttons = []
 | |
| 			self.w.tabsizechars = W.RadioButton((leftmargin + 48, -26, 55, 14), "Spaces", 
 | |
| 					radiobuttons, self.toggletabmode)
 | |
| 			self.w.tabsizepixels = W.RadioButton((leftmargin + 110, -26, 55, 14), "Pixels", 
 | |
| 					radiobuttons, self.toggletabmode)
 | |
| 			if self.tabmode:
 | |
| 				self.w.tabsizechars.set(1)
 | |
| 			else:
 | |
| 				self.w.tabsizepixels.set(1)
 | |
| 		else:
 | |
| 			self.tabmode = None
 | |
| 		
 | |
| 		self.w.cancelbutton = W.Button((-180, -26, 80, 16), "Cancel", self.cancel)
 | |
| 		self.w.donebutton = W.Button((-90, -26, 80, 16), "Done", self.done)
 | |
| 		
 | |
| 		sampletext = "Sample text."
 | |
| 		self.w.sample = W.EditText((230, 10, -10, 130), sampletext, 
 | |
| 				fontsettings = fontsettings, tabsettings = tabsettings)
 | |
| 		
 | |
| 		self.w.setdefaultbutton(self.w.donebutton)
 | |
| 		self.w.bind('cmd.', self.w.cancelbutton.push)
 | |
| 		self.w.bind('cmdw', self.w.donebutton.push)
 | |
| 		self.lastsize = fontsettings[2]
 | |
| 		self._rv = None
 | |
| 		self.set(fontsettings)
 | |
| 		self.w.open()
 | |
| 	
 | |
| 	def toggletabmode(self, onoff):
 | |
| 		if self.w.tabsizechars.get():
 | |
| 			tabmode = 1
 | |
| 		else:
 | |
| 			tabmode = 0
 | |
| 		if self.tabmode <> tabmode:
 | |
| 			port = self.w.wid.GetWindowPort()
 | |
| 			(font, style, size, color), (tabsize, dummy) = self.get()
 | |
| 			savesettings = W.GetPortFontSettings(port)
 | |
| 			W.SetPortFontSettings(port, (font, style, size))
 | |
| 			spacewidth = Qd.StringWidth(' ')
 | |
| 			W.SetPortFontSettings(port, savesettings)
 | |
| 			if tabmode:
 | |
| 				# convert pixels to spaces
 | |
| 				self.lasttab = int(round(float(tabsize) / spacewidth))
 | |
| 			else:
 | |
| 				# convert spaces to pixels
 | |
| 				self.lasttab = spacewidth * tabsize
 | |
| 			self.w.tabsizeedit.set(`self.lasttab`)
 | |
| 			self.tabmode = tabmode
 | |
| 			self.doit()
 | |
| 	
 | |
| 	def set(self, fontsettings):
 | |
| 		font, style, size, color = fontsettings
 | |
| 		if type(font) <> types.StringType:
 | |
| 			import Res
 | |
| 			res = Res.GetResource('FOND', font)
 | |
| 			font = res.GetResInfo()[2]
 | |
| 		self.w.fontname.set(font)
 | |
| 		self.w.sizeedit.set(str(size))
 | |
| 		if style:
 | |
| 			for i in range(1, len(_stylenames)):
 | |
| 				self.w[i].set(style & 0x01)
 | |
| 				style = style >> 1
 | |
| 		else:
 | |
| 			self.w[0].set(1)
 | |
| 	
 | |
| 	def get(self):
 | |
| 		font = self.w.fontname.get()
 | |
| 		style = 0
 | |
| 		if not self.w[0].get():
 | |
| 			flag = 0x01
 | |
| 			for i in range(1, len(_stylenames)):
 | |
| 				if self.w[i].get():
 | |
| 					style = style | flag
 | |
| 				flag = flag << 1
 | |
| 		size = self.lastsize
 | |
| 		if self.tabmode is None:
 | |
| 			return (font, style, size, (0, 0, 0)), (32, 0)
 | |
| 		else:
 | |
| 			return (font, style, size, (0, 0, 0)), (self.lasttab, self.tabmode)
 | |
| 	
 | |
| 	def doit(self):
 | |
| 		if self.w[0].get():
 | |
| 			style = 0
 | |
| 		else:
 | |
| 			style = 0
 | |
| 			for i in range(1, len(_stylenames)):
 | |
| 				if self.w[i].get():
 | |
| 					style = style | 2 ** (i - 1)
 | |
| 		#self.w.sample.set(`style`)
 | |
| 		fontsettings, tabsettings = self.get()
 | |
| 		self.w.sample.setfontsettings(fontsettings)
 | |
| 		self.w.sample.settabsettings(tabsettings)
 | |
| 	
 | |
| 	def checktab(self):
 | |
| 		tabsize = self.w.tabsizeedit.get()
 | |
| 		if not tabsize:
 | |
| 			return
 | |
| 		try:
 | |
| 			tabsize = string.atoi(tabsize)
 | |
| 		except (ValueError, OverflowError):
 | |
| 			good = 0
 | |
| 			sys.exc_traceback = None
 | |
| 		else:
 | |
| 			good = 1 <= tabsize <= 500
 | |
| 		if good:
 | |
| 			if self.lasttab <> tabsize:
 | |
| 				self.lasttab = tabsize
 | |
| 				self.doit()
 | |
| 		else:
 | |
| 			SysBeep(0)
 | |
| 			self.w.tabsizeedit.set(`self.lasttab`)
 | |
| 			self.w.tabsizeedit.selectall()
 | |
| 	
 | |
| 	def checksize(self):
 | |
| 		size = self.w.sizeedit.get()
 | |
| 		if not size:
 | |
| 			return
 | |
| 		try:
 | |
| 			size = string.atoi(size)
 | |
| 		except (ValueError, OverflowError):
 | |
| 			good = 0
 | |
| 			sys.exc_traceback = None
 | |
| 		else:
 | |
| 			good = 1 <= size <= 500
 | |
| 		if good:
 | |
| 			if self.lastsize <> size:
 | |
| 				self.lastsize = size
 | |
| 				self.doit()
 | |
| 		else:
 | |
| 			SysBeep(0)
 | |
| 			self.w.sizeedit.set(`self.lastsize`)
 | |
| 			self.w.sizeedit.selectall()
 | |
| 	
 | |
| 	def doplain(self):
 | |
| 		for i in range(1, len(_stylenames)):
 | |
| 			self.w[i].set(0)
 | |
| 		self.w[0].set(1)
 | |
| 		self.doit()
 | |
| 	
 | |
| 	def dostyle(self):
 | |
| 		for i in range(1, len(_stylenames)):
 | |
| 			if self.w[i].get():
 | |
| 				self.w[0].set(0)
 | |
| 				break
 | |
| 		else:
 | |
| 			self.w[0].set(1)
 | |
| 		self.doit()
 | |
| 	
 | |
| 	def close(self):
 | |
| 		self.w.close()
 | |
| 		del self.w
 | |
| 	
 | |
| 	def cancel(self):
 | |
| 		self.close()
 | |
| 	
 | |
| 	def done(self):
 | |
| 		self._rv = self.get()
 | |
| 		self.close()
 | |
| 	
 | |
| 	def setfont(self, fontname):
 | |
| 		self.w.fontname.set(fontname)
 | |
| 		self.doit()
 | |
| 	
 | |
| 
 | |
| def FontDialog(fontsettings, tabsettings = (32, 0)):
 | |
| 	fd = _FontDialog(fontsettings, tabsettings)
 | |
| 	return fd._rv
 | |
| 
 | |
| def test():
 | |
| 	print FontDialog(('Zapata-Light', 0, 25, (0, 0, 0)))
 | 
