5 @bug Buttons are too small
14 class _NullHildonModule(object):
19 import hildon as _hildon
20 hildon = _hildon # Dumb but gets around pyflakiness
21 except (ImportError, OSError):
22 hildon = _NullHildonModule
25 IS_HILDON_SUPPORTED = hildon is not _NullHildonModule
28 class _NullHildonProgram(object):
30 def add_window(self, window):
34 def _hildon_get_app_class():
38 def _null_get_app_class():
39 return _NullHildonProgram
44 get_app_class = _hildon_get_app_class
45 except AttributeError:
46 get_app_class = _null_get_app_class
49 def _hildon_set_application_title(window, title):
53 def _null_set_application_title(window, title):
54 window.set_title(title)
57 if IS_HILDON_SUPPORTED:
58 set_application_title = _hildon_set_application_title
60 set_application_title = _null_set_application_title
63 def _fremantle_hildonize_window(app, window):
65 newWindow = hildon.StackableWindow()
66 oldWindow.get_child().reparent(newWindow)
67 app.add_window(newWindow)
71 def _hildon_hildonize_window(app, window):
73 newWindow = hildon.Window()
74 oldWindow.get_child().reparent(newWindow)
75 app.add_window(newWindow)
79 def _null_hildonize_window(app, window):
84 hildon.StackableWindow
85 hildonize_window = _fremantle_hildonize_window
86 except AttributeError:
89 hildonize_window = _hildon_hildonize_window
90 except AttributeError:
91 hildonize_window = _null_hildonize_window
94 def _fremantle_hildonize_menu(window, gtkMenu, buttons):
95 appMenu = hildon.AppMenu()
96 for button in buttons:
97 appMenu.append(button)
98 window.set_app_menu(appMenu)
99 gtkMenu.get_parent().remove(gtkMenu)
103 def _hildon_hildonize_menu(window, gtkMenu, ignoredButtons):
104 hildonMenu = gtk.Menu()
105 for child in gtkMenu.get_children():
106 child.reparent(hildonMenu)
107 window.set_menu(hildonMenu)
112 def _null_hildonize_menu(window, gtkMenu, ignoredButtons):
118 GTK_MENU_USED = False
119 IS_FREMANTLE_SUPPORTED = True
120 hildonize_menu = _fremantle_hildonize_menu
121 except AttributeError:
123 IS_FREMANTLE_SUPPORTED = False
124 if IS_HILDON_SUPPORTED:
125 hildonize_menu = _hildon_hildonize_menu
127 hildonize_menu = _null_hildonize_menu
130 def _hildon_set_button_auto_selectable(button):
131 button.set_theme_size(hildon.HILDON_SIZE_AUTO_HEIGHT)
134 def _null_set_button_auto_selectable(button):
139 hildon.HILDON_SIZE_AUTO_HEIGHT
140 gtk.Button.set_theme_size
141 set_button_auto_selectable = _hildon_set_button_auto_selectable
142 except AttributeError:
143 set_button_auto_selectable = _null_set_button_auto_selectable
146 def _hildon_set_button_finger_selectable(button):
147 button.set_theme_size(hildon.HILDON_SIZE_FINGER_HEIGHT)
150 def _null_set_button_finger_selectable(button):
155 hildon.HILDON_SIZE_FINGER_HEIGHT
156 gtk.Button.set_theme_size
157 set_button_finger_selectable = _hildon_set_button_finger_selectable
158 except AttributeError:
159 set_button_finger_selectable = _null_set_button_finger_selectable
162 def _hildon_set_button_thumb_selectable(button):
163 button.set_theme_size(hildon.HILDON_SIZE_THUMB_HEIGHT)
166 def _null_set_button_thumb_selectable(button):
171 hildon.HILDON_SIZE_THUMB_HEIGHT
172 gtk.Button.set_theme_size
173 set_button_thumb_selectable = _hildon_set_button_thumb_selectable
174 except AttributeError:
175 set_button_thumb_selectable = _null_set_button_thumb_selectable
178 def _hildon_set_cell_thumb_selectable(renderer):
179 renderer.set_property("scale", 1.5)
182 def _null_set_cell_thumb_selectable(renderer):
186 if IS_HILDON_SUPPORTED:
187 set_cell_thumb_selectable = _hildon_set_cell_thumb_selectable
189 set_cell_thumb_selectable = _null_set_cell_thumb_selectable
192 def _fremantle_show_information_banner(parent, message):
193 hildon.hildon_banner_show_information(parent, "", message)
196 def _hildon_show_information_banner(parent, message):
197 hildon.hildon_banner_show_information(parent, None, message)
200 def _null_show_information_banner(parent, message):
204 if IS_FREMANTLE_SUPPORTED:
205 show_information_banner = _fremantle_show_information_banner
208 hildon.hildon_banner_show_information
209 show_information_banner = _hildon_show_information_banner
210 except AttributeError:
211 show_information_banner = _null_show_information_banner
214 def _fremantle_show_busy_banner_start(parent, message):
215 hildon.hildon_gtk_window_set_progress_indicator(parent, True)
219 def _fremantle_show_busy_banner_end(banner):
220 hildon.hildon_gtk_window_set_progress_indicator(banner, False)
223 def _hildon_show_busy_banner_start(parent, message):
224 return hildon.hildon_banner_show_animation(parent, None, message)
227 def _hildon_show_busy_banner_end(banner):
231 def _null_show_busy_banner_start(parent, message):
235 def _null_show_busy_banner_end(banner):
236 assert banner is None
240 hildon.hildon_gtk_window_set_progress_indicator
241 show_busy_banner_start = _fremantle_show_busy_banner_start
242 show_busy_banner_end = _fremantle_show_busy_banner_end
243 except AttributeError:
245 hildon.hildon_banner_show_animation
246 show_busy_banner_start = _hildon_show_busy_banner_start
247 show_busy_banner_end = _hildon_show_busy_banner_end
248 except AttributeError:
249 show_busy_banner_start = _null_show_busy_banner_start
250 show_busy_banner_end = _null_show_busy_banner_end
253 def _hildon_hildonize_text_entry(textEntry):
254 textEntry.set_property('hildon-input-mode', 7)
257 def _null_hildonize_text_entry(textEntry):
261 if IS_HILDON_SUPPORTED:
262 hildonize_text_entry = _hildon_hildonize_text_entry
264 hildonize_text_entry = _null_hildonize_text_entry
267 def _hildon_mark_window_rotatable(window):
268 # gtk documentation is unclear whether this does a "=" or a "|="
269 window.set_flags(hildon.HILDON_PORTRAIT_MODE_SUPPORT)
272 def _null_mark_window_rotatable(window):
277 hildon.HILDON_PORTRAIT_MODE_SUPPORT
278 mark_window_rotatable = _hildon_mark_window_rotatable
279 except AttributeError:
280 mark_window_rotatable = _null_mark_window_rotatable
283 def _hildon_window_to_portrait(window):
284 # gtk documentation is unclear whether this does a "=" or a "|="
285 window.set_flags(hildon.HILDON_PORTRAIT_MODE_SUPPORT)
288 def _hildon_window_to_landscape(window):
289 # gtk documentation is unclear whether this does a "=" or a "&= ~"
290 window.unset_flags(hildon.HILDON_PORTRAIT_MODE_REQUEST)
293 def _null_window_to_portrait(window):
297 def _null_window_to_landscape(window):
302 hildon.HILDON_PORTRAIT_MODE_SUPPORT
303 hildon.HILDON_PORTRAIT_MODE_REQUEST
305 window_to_portrait = _hildon_window_to_portrait
306 window_to_landscape = _hildon_window_to_landscape
307 except AttributeError:
308 window_to_portrait = _null_window_to_portrait
309 window_to_landscape = _null_window_to_landscape
312 def get_device_orientation():
313 bus = dbus.SystemBus()
315 rawMceRequest = bus.get_object("com.nokia.mce", "/com/nokia/mce/request")
316 mceRequest = dbus.Interface(rawMceRequest, dbus_interface="com.nokia.mce.request")
317 orientation, standState, faceState, xAxis, yAxis, zAxis = mceRequest.get_device_orientation()
318 except dbus.exception.DBusException:
319 # catching for documentation purposes that when a system doesn't
320 # support this, this is what to expect
323 if orientation == "":
324 return gtk.ORIENTATION_HORIZONTAL
325 elif orientation == "":
326 return gtk.ORIENTATION_VERTICAL
328 raise RuntimeError("Unknown orientation: %s" % orientation)
331 def _hildon_hildonize_password_entry(textEntry):
332 textEntry.set_property('hildon-input-mode', 7 | (1 << 29))
335 def _null_hildonize_password_entry(textEntry):
339 if IS_HILDON_SUPPORTED:
340 hildonize_password_entry = _hildon_hildonize_password_entry
342 hildonize_password_entry = _null_hildonize_password_entry
345 def _hildon_hildonize_combo_entry(comboEntry):
346 comboEntry.set_property('hildon-input-mode', 1 << 4)
349 def _null_hildonize_combo_entry(textEntry):
353 if IS_HILDON_SUPPORTED:
354 hildonize_combo_entry = _hildon_hildonize_combo_entry
356 hildonize_combo_entry = _null_hildonize_combo_entry
359 def _fremantle_hildonize_scrollwindow(scrolledWindow):
360 pannableWindow = hildon.PannableArea()
362 child = scrolledWindow.get_child()
363 scrolledWindow.remove(child)
364 pannableWindow.add(child)
366 parent = scrolledWindow.get_parent()
367 parent.remove(scrolledWindow)
368 parent.add(pannableWindow)
370 return pannableWindow
373 def _hildon_hildonize_scrollwindow(scrolledWindow):
374 hildon.hildon_helper_set_thumb_scrollbar(scrolledWindow, True)
375 return scrolledWindow
378 def _null_hildonize_scrollwindow(scrolledWindow):
379 return scrolledWindow
384 hildonize_scrollwindow = _fremantle_hildonize_scrollwindow
385 hildonize_scrollwindow_with_viewport = _hildon_hildonize_scrollwindow
386 except AttributeError:
388 hildon.hildon_helper_set_thumb_scrollbar
389 hildonize_scrollwindow = _hildon_hildonize_scrollwindow
390 hildonize_scrollwindow_with_viewport = _hildon_hildonize_scrollwindow
391 except AttributeError:
392 hildonize_scrollwindow = _null_hildonize_scrollwindow
393 hildonize_scrollwindow_with_viewport = _null_hildonize_scrollwindow
396 def _hildon_request_number(parent, title, range, default):
397 spinner = hildon.NumberEditor(*range)
398 spinner.set_value(default)
403 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
404 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
406 dialog.set_default_response(gtk.RESPONSE_CANCEL)
407 dialog.get_child().add(spinner)
411 response = dialog.run()
413 if response == gtk.RESPONSE_OK:
414 return spinner.get_value()
415 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
416 raise RuntimeError("User cancelled request")
418 raise RuntimeError("Unrecognized response %r", response)
424 def _null_request_number(parent, title, range, default):
425 adjustment = gtk.Adjustment(default, range[0], range[1], 1, 5, 0)
426 spinner = gtk.SpinButton(adjustment, 0, 0)
427 spinner.set_wrap(False)
432 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
433 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
435 dialog.set_default_response(gtk.RESPONSE_CANCEL)
436 dialog.get_child().add(spinner)
440 response = dialog.run()
442 if response == gtk.RESPONSE_OK:
443 return spinner.get_value_as_int()
444 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
445 raise RuntimeError("User cancelled request")
447 raise RuntimeError("Unrecognized response %r", response)
454 hildon.NumberEditor # TODO deprecated in fremantle
455 request_number = _hildon_request_number
456 except AttributeError:
457 request_number = _null_request_number
460 def _hildon_touch_selector(parent, title, items, defaultIndex):
461 model = gtk.ListStore(gobject.TYPE_STRING)
463 model.append((item, ))
465 selector = hildon.TouchSelector()
466 selector.append_text_column(model, True)
467 selector.set_column_selection_mode(hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE)
468 selector.set_active(0, defaultIndex)
470 dialog = hildon.PickerDialog(parent)
471 dialog.set_selector(selector)
475 response = dialog.run()
477 if response == gtk.RESPONSE_OK:
478 return selector.get_active(0)
479 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
480 raise RuntimeError("User cancelled request")
482 raise RuntimeError("Unrecognized response %r", response)
488 def _on_null_touch_selector_activated(treeView, path, column, dialog, pathData):
489 dialog.response(gtk.RESPONSE_OK)
493 def _null_touch_selector(parent, title, items, defaultIndex = -1):
494 parentSize = parent.get_size()
496 model = gtk.ListStore(gobject.TYPE_STRING)
498 model.append((item, ))
500 cell = gtk.CellRendererText()
501 set_cell_thumb_selectable(cell)
502 column = gtk.TreeViewColumn(title)
503 column.pack_start(cell, expand=True)
504 column.add_attribute(cell, "text", 0)
506 treeView = gtk.TreeView()
507 treeView.set_model(model)
508 treeView.append_column(column)
509 selection = treeView.get_selection()
510 selection.set_mode(gtk.SELECTION_SINGLE)
512 selection.select_path((defaultIndex, ))
514 scrolledWin = gtk.ScrolledWindow()
515 scrolledWin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
516 scrolledWin.add(treeView)
521 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
522 (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
524 dialog.set_default_response(gtk.RESPONSE_CANCEL)
525 dialog.get_child().add(scrolledWin)
526 dialog.resize(parentSize[0], max(parentSize[1]-100, 100))
528 scrolledWin = hildonize_scrollwindow(scrolledWin)
530 treeView.connect("row-activated", _on_null_touch_selector_activated, dialog, pathData)
534 response = dialog.run()
536 if response == gtk.RESPONSE_OK:
537 if pathData[0] is None:
538 raise RuntimeError("No selection made")
539 return pathData[0][0]
540 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
541 raise RuntimeError("User cancelled request")
543 raise RuntimeError("Unrecognized response %r", response)
552 touch_selector = _hildon_touch_selector
553 except AttributeError:
554 touch_selector = _null_touch_selector
557 def _hildon_touch_selector_entry(parent, title, items, defaultItem):
558 # Got a segfault when using append_text_column with TouchSelectorEntry, so using this way
560 selector = hildon.TouchSelectorEntry(text=True)
562 selector = hildon.hildon_touch_selector_entry_new_text()
564 for i, item in enumerate(items):
565 selector.append_text(item)
566 if item == defaultItem:
569 dialog = hildon.PickerDialog(parent)
570 dialog.set_selector(selector)
573 selector.set_active(0, defaultIndex)
575 selector.get_entry().set_text(defaultItem)
579 response = dialog.run()
583 if response == gtk.RESPONSE_OK:
584 return selector.get_entry().get_text()
585 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
586 raise RuntimeError("User cancelled request")
588 raise RuntimeError("Unrecognized response %r", response)
591 def _on_null_touch_selector_entry_entry_changed(entry, result, selection, defaultIndex):
592 custom = entry.get_text().strip()
595 selection.unselect_all()
598 selection.select_path((defaultIndex, ))
601 def _on_null_touch_selector_entry_entry_activated(customEntry, dialog, result):
602 dialog.response(gtk.RESPONSE_OK)
603 result[0] = customEntry.get_text()
606 def _on_null_touch_selector_entry_tree_activated(treeView, path, column, dialog, result):
607 dialog.response(gtk.RESPONSE_OK)
608 model = treeView.get_model()
609 itr = model.get_iter(path)
611 result[0] = model.get_value(itr, 0)
614 def _null_touch_selector_entry(parent, title, items, defaultItem):
615 parentSize = parent.get_size()
617 model = gtk.ListStore(gobject.TYPE_STRING)
619 for i, item in enumerate(items):
620 model.append((item, ))
621 if item == defaultItem:
624 cell = gtk.CellRendererText()
625 set_cell_thumb_selectable(cell)
626 column = gtk.TreeViewColumn(title)
627 column.pack_start(cell, expand=True)
628 column.add_attribute(cell, "text", 0)
630 treeView = gtk.TreeView()
631 treeView.set_model(model)
632 treeView.append_column(column)
633 selection = treeView.get_selection()
634 selection.set_mode(gtk.SELECTION_SINGLE)
636 scrolledWin = gtk.ScrolledWindow()
637 scrolledWin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
638 scrolledWin.add(treeView)
640 customEntry = gtk.Entry()
643 layout.pack_start(customEntry, expand=False)
644 layout.pack_start(scrolledWin)
649 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
650 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
652 dialog.set_default_response(gtk.RESPONSE_CANCEL)
653 dialog.get_child().add(layout)
654 dialog.resize(parentSize[0], max(parentSize[1]-100, 100))
656 scrolledWin = hildonize_scrollwindow(scrolledWin)
660 selection.select_path((defaultIndex, ))
661 result[0] = defaultItem
663 customEntry.set_text(defaultItem)
665 customEntry.connect("activate", _on_null_touch_selector_entry_entry_activated, dialog, result)
666 customEntry.connect("changed", _on_null_touch_selector_entry_entry_changed, result, selection, defaultIndex)
667 treeView.connect("row-activated", _on_null_touch_selector_entry_tree_activated, dialog, result)
671 response = dialog.run()
673 if response == gtk.RESPONSE_OK:
674 _, itr = selection.get_selected()
676 return model.get_value(itr, 0)
678 enteredText = customEntry.get_text().strip()
681 elif result[0] is not None:
684 raise RuntimeError("No selection made")
685 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
686 raise RuntimeError("User cancelled request")
688 raise RuntimeError("Unrecognized response %r", response)
696 hildon.TouchSelectorEntry
697 touch_selector_entry = _hildon_touch_selector_entry
698 except AttributeError:
699 touch_selector_entry = _null_touch_selector_entry
702 if __name__ == "__main__":
703 app = get_app_class()()
705 label = gtk.Label("Hello World from a Label!")
709 win = hildonize_window(app, win)
711 print touch_selector(win, "Test", ["A", "B", "C", "D"], 2)
713 print touch_selector_entry(win, "Test", ["A", "B", "C", "D"], "C")
714 print touch_selector_entry(win, "Test", ["A", "B", "C", "D"], "Blah")
719 (name, value) for (name, value) in locals().iteritems()
720 if not name.startswith("_")
722 pprint.pprint(goodLocals)
725 show_information_banner(win, "Hello World")
729 banner = show_busy_banner_start(win, "Hello World")
731 show_busy_banner_end(banner)