1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 from os import sep
26 import sys
27 import wx
28 import wx.lib.buttons
29 import wx.lib.scrolledpanel
30
31
32 from status import Status; status = Status()
33
34
35 from gui.fonts import font
36 from gui.icons import relax_icons
37 from gui.paths import IMAGE_PATH, icon_22x22, icon_48x48
38 import gui
39
40
42 """Message box for general errors.
43
44 @param msg: The message to display.
45 @type msg: str
46 """
47
48
49 if status.show_gui:
50 wx.MessageBox(msg, caption=caption, style=wx.OK|wx.ICON_ERROR)
51
52
53 else:
54
55 if caption:
56 msg = "%s: %s" % (caption, msg)
57
58
59 sys.stderr.write(msg + "\n")
60
61
62
64 """Message box GUI element for when a setup is incomplete or there is missing data."""
65
67 """Set up the dialog.
68
69 @keyword missing: The list of missing data types.
70 @type missing: list of str
71 """
72
73
74 wx.Dialog.__init__(self, None, title='Missing data', style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.STAY_ON_TOP)
75
76
77 self.SetIcons(relax_icons)
78
79
80 self.SetSize((600, 400))
81
82
83 self.Centre()
84
85
86 main_sizer = wx.BoxSizer(wx.HORIZONTAL)
87 self.SetSizer(main_sizer)
88
89
90 sizer = gui.misc.add_border(main_sizer, border=10, packing=wx.HORIZONTAL)
91
92
93 bitmap = wx.StaticBitmap(self, -1, wx.Bitmap(icon_48x48.user_busy, wx.BITMAP_TYPE_ANY))
94 sizer.Add(bitmap)
95
96
97 sizer.AddSpacer(20)
98
99
100 panel = wx.lib.scrolledpanel.ScrolledPanel(self, -1)
101 panel.SetAutoLayout(1)
102 panel.SetupScrolling()
103 sizer.Add(panel, 1, wx.ALL|wx.EXPAND, 0)
104
105
106 panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
107 panel.SetSizer(panel_sizer)
108
109
110 msg = "The set up is incomplete.\n\n"
111 if not len(missing):
112 msg = msg + "Please check for missing data.\n"
113 else:
114 msg = msg + "Please check for the following missing information:\n"
115 for data in missing:
116 msg = msg + " %s\n" % data
117
118
119 text = wx.StaticText(panel, -1, msg, style=wx.TE_MULTILINE)
120 panel_sizer.Add(text)
121
122
123 if status.show_gui:
124 self.ShowModal()
125
126
127 else:
128 sys.stderr.write("Missing data: %s\n" % msg)
129
130
131
133 """Question box GUI element for obtaining a yes/no response from the user."""
134
135
136 border = 10
137 spacer_button = 10
138 spacer_main = 20
139 height_button = 30
140 width_button = 100
141
142 - def __init__(self, msg, parent=None, title='', size=(350, 125), default=False):
143 """A generic question box.
144
145 @param msg: The text message to display.
146 @type msg: str
147 @keyword parent: The parent wx object.
148 @type parent: wx.object instance
149 @keyword title: The window title.
150 @type title: str
151 @keyword default: If True, the default button will be 'yes', otherwise it will be 'no'.
152 @type default: bool
153 @return: The answer.
154 @rtype: bool
155 """
156
157
158 wx.Dialog.__init__(self, parent, title=title, size=size, style=wx.DEFAULT_DIALOG_STYLE|wx.STAY_ON_TOP)
159
160
161 self.pressed = False
162
163
164 if default:
165 self.answer = wx.ID_YES
166 else:
167 self.answer = wx.ID_NO
168
169
170 self.SetIcons(relax_icons)
171
172
173 self.Centre()
174
175
176 main_sizer = wx.BoxSizer(wx.HORIZONTAL)
177 self.SetSizer(main_sizer)
178
179
180 sizer = gui.misc.add_border(main_sizer, border=self.border, packing=wx.HORIZONTAL)
181
182
183 bitmap = wx.StaticBitmap(self, -1, wx.Bitmap(icon_48x48.dialog_warning_relax, wx.BITMAP_TYPE_ANY))
184 sizer.Add(bitmap)
185
186
187 sizer.AddSpacer(self.spacer_main)
188
189
190 sub_sizer = wx.BoxSizer(wx.VERTICAL)
191 sizer.Add(sub_sizer, 1, wx.ALL|wx.EXPAND, 0)
192
193
194 text = wx.StaticText(self, -1, msg, style=wx.TE_MULTILINE)
195 text.SetFont(font.normal)
196 sub_sizer.Add(text, 1, wx.ALL|wx.EXPAND, 0)
197
198
199 button_sizer = wx.BoxSizer(wx.HORIZONTAL)
200 sub_sizer.Add(button_sizer, 0, wx.ALIGN_RIGHT, 0)
201
202
203 button_yes = wx.lib.buttons.ThemedGenBitmapTextButton(self, -1, None, " Yes")
204 button_yes.SetBitmapLabel(wx.Bitmap(icon_22x22.dialog_ok, wx.BITMAP_TYPE_ANY))
205 button_yes.SetFont(font.normal)
206 button_yes.SetMinSize((self.width_button, self.height_button))
207 button_sizer.Add(button_yes, 0, wx.ADJUST_MINSIZE|wx.ALIGN_CENTER_VERTICAL, 0)
208 self.Bind(wx.EVT_BUTTON, self.yes, button_yes)
209
210
211 button_sizer.AddSpacer(self.spacer_button)
212
213
214 button_no = wx.lib.buttons.ThemedGenBitmapTextButton(self, -1, None, " No")
215 button_no.SetBitmapLabel(wx.Bitmap(icon_22x22.dialog_cancel, wx.BITMAP_TYPE_ANY))
216 button_no.SetFont(font.normal)
217 button_no.SetMinSize((self.width_button, self.height_button))
218 button_sizer.Add(button_no, 0, wx.ADJUST_MINSIZE|wx.ALIGN_CENTER_VERTICAL, 0)
219 self.Bind(wx.EVT_BUTTON, self.no, button_no)
220
221
222 if self.answer == wx.ID_YES:
223 button_yes.SetFocus()
224 else:
225 button_no.SetFocus()
226
227
228 self.Bind(wx.EVT_CLOSE, self.handler_close)
229
230
232 """Replacement ShowModal method.
233
234 @return: The answer to the question, either wx.ID_YES or wx.ID_NO.
235 @rtype: int
236 """
237
238
239 if status.show_gui:
240 super(Question, self).ShowModal()
241
242
243 return self.answer
244
245
247 """Event handler for the close window action.
248
249 @param event: The wx event.
250 @type event: wx event
251 """
252
253
254 if not self.pressed:
255 self.answer = wx.ID_NO
256
257
258 event.Skip()
259
260
261 - def no(self, event):
262 """No selection.
263
264 @param event: The wx event.
265 @type event: wx event
266 """
267
268
269 self.pressed = True
270
271
272 self.answer = wx.ID_NO
273
274
275 self.Close()
276
277
278 - def yes(self, event):
279 """Yes selection.
280
281 @param event: The wx event.
282 @type event: wx event
283 """
284
285
286 self.pressed = True
287
288
289 self.answer = wx.ID_YES
290
291
292 self.Close()
293