blob: 9ad38586ab1f8d70f338ddcf0391dd252b140ec3 [file] [log] [blame]
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +00001"""Easy to use dialogs.
2
3Message(msg) -- display a message and an OK button.
4AskString(prompt, default) -- ask for a string, display OK and Cancel buttons.
5AskYesNoCancel(question, default) -- display a question and Yes, No and Cancel buttons.
Jack Jansen3a87f5b1995-11-14 10:13:49 +00006bar = Progress(label, maxvalue) -- Display a progress bar
7bar.set(value) -- Set value
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +00008
9More documentation in each function.
10This module uses DLOG resources 256, 257 and 258.
11Based upon STDWIN dialogs with the same names and functions.
12"""
13
Jack Jansene4b40381995-07-17 13:25:15 +000014from Dlg import GetNewDialog, SetDialogItemText, GetDialogItemText, ModalDialog
Jack Jansen3a87f5b1995-11-14 10:13:49 +000015import Qd
Jack Jansen3a87f5b1995-11-14 10:13:49 +000016import QuickDraw
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000017
18
19def Message(msg):
20 """Display a MESSAGE string.
21
22 Return when the user clicks the OK button or presses Return.
23
24 The MESSAGE string can be at most 255 characters long.
25 """
26
27 id = 256
28 d = GetNewDialog(id, -1)
29 if not d:
30 print "Can't get DLOG resource with id =", id
31 return
Jack Jansene4b40381995-07-17 13:25:15 +000032 tp, h, rect = d.GetDialogItem(2)
33 SetDialogItemText(h, msg)
Jack Jansen3a87f5b1995-11-14 10:13:49 +000034 d.SetDialogDefaultItem(1)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000035 while 1:
36 n = ModalDialog(None)
37 if n == 1:
38 return
39
40
41def AskString(prompt, default = ""):
42 """Display a PROMPT string and a text entry field with a DEFAULT string.
43
44 Return the contents of the text entry field when the user clicks the
45 OK button or presses Return.
46 Return None when the user clicks the Cancel button.
47
48 If omitted, DEFAULT is empty.
49
50 The PROMPT and DEFAULT strings, as well as the return value,
51 can be at most 255 characters long.
52 """
53
54 id = 257
55 d = GetNewDialog(id, -1)
56 if not d:
57 print "Can't get DLOG resource with id =", id
58 return
Jack Jansene4b40381995-07-17 13:25:15 +000059 tp, h, rect = d.GetDialogItem(3)
60 SetDialogItemText(h, prompt)
61 tp, h, rect = d.GetDialogItem(4)
62 SetDialogItemText(h, default)
63# d.SetDialogItem(4, 0, 255)
Jack Jansen3a87f5b1995-11-14 10:13:49 +000064 d.SetDialogDefaultItem(1)
65 d.SetDialogCancelItem(2)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000066 while 1:
67 n = ModalDialog(None)
68 if n == 1:
Jack Jansene4b40381995-07-17 13:25:15 +000069 tp, h, rect = d.GetDialogItem(4)
70 return GetDialogItemText(h)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +000071 if n == 2: return None
72
73
74def AskYesNoCancel(question, default = 0):
75## """Display a QUESTION string which can be answered with Yes or No.
76##
77## Return 1 when the user clicks the Yes button.
78## Return 0 when the user clicks the No button.
79## Return -1 when the user clicks the Cancel button.
80##
81## When the user presses Return, the DEFAULT value is returned.
82## If omitted, this is 0 (No).
83##
84## The QUESTION strign ca be at most 255 characters.
85## """
86
87 id = 258
88 d = GetNewDialog(id, -1)
89 if not d:
90 print "Can't get DLOG resource with id =", id
91 return
92 # Button assignments:
93 # 1 = default (invisible)
94 # 2 = Yes
95 # 3 = No
96 # 4 = Cancel
97 # The question string is item 5
Jack Jansene4b40381995-07-17 13:25:15 +000098 tp, h, rect = d.GetDialogItem(5)
99 SetDialogItemText(h, question)
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000100 d.SetDialogCancelItem(4)
Jack Jansen0b690db1996-04-10 14:49:41 +0000101 if default == 1:
102 d.SetDialogDefaultItem(2)
103 elif default == 0:
104 d.SetDialogDefaultItem(3)
105 elif default == -1:
106 d.SetDialogDefaultItem(4)
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000107 while 1:
108 n = ModalDialog(None)
109 if n == 1: return default
110 if n == 2: return 1
111 if n == 3: return 0
112 if n == 4: return -1
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000113
114class ProgressBar:
115 def __init__(self, label="Working...", maxval=100):
116 self.label = label
117 self.maxval = maxval
118 self.curval = -1
119 self.d = GetNewDialog(259, -1)
120 tp, text_h, rect = self.d.GetDialogItem(2)
Jack Jansen3a4b3b01996-10-15 16:11:50 +0000121 SetDialogItemText(text_h, label)
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000122 self._update(0)
123
124 def _update(self, value):
125 tp, h, bar_rect = self.d.GetDialogItem(3)
126 Qd.SetPort(self.d)
127
128 Qd.FrameRect(bar_rect) # Draw outline
129
130 inner_rect = Qd.InsetRect(bar_rect, 1, 1)
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000131 l, t, r, b = inner_rect
Jack Jansen3a4b3b01996-10-15 16:11:50 +0000132
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000133 Qd.ForeColor(QuickDraw.blackColor)
134 Qd.BackColor(QuickDraw.blackColor)
Jack Jansen3a4b3b01996-10-15 16:11:50 +0000135 Qd.PaintRect((l, t, int(l + (r-l)*value/self.maxval), b)) # Draw bar
136
137 Qd.ForeColor(QuickDraw.whiteColor)
138 Qd.BackColor(QuickDraw.whiteColor)
139 Qd.PaintRect((int(l + (r-l)*value/self.maxval), t, r, b)) # Clear rest
140
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000141 # Restore settings
142 Qd.ForeColor(QuickDraw.blackColor)
143 Qd.BackColor(QuickDraw.whiteColor)
144
145 # Test for cancel button
Jack Jansen30fe3631996-10-04 15:21:00 +0000146 if ModalDialog(_ProgressBar_filterfunc) == 1:
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000147 raise KeyboardInterrupt
148
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000149 def set(self, value):
150 if value < 0: value = 0
151 if value > self.maxval: value = self.maxval
152 self._update(value)
153
Jack Jansen30fe3631996-10-04 15:21:00 +0000154def _ProgressBar_filterfunc(*args):
155 return 2 # Disabled, for now.
156
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000157def test():
158 Message("Testing EasyDialogs.")
159 ok = AskYesNoCancel("Do you want to proceed?")
160 if ok > 0:
161 s = AskString("Enter your first name")
162 Message("Thank you,\015%s" % `s`)
Jack Jansen3a87f5b1995-11-14 10:13:49 +0000163 bar = ProgressBar("Counting...", 100)
164 for i in range(100):
165 bar.set(i)
166 del bar
Guido van Rossum8f4b6ad1995-04-05 09:18:35 +0000167
168
169if __name__ == '__main__':
170 test()