| """Easy to use dialogs. | 
 |  | 
 | Message(msg) -- display a message and an OK button. | 
 | AskString(prompt, default) -- ask for a string, display OK and Cancel buttons. | 
 | AskYesNoCancel(question, default) -- display a question and Yes, No and Cancel buttons. | 
 | bar = Progress(label, maxvalue) -- Display a progress bar | 
 | bar.set(value) -- Set value | 
 |  | 
 | More documentation in each function. | 
 | This module uses DLOG resources 256, 257 and 258. | 
 | Based upon STDWIN dialogs with the same names and functions. | 
 | """ | 
 |  | 
 | from Dlg import GetNewDialog, SetDialogItemText, GetDialogItemText, ModalDialog | 
 | import Qd | 
 | import QuickDraw | 
 |  | 
 |  | 
 | def Message(msg): | 
 | 	"""Display a MESSAGE string. | 
 | 	 | 
 | 	Return when the user clicks the OK button or presses Return. | 
 | 	 | 
 | 	The MESSAGE string can be at most 255 characters long. | 
 | 	""" | 
 | 	 | 
 | 	id = 256 | 
 | 	d = GetNewDialog(id, -1) | 
 | 	if not d: | 
 | 		print "Can't get DLOG resource with id =", id | 
 | 		return | 
 | 	tp, h, rect = d.GetDialogItem(2) | 
 | 	SetDialogItemText(h, msg) | 
 | 	d.SetDialogDefaultItem(1) | 
 | 	while 1: | 
 | 		n = ModalDialog(None) | 
 | 		if n == 1: | 
 | 			return | 
 |  | 
 |  | 
 | def AskString(prompt, default = ""): | 
 | 	"""Display a PROMPT string and a text entry field with a DEFAULT string. | 
 | 	 | 
 | 	Return the contents of the text entry field when the user clicks the | 
 | 	OK button or presses Return. | 
 | 	Return None when the user clicks the Cancel button. | 
 | 	 | 
 | 	If omitted, DEFAULT is empty. | 
 | 	 | 
 | 	The PROMPT and DEFAULT strings, as well as the return value, | 
 | 	can be at most 255 characters long. | 
 | 	""" | 
 | 	 | 
 | 	id = 257 | 
 | 	d = GetNewDialog(id, -1) | 
 | 	if not d: | 
 | 		print "Can't get DLOG resource with id =", id | 
 | 		return | 
 | 	tp, h, rect = d.GetDialogItem(3) | 
 | 	SetDialogItemText(h, prompt) | 
 | 	tp, h, rect = d.GetDialogItem(4) | 
 | 	SetDialogItemText(h, default) | 
 | #	d.SetDialogItem(4, 0, 255) | 
 | 	d.SetDialogDefaultItem(1) | 
 | 	d.SetDialogCancelItem(2) | 
 | 	while 1: | 
 | 		n = ModalDialog(None) | 
 | 		if n == 1: | 
 | 			tp, h, rect = d.GetDialogItem(4) | 
 | 			return GetDialogItemText(h) | 
 | 		if n == 2: return None | 
 |  | 
 |  | 
 | def AskYesNoCancel(question, default = 0): | 
 | ##	"""Display a QUESTION string which can be answered with Yes or No. | 
 | ##	 | 
 | ##	Return 1 when the user clicks the Yes button. | 
 | ##	Return 0 when the user clicks the No button. | 
 | ##	Return -1 when the user clicks the Cancel button. | 
 | ##	 | 
 | ##	When the user presses Return, the DEFAULT value is returned. | 
 | ##	If omitted, this is 0 (No). | 
 | ##	 | 
 | ##	The QUESTION strign ca be at most 255 characters. | 
 | ##	""" | 
 | 	 | 
 | 	id = 258 | 
 | 	d = GetNewDialog(id, -1) | 
 | 	if not d: | 
 | 		print "Can't get DLOG resource with id =", id | 
 | 		return | 
 | 	# Button assignments: | 
 | 	# 1 = default (invisible) | 
 | 	# 2 = Yes | 
 | 	# 3 = No | 
 | 	# 4 = Cancel | 
 | 	# The question string is item 5 | 
 | 	tp, h, rect = d.GetDialogItem(5) | 
 | 	SetDialogItemText(h, question) | 
 | 	d.SetDialogCancelItem(4) | 
 | 	if default == 1: | 
 | 		d.SetDialogDefaultItem(2) | 
 | 	elif default == 0: | 
 | 		d.SetDialogDefaultItem(3) | 
 | 	elif default == -1: | 
 | 		d.SetDialogDefaultItem(4) | 
 | 	while 1: | 
 | 		n = ModalDialog(None) | 
 | 		if n == 1: return default | 
 | 		if n == 2: return 1 | 
 | 		if n == 3: return 0 | 
 | 		if n == 4: return -1 | 
 | 		 | 
 | class ProgressBar: | 
 | 	def __init__(self, label="Working...", maxval=100): | 
 | 		self.label = label | 
 | 		self.maxval = maxval | 
 | 		self.curval = -1 | 
 | 		self.d = GetNewDialog(259, -1) | 
 | 		tp, text_h, rect = self.d.GetDialogItem(2) | 
 | 		SetDialogItemText(text_h, label) | 
 | 		self._update(0) | 
 | 		 | 
 | 	def _update(self, value): | 
 | 		tp, h, bar_rect = self.d.GetDialogItem(3) | 
 | 		Qd.SetPort(self.d) | 
 | 		 | 
 | 		Qd.FrameRect(bar_rect)	# Draw outline | 
 | 		 | 
 | 		inner_rect = Qd.InsetRect(bar_rect, 1, 1) | 
 | 		l, t, r, b = inner_rect | 
 |  | 
 | 		Qd.ForeColor(QuickDraw.blackColor) | 
 | 		Qd.BackColor(QuickDraw.blackColor) | 
 | 		Qd.PaintRect((l, t, int(l + (r-l)*value/self.maxval), b))	# Draw bar | 
 |  | 
 | 		Qd.ForeColor(QuickDraw.whiteColor) | 
 | 		Qd.BackColor(QuickDraw.whiteColor) | 
 | 		Qd.PaintRect((int(l + (r-l)*value/self.maxval), t, r, b))	# Clear rest | 
 | 				 | 
 | 		# Restore settings | 
 | 		Qd.ForeColor(QuickDraw.blackColor) | 
 | 		Qd.BackColor(QuickDraw.whiteColor) | 
 | 		 | 
 | 		# Test for cancel button | 
 | 		if ModalDialog(_ProgressBar_filterfunc) == 1: | 
 | 			raise KeyboardInterrupt | 
 | 			 | 
 | 	def set(self, value): | 
 | 		if value < 0: value = 0 | 
 | 		if value > self.maxval: value = self.maxval | 
 | 		self._update(value) | 
 | 		 | 
 | def _ProgressBar_filterfunc(*args): | 
 | 	return 2 # Disabled, for now. | 
 | 	 | 
 | def test(): | 
 | 	Message("Testing EasyDialogs.") | 
 | 	ok = AskYesNoCancel("Do you want to proceed?") | 
 | 	if ok > 0: | 
 | 		s = AskString("Enter your first name") | 
 | 		Message("Thank you,\015%s" % `s`) | 
 | 	bar = ProgressBar("Counting...", 100) | 
 | 	for i in range(100): | 
 | 		bar.set(i) | 
 | 	del bar | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 | 	test() |