Setting up a trunk for branching
[nqaap] / src / opt / Nqa-Audiobook-player / hildonize.py
1 #!/usr/bin/env python
2
3 """
4 Open Issues
5         @bug not all of a message is shown
6         @bug Buttons are too small
7 """
8
9
10 import gobject
11 import gtk
12 import dbus
13
14
15 class _NullHildonModule(object):
16         pass
17
18
19 try:
20         import hildon as _hildon
21         hildon  = _hildon # Dumb but gets around pyflakiness
22 except (ImportError, OSError):
23         hildon = _NullHildonModule
24
25
26 IS_HILDON_SUPPORTED = hildon is not _NullHildonModule
27
28
29 class _NullHildonProgram(object):
30
31         def add_window(self, window):
32                 pass
33
34
35 def _hildon_get_app_class():
36         return hildon.Program
37
38
39 def _null_get_app_class():
40         return _NullHildonProgram
41
42
43 try:
44         hildon.Program
45         get_app_class = _hildon_get_app_class
46 except AttributeError:
47         get_app_class = _null_get_app_class
48
49
50 def _hildon_set_application_title(window, title):
51         pass
52
53
54 def _null_set_application_title(window, title):
55         window.set_title(title)
56
57
58 if IS_HILDON_SUPPORTED:
59         set_application_title = _hildon_set_application_title
60 else:
61         set_application_title = _null_set_application_title
62
63
64 def _fremantle_hildonize_window(app, window):
65         oldWindow = window
66         newWindow = hildon.StackableWindow()
67         if oldWindow.get_child() is not None:
68                 oldWindow.get_child().reparent(newWindow)
69         app.add_window(newWindow)
70         return newWindow
71
72
73 def _hildon_hildonize_window(app, window):
74         oldWindow = window
75         newWindow = hildon.Window()
76         if oldWindow.get_child() is not None:
77                 oldWindow.get_child().reparent(newWindow)
78         app.add_window(newWindow)
79         return newWindow
80
81
82 def _null_hildonize_window(app, window):
83         return window
84
85
86 try:
87         hildon.StackableWindow
88         hildonize_window = _fremantle_hildonize_window
89 except AttributeError:
90         try:
91                 hildon.Window
92                 hildonize_window = _hildon_hildonize_window
93         except AttributeError:
94                 hildonize_window = _null_hildonize_window
95
96
97 def _fremantle_hildonize_menu(window, gtkMenu):
98         appMenu = hildon.AppMenu()
99         window.set_app_menu(appMenu)
100         gtkMenu.get_parent().remove(gtkMenu)
101         return appMenu
102
103
104 def _hildon_hildonize_menu(window, gtkMenu):
105         hildonMenu = gtk.Menu()
106         for child in gtkMenu.get_children():
107                 child.reparent(hildonMenu)
108         window.set_menu(hildonMenu)
109         gtkMenu.destroy()
110         return hildonMenu
111
112
113 def _null_hildonize_menu(window, gtkMenu):
114         return gtkMenu
115
116
117 try:
118         hildon.AppMenu
119         GTK_MENU_USED = False
120         IS_FREMANTLE_SUPPORTED = True
121         hildonize_menu = _fremantle_hildonize_menu
122 except AttributeError:
123         GTK_MENU_USED = True
124         IS_FREMANTLE_SUPPORTED = False
125         if IS_HILDON_SUPPORTED:
126                 hildonize_menu = _hildon_hildonize_menu
127         else:
128                 hildonize_menu = _null_hildonize_menu
129
130
131 def _hildon_set_button_auto_selectable(button):
132         button.set_theme_size(hildon.HILDON_SIZE_AUTO_HEIGHT)
133
134
135 def _null_set_button_auto_selectable(button):
136         pass
137
138
139 try:
140         hildon.HILDON_SIZE_AUTO_HEIGHT
141         gtk.Button.set_theme_size
142         set_button_auto_selectable = _hildon_set_button_auto_selectable
143 except AttributeError:
144         set_button_auto_selectable = _null_set_button_auto_selectable
145
146
147 def _hildon_set_button_finger_selectable(button):
148         button.set_theme_size(hildon.HILDON_SIZE_FINGER_HEIGHT)
149
150
151 def _null_set_button_finger_selectable(button):
152         pass
153
154
155 try:
156         hildon.HILDON_SIZE_FINGER_HEIGHT
157         gtk.Button.set_theme_size
158         set_button_finger_selectable = _hildon_set_button_finger_selectable
159 except AttributeError:
160         set_button_finger_selectable = _null_set_button_finger_selectable
161
162
163 def _hildon_set_button_thumb_selectable(button):
164         button.set_theme_size(hildon.HILDON_SIZE_THUMB_HEIGHT)
165
166
167 def _null_set_button_thumb_selectable(button):
168         pass
169
170
171 try:
172         hildon.HILDON_SIZE_THUMB_HEIGHT
173         gtk.Button.set_theme_size
174         set_button_thumb_selectable = _hildon_set_button_thumb_selectable
175 except AttributeError:
176         set_button_thumb_selectable = _null_set_button_thumb_selectable
177
178
179 def _hildon_set_cell_thumb_selectable(renderer):
180         renderer.set_property("scale", 1.5)
181
182
183 def _null_set_cell_thumb_selectable(renderer):
184         pass
185
186
187 if IS_HILDON_SUPPORTED:
188         set_cell_thumb_selectable = _hildon_set_cell_thumb_selectable
189 else:
190         set_cell_thumb_selectable = _null_set_cell_thumb_selectable
191
192
193 def _hildon_set_pix_cell_thumb_selectable(renderer):
194         renderer.set_property("stock-size", 48)
195
196
197 def _null_set_pix_cell_thumb_selectable(renderer):
198         pass
199
200
201 if IS_HILDON_SUPPORTED:
202         set_pix_cell_thumb_selectable = _hildon_set_pix_cell_thumb_selectable
203 else:
204         set_pix_cell_thumb_selectable = _null_set_pix_cell_thumb_selectable
205
206
207 def _fremantle_show_information_banner(parent, message):
208         hildon.hildon_banner_show_information(parent, "", message)
209
210
211 def _hildon_show_information_banner(parent, message):
212         hildon.hildon_banner_show_information(parent, None, message)
213
214
215 def _null_show_information_banner(parent, message):
216         pass
217
218
219 if IS_FREMANTLE_SUPPORTED:
220         show_information_banner = _fremantle_show_information_banner
221 else:
222         try:
223                 hildon.hildon_banner_show_information
224                 show_information_banner = _hildon_show_information_banner
225         except AttributeError:
226                 show_information_banner = _null_show_information_banner
227
228
229 def _fremantle_show_busy_banner_start(parent, message):
230         hildon.hildon_gtk_window_set_progress_indicator(parent, True)
231         return parent
232
233
234 def _fremantle_show_busy_banner_end(banner):
235         hildon.hildon_gtk_window_set_progress_indicator(banner, False)
236
237
238 def _hildon_show_busy_banner_start(parent, message):
239         return hildon.hildon_banner_show_animation(parent, None, message)
240
241
242 def _hildon_show_busy_banner_end(banner):
243         banner.destroy()
244
245
246 def _null_show_busy_banner_start(parent, message):
247         return None
248
249
250 def _null_show_busy_banner_end(banner):
251         assert banner is None
252
253
254 try:
255         hildon.hildon_gtk_window_set_progress_indicator
256         show_busy_banner_start = _fremantle_show_busy_banner_start
257         show_busy_banner_end = _fremantle_show_busy_banner_end
258 except AttributeError:
259         try:
260                 hildon.hildon_banner_show_animation
261                 show_busy_banner_start = _hildon_show_busy_banner_start
262                 show_busy_banner_end = _hildon_show_busy_banner_end
263         except AttributeError:
264                 show_busy_banner_start = _null_show_busy_banner_start
265                 show_busy_banner_end = _null_show_busy_banner_end
266
267
268 def _hildon_hildonize_text_entry(textEntry):
269         textEntry.set_property('hildon-input-mode', 7)
270
271
272 def _null_hildonize_text_entry(textEntry):
273         pass
274
275
276 if IS_HILDON_SUPPORTED:
277         hildonize_text_entry = _hildon_hildonize_text_entry
278 else:
279         hildonize_text_entry = _null_hildonize_text_entry
280
281
282 def _hildon_window_to_portrait(window):
283         # gtk documentation is unclear whether this does a "=" or a "|="
284         flags = hildon.PORTRAIT_MODE_SUPPORT | hildon.PORTRAIT_MODE_REQUEST
285         hildon.hildon_gtk_window_set_portrait_flags(window, flags)
286
287
288 def _hildon_window_to_landscape(window):
289         # gtk documentation is unclear whether this does a "=" or a "&= ~"
290         flags = hildon.PORTRAIT_MODE_SUPPORT
291         hildon.hildon_gtk_window_set_portrait_flags(window, flags)
292
293
294 def _null_window_to_portrait(window):
295         pass
296
297
298 def _null_window_to_landscape(window):
299         pass
300
301
302 try:
303         hildon.PORTRAIT_MODE_SUPPORT
304         hildon.PORTRAIT_MODE_REQUEST
305         hildon.hildon_gtk_window_set_portrait_flags
306
307         window_to_portrait = _hildon_window_to_portrait
308         window_to_landscape = _hildon_window_to_landscape
309 except AttributeError:
310         window_to_portrait = _null_window_to_portrait
311         window_to_landscape = _null_window_to_landscape
312
313
314 def get_device_orientation():
315         bus = dbus.SystemBus()
316         try:
317                 rawMceRequest = bus.get_object("com.nokia.mce", "/com/nokia/mce/request")
318                 mceRequest = dbus.Interface(rawMceRequest, dbus_interface="com.nokia.mce.request")
319                 orientation, standState, faceState, xAxis, yAxis, zAxis = mceRequest.get_device_orientation()
320         except dbus.exception.DBusException:
321                 # catching for documentation purposes that when a system doesn't
322                 # support this, this is what to expect
323                 raise
324
325         if orientation == "":
326                 return gtk.ORIENTATION_HORIZONTAL
327         elif orientation == "":
328                 return gtk.ORIENTATION_VERTICAL
329         else:
330                 raise RuntimeError("Unknown orientation: %s" % orientation)
331
332
333 def _hildon_hildonize_password_entry(textEntry):
334         textEntry.set_property('hildon-input-mode', 7 | (1 << 29))
335
336
337 def _null_hildonize_password_entry(textEntry):
338         pass
339
340
341 if IS_HILDON_SUPPORTED:
342         hildonize_password_entry = _hildon_hildonize_password_entry
343 else:
344         hildonize_password_entry = _null_hildonize_password_entry
345
346
347 def _hildon_hildonize_combo_entry(comboEntry):
348         comboEntry.set_property('hildon-input-mode', 1 << 4)
349
350
351 def _null_hildonize_combo_entry(textEntry):
352         pass
353
354
355 if IS_HILDON_SUPPORTED:
356         hildonize_combo_entry = _hildon_hildonize_combo_entry
357 else:
358         hildonize_combo_entry = _null_hildonize_combo_entry
359
360
361 def _fremantle_hildonize_scrollwindow(scrolledWindow):
362         pannableWindow = hildon.PannableArea()
363
364         child = scrolledWindow.get_child()
365         scrolledWindow.remove(child)
366         pannableWindow.add(child)
367
368         parent = scrolledWindow.get_parent()
369         if parent is not None:
370                 parent.remove(scrolledWindow)
371                 parent.add(pannableWindow)
372
373         return pannableWindow
374
375
376 def _hildon_hildonize_scrollwindow(scrolledWindow):
377         hildon.hildon_helper_set_thumb_scrollbar(scrolledWindow, True)
378         return scrolledWindow
379
380
381 def _null_hildonize_scrollwindow(scrolledWindow):
382         return scrolledWindow
383
384
385 try:
386         hildon.PannableArea
387         hildonize_scrollwindow = _fremantle_hildonize_scrollwindow
388         hildonize_scrollwindow_with_viewport = _hildon_hildonize_scrollwindow
389 except AttributeError:
390         try:
391                 hildon.hildon_helper_set_thumb_scrollbar
392                 hildonize_scrollwindow = _hildon_hildonize_scrollwindow
393                 hildonize_scrollwindow_with_viewport = _hildon_hildonize_scrollwindow
394         except AttributeError:
395                 hildonize_scrollwindow = _null_hildonize_scrollwindow
396                 hildonize_scrollwindow_with_viewport = _null_hildonize_scrollwindow
397
398
399 def _hildon_request_number(parent, title, range, default):
400         spinner = hildon.NumberEditor(*range)
401         spinner.set_value(default)
402
403         dialog = gtk.Dialog(
404                 title,
405                 parent,
406                 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
407                 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
408         )
409         dialog.set_default_response(gtk.RESPONSE_CANCEL)
410         dialog.get_child().add(spinner)
411
412         try:
413                 dialog.show_all()
414                 response = dialog.run()
415
416                 if response == gtk.RESPONSE_OK:
417                         return spinner.get_value()
418                 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
419                         raise RuntimeError("User cancelled request")
420                 else:
421                         raise RuntimeError("Unrecognized response %r", response)
422         finally:
423                 dialog.hide()
424                 dialog.destroy()
425
426
427 def _null_request_number(parent, title, range, default):
428         adjustment = gtk.Adjustment(default, range[0], range[1], 1, 5, 0)
429         spinner = gtk.SpinButton(adjustment, 0, 0)
430         spinner.set_wrap(False)
431
432         dialog = gtk.Dialog(
433                 title,
434                 parent,
435                 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
436                 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
437         )
438         dialog.set_default_response(gtk.RESPONSE_CANCEL)
439         dialog.get_child().add(spinner)
440
441         try:
442                 dialog.show_all()
443                 response = dialog.run()
444
445                 if response == gtk.RESPONSE_OK:
446                         return spinner.get_value_as_int()
447                 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
448                         raise RuntimeError("User cancelled request")
449                 else:
450                         raise RuntimeError("Unrecognized response %r", response)
451         finally:
452                 dialog.hide()
453                 dialog.destroy()
454
455
456 try:
457         hildon.NumberEditor # TODO deprecated in fremantle
458         request_number = _hildon_request_number
459 except AttributeError:
460         request_number = _null_request_number
461
462
463 def _hildon_touch_selector(parent, title, items, defaultIndex):
464         model = gtk.ListStore(gobject.TYPE_STRING)
465         for item in items:
466                 model.append((item, ))
467
468         selector = hildon.TouchSelector()
469         selector.append_text_column(model, True)
470         selector.set_column_selection_mode(hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE)
471         selector.set_active(0, defaultIndex)
472
473         dialog = hildon.PickerDialog(parent)
474         dialog.set_selector(selector)
475
476         try:
477                 dialog.show_all()
478                 response = dialog.run()
479
480                 if response == gtk.RESPONSE_OK:
481                         return selector.get_active(0)
482                 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
483                         raise RuntimeError("User cancelled request")
484                 else:
485                         raise RuntimeError("Unrecognized response %r", response)
486         finally:
487                 dialog.hide()
488                 dialog.destroy()
489
490
491 def _on_null_touch_selector_activated(treeView, path, column, dialog, pathData):
492         dialog.response(gtk.RESPONSE_OK)
493         pathData[0] = path
494
495
496 def _null_touch_selector(parent, title, items, defaultIndex = -1):
497         parentSize = parent.get_size()
498
499         model = gtk.ListStore(gobject.TYPE_STRING)
500         for item in items:
501                 model.append((item, ))
502
503         cell = gtk.CellRendererText()
504         set_cell_thumb_selectable(cell)
505         column = gtk.TreeViewColumn(title)
506         column.pack_start(cell, expand=True)
507         column.add_attribute(cell, "text", 0)
508
509         treeView = gtk.TreeView()
510         treeView.set_model(model)
511         treeView.append_column(column)
512         selection = treeView.get_selection()
513         selection.set_mode(gtk.SELECTION_SINGLE)
514         if 0 < defaultIndex:
515                 selection.select_path((defaultIndex, ))
516
517         scrolledWin = gtk.ScrolledWindow()
518         scrolledWin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
519         scrolledWin.add(treeView)
520
521         dialog = gtk.Dialog(
522                 title,
523                 parent,
524                 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
525                 (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
526         )
527         dialog.set_default_response(gtk.RESPONSE_CANCEL)
528         dialog.get_child().add(scrolledWin)
529         dialog.resize(parentSize[0], max(parentSize[1]-100, 100))
530
531         scrolledWin = hildonize_scrollwindow(scrolledWin)
532         pathData = [None]
533         treeView.connect("row-activated", _on_null_touch_selector_activated, dialog, pathData)
534
535         try:
536                 dialog.show_all()
537                 response = dialog.run()
538
539                 if response == gtk.RESPONSE_OK:
540                         if pathData[0] is None:
541                                 raise RuntimeError("No selection made")
542                         return pathData[0][0]
543                 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
544                         raise RuntimeError("User cancelled request")
545                 else:
546                         raise RuntimeError("Unrecognized response %r", response)
547         finally:
548                 dialog.hide()
549                 dialog.destroy()
550
551
552 try:
553         hildon.PickerDialog
554         hildon.TouchSelector
555         touch_selector = _hildon_touch_selector
556 except AttributeError:
557         touch_selector = _null_touch_selector
558
559
560 def _hildon_touch_selector_entry(parent, title, items, defaultItem):
561         # Got a segfault when using append_text_column with TouchSelectorEntry, so using this way
562         try:
563                 selector = hildon.TouchSelectorEntry(text=True)
564         except TypeError:
565                 selector = hildon.hildon_touch_selector_entry_new_text()
566         defaultIndex = -1
567         for i, item in enumerate(items):
568                 selector.append_text(item)
569                 if item == defaultItem:
570                         defaultIndex = i
571
572         dialog = hildon.PickerDialog(parent)
573         dialog.set_selector(selector)
574
575         if 0 < defaultIndex:
576                 selector.set_active(0, defaultIndex)
577         else:
578                 selector.get_entry().set_text(defaultItem)
579
580         try:
581                 dialog.show_all()
582                 response = dialog.run()
583         finally:
584                 dialog.hide()
585
586         if response == gtk.RESPONSE_OK:
587                 return selector.get_entry().get_text()
588         elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
589                 raise RuntimeError("User cancelled request")
590         else:
591                 raise RuntimeError("Unrecognized response %r", response)
592
593
594 def _on_null_touch_selector_entry_entry_changed(entry, result, selection, defaultIndex):
595         custom = entry.get_text().strip()
596         if custom:
597                 result[0] = custom
598                 selection.unselect_all()
599         else:
600                 result[0] = None
601                 selection.select_path((defaultIndex, ))
602
603
604 def _on_null_touch_selector_entry_entry_activated(customEntry, dialog, result):
605         dialog.response(gtk.RESPONSE_OK)
606         result[0] = customEntry.get_text()
607
608
609 def _on_null_touch_selector_entry_tree_activated(treeView, path, column, dialog, result):
610         dialog.response(gtk.RESPONSE_OK)
611         model = treeView.get_model()
612         itr = model.get_iter(path)
613         if itr is not None:
614                 result[0] = model.get_value(itr, 0)
615
616
617 def _null_touch_selector_entry(parent, title, items, defaultItem):
618         parentSize = parent.get_size()
619
620         model = gtk.ListStore(gobject.TYPE_STRING)
621         defaultIndex = -1
622         for i, item in enumerate(items):
623                 model.append((item, ))
624                 if item == defaultItem:
625                         defaultIndex = i
626
627         cell = gtk.CellRendererText()
628         set_cell_thumb_selectable(cell)
629         column = gtk.TreeViewColumn(title)
630         column.pack_start(cell, expand=True)
631         column.add_attribute(cell, "text", 0)
632
633         treeView = gtk.TreeView()
634         treeView.set_model(model)
635         treeView.append_column(column)
636         selection = treeView.get_selection()
637         selection.set_mode(gtk.SELECTION_SINGLE)
638
639         scrolledWin = gtk.ScrolledWindow()
640         scrolledWin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
641         scrolledWin.add(treeView)
642
643         customEntry = gtk.Entry()
644
645         layout = gtk.VBox()
646         layout.pack_start(customEntry, expand=False)
647         layout.pack_start(scrolledWin)
648
649         dialog = gtk.Dialog(
650                 title,
651                 parent,
652                 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
653                 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
654         )
655         dialog.set_default_response(gtk.RESPONSE_CANCEL)
656         dialog.get_child().add(layout)
657         dialog.resize(parentSize[0], max(parentSize[1]-100, 100))
658
659         scrolledWin = hildonize_scrollwindow(scrolledWin)
660
661         result = [None]
662         if 0 < defaultIndex:
663                 selection.select_path((defaultIndex, ))
664                 result[0] = defaultItem
665         else:
666                 customEntry.set_text(defaultItem)
667
668         customEntry.connect("activate", _on_null_touch_selector_entry_entry_activated, dialog, result)
669         customEntry.connect("changed", _on_null_touch_selector_entry_entry_changed, result, selection, defaultIndex)
670         treeView.connect("row-activated", _on_null_touch_selector_entry_tree_activated, dialog, result)
671
672         try:
673                 dialog.show_all()
674                 response = dialog.run()
675
676                 if response == gtk.RESPONSE_OK:
677                         _, itr = selection.get_selected()
678                         if itr is not None:
679                                 return model.get_value(itr, 0)
680                         else:
681                                 enteredText = customEntry.get_text().strip()
682                                 if enteredText:
683                                         return enteredText
684                                 elif result[0] is not None:
685                                         return result[0]
686                                 else:
687                                         raise RuntimeError("No selection made")
688                 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
689                         raise RuntimeError("User cancelled request")
690                 else:
691                         raise RuntimeError("Unrecognized response %r", response)
692         finally:
693                 dialog.hide()
694                 dialog.destroy()
695
696
697 try:
698         hildon.PickerDialog
699         hildon.TouchSelectorEntry
700         touch_selector_entry = _hildon_touch_selector_entry
701 except AttributeError:
702         touch_selector_entry = _null_touch_selector_entry
703
704
705 if __name__ == "__main__":
706         app = get_app_class()()
707
708         label = gtk.Label("Hello World from a Label!")
709
710         win = gtk.Window()
711         win.add(label)
712         win = hildonize_window(app, win)
713         if False and IS_FREMANTLE_SUPPORTED:
714                 appMenu = hildon.AppMenu()
715                 for i in xrange(5):
716                         b = gtk.Button(str(i))
717                         appMenu.append(b)
718                 win.set_app_menu(appMenu)
719                 win.show_all()
720                 appMenu.show_all()
721                 gtk.main()
722         elif False:
723                 print touch_selector(win, "Test", ["A", "B", "C", "D"], 2)
724         elif False:
725                 print touch_selector_entry(win, "Test", ["A", "B", "C", "D"], "C")
726                 print touch_selector_entry(win, "Test", ["A", "B", "C", "D"], "Blah")
727         elif False:
728                 import pprint
729                 name, value = "", ""
730                 goodLocals = [
731                         (name, value) for (name, value) in locals().iteritems()
732                         if not name.startswith("_")
733                 ]
734                 pprint.pprint(goodLocals)
735         elif False:
736                 import time
737                 show_information_banner(win, "Hello World")
738                 time.sleep(5)
739         elif False:
740                 import time
741                 banner = show_busy_banner_start(win, "Hello World")
742                 time.sleep(5)
743                 show_busy_banner_end(banner)