9 class _NullHildonModule(object):
14 import hildon as _hildon
15 hildon = _hildon # Dumb but gets around pyflakiness
16 except (ImportError, OSError):
17 hildon = _NullHildonModule
20 IS_HILDON_SUPPORTED = hildon is not _NullHildonModule
23 class _NullHildonProgram(object):
25 def add_window(self, window):
29 def _hildon_get_app_class():
33 def _null_get_app_class():
34 return _NullHildonProgram
39 get_app_class = _hildon_get_app_class
40 except AttributeError:
41 get_app_class = _null_get_app_class
44 def _hildon_set_application_title(window, title):
48 def _null_set_application_title(window, title):
49 window.set_title(title)
52 if IS_HILDON_SUPPORTED:
53 set_application_title = _hildon_set_application_title
55 set_application_title = _null_set_application_title
58 def _fremantle_hildonize_window(app, window):
60 newWindow = hildon.StackableWindow()
61 oldWindow.get_child().reparent(newWindow)
62 app.add_window(newWindow)
66 def _hildon_hildonize_window(app, window):
68 newWindow = hildon.Window()
69 oldWindow.get_child().reparent(newWindow)
70 app.add_window(newWindow)
74 def _null_hildonize_window(app, window):
79 hildon.StackableWindow
80 hildonize_window = _fremantle_hildonize_window
81 except AttributeError:
84 hildonize_window = _hildon_hildonize_window
85 except AttributeError:
86 hildonize_window = _null_hildonize_window
89 def _fremantle_hildonize_menu(window, gtkMenu, buttons):
90 appMenu = hildon.AppMenu()
91 for button in buttons:
92 appMenu.append(button)
93 window.set_app_menu(appMenu)
94 gtkMenu.get_parent().remove(gtkMenu)
98 def _hildon_hildonize_menu(window, gtkMenu, ignoredButtons):
99 hildonMenu = gtk.Menu()
100 for child in gtkMenu.get_children():
101 child.reparent(hildonMenu)
102 window.set_menu(hildonMenu)
107 def _null_hildonize_menu(window, gtkMenu, ignoredButtons):
113 GTK_MENU_USED = False
114 hildonize_menu = _fremantle_hildonize_menu
115 except AttributeError:
117 if IS_HILDON_SUPPORTED:
118 hildonize_menu = _hildon_hildonize_menu
120 hildonize_menu = _null_hildonize_menu
123 def _hildon_set_cell_thumb_selectable(renderer):
124 renderer.set_property("scale", 1.5)
127 def _null_set_cell_thumb_selectable(renderer):
131 if IS_HILDON_SUPPORTED:
132 set_cell_thumb_selectable = _hildon_set_cell_thumb_selectable
134 set_cell_thumb_selectable = _null_set_cell_thumb_selectable
137 def _hildon_show_information_banner(parent, message):
138 hildon.hildon_banner_show_information(parent, "", message)
141 def _null_show_information_banner(parent, message):
146 hildon.hildon_banner_show_information
147 show_information_banner = _hildon_show_information_banner
148 except AttributeError:
149 show_information_banner = _null_show_information_banner
152 def _fremantle_show_busy_banner_start(parent, message):
153 hildon.hildon_gtk_window_set_progress_indicator(parent, True)
157 def _fremantle_show_busy_banner_end(parent):
158 hildon.hildon_gtk_window_set_progress_indicator(parent, False)
161 def _hildon_show_busy_banner_start(parent, message):
162 return hildon.hildon_banner_show_animation(parent, "", message)
165 def _hildon_show_busy_banner_end(banner):
169 def _null_show_busy_banner_start(parent, message):
173 def _null_show_busy_banner_end(banner):
178 hildon.hildon_gtk_window_set_progress_indicator
179 show_busy_banner_start = _fremantle_show_busy_banner_start
180 show_busy_banner_end = _fremantle_show_busy_banner_end
181 except AttributeError:
183 hildon.hildon_banner_show_animation
184 show_busy_banner_start = _hildon_show_busy_banner_start
185 show_busy_banner_end = _hildon_show_busy_banner_end
186 except AttributeError:
187 show_busy_banner_start = _null_show_busy_banner_start
188 show_busy_banner_end = _null_show_busy_banner_end
191 def _hildon_hildonize_text_entry(textEntry):
192 textEntry.set_property('hildon-input-mode', 7)
195 def _null_hildonize_text_entry(textEntry):
199 if IS_HILDON_SUPPORTED:
200 hildonize_text_entry = _hildon_hildonize_text_entry
202 hildonize_text_entry = _null_hildonize_text_entry
205 def _hildon_mark_window_rotatable(window):
206 # gtk documentation is unclear whether this does a "=" or a "|="
207 window.set_flags(hildon.HILDON_PORTRAIT_MODE_SUPPORT)
210 def _null_mark_window_rotatable(window):
215 hildon.HILDON_PORTRAIT_MODE_SUPPORT
216 mark_window_rotatable = _hildon_mark_window_rotatable
217 except AttributeError:
218 mark_window_rotatable = _null_mark_window_rotatable
221 def _hildon_window_to_portrait(window):
222 # gtk documentation is unclear whether this does a "=" or a "|="
223 window.set_flags(hildon.HILDON_PORTRAIT_MODE_SUPPORT)
226 def _hildon_window_to_landscape(window):
227 # gtk documentation is unclear whether this does a "=" or a "&= ~"
228 window.unset_flags(hildon.HILDON_PORTRAIT_MODE_REQUEST)
231 def _null_window_to_portrait(window):
235 def _null_window_to_landscape(window):
240 hildon.HILDON_PORTRAIT_MODE_SUPPORT
241 hildon.HILDON_PORTRAIT_MODE_REQUEST
243 window_to_portrait = _hildon_window_to_portrait
244 window_to_landscape = _hildon_window_to_landscape
245 except AttributeError:
246 window_to_portrait = _null_window_to_portrait
247 window_to_landscape = _null_window_to_landscape
250 def get_device_orientation():
251 bus = dbus.SystemBus()
253 rawMceRequest = bus.get_object("com.nokia.mce", "/com/nokia/mce/request")
254 mceRequest = dbus.Interface(rawMceRequest, dbus_interface="com.nokia.mce.request")
255 orientation, standState, faceState, xAxis, yAxis, zAxis = mceRequest.get_device_orientation()
256 except dbus.exception.DBusException:
257 # catching for documentation purposes that when a system doesn't
258 # support this, this is what to expect
261 if orientation == "":
262 return gtk.ORIENTATION_HORIZONTAL
263 elif orientation == "":
264 return gtk.ORIENTATION_VERTICAL
266 raise RuntimeError("Unknown orientation: %s" % orientation)
269 def _hildon_hildonize_password_entry(textEntry):
270 textEntry.set_property('hildon-input-mode', 7 | (1 << 29))
273 def _null_hildonize_password_entry(textEntry):
277 if IS_HILDON_SUPPORTED:
278 hildonize_password_entry = _hildon_hildonize_password_entry
280 hildonize_password_entry = _null_hildonize_password_entry
283 def _hildon_hildonize_combo_entry(comboEntry):
284 comboEntry.set_property('hildon-input-mode', 1 << 4)
287 def _null_hildonize_combo_entry(textEntry):
291 if IS_HILDON_SUPPORTED:
292 hildonize_combo_entry = _hildon_hildonize_combo_entry
294 hildonize_combo_entry = _null_hildonize_combo_entry
297 def _fremantle_hildonize_scrollwindow(scrolledWindow):
298 pannableWindow = hildon.PannableArea()
300 child = scrolledWindow.get_child()
301 scrolledWindow.remove(child)
302 pannableWindow.add(child)
304 parent = scrolledWindow.get_parent()
305 parent.remove(scrolledWindow)
306 parent.add(pannableWindow)
308 return pannableWindow
311 def _hildon_hildonize_scrollwindow(scrolledWindow):
312 hildon.hildon_helper_set_thumb_scrollbar(scrolledWindow, True)
313 return scrolledWindow
316 def _null_hildonize_scrollwindow(scrolledWindow):
317 return scrolledWindow
322 hildonize_scrollwindow = _fremantle_hildonize_scrollwindow
323 hildonize_scrollwindow_with_viewport = _hildon_hildonize_scrollwindow
324 except AttributeError:
326 hildon.hildon_helper_hildonize_scrollwindow
327 hildonize_scrollwindow = _hildon_hildonize_scrollwindow
328 hildonize_scrollwindow_with_viewport = _hildon_hildonize_scrollwindow
329 except AttributeError:
330 hildonize_scrollwindow = _null_hildonize_scrollwindow
331 hildonize_scrollwindow_with_viewport = _null_hildonize_scrollwindow
334 def _hildon_request_number(parent, title, range, default):
335 spinner = hildon.NumberEditor(*range)
336 spinner.set_value(default)
341 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
342 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
344 dialog.set_default_response(gtk.RESPONSE_CANCEL)
345 dialog.get_child().add(spinner)
349 response = dialog.run()
353 if response == gtk.RESPONSE_OK:
354 return spinner.get_value()
355 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
356 raise RuntimeError("User cancelled request")
358 raise RuntimeError("Unrecognized response %r", response)
361 def _null_request_number(parent, title, range, default):
362 adjustment = gtk.Adjustment(default, range[0], range[1], 1, 5, 0)
363 spinner = gtk.SpinButton(adjustment, 0, 0)
364 spinner.set_wrap(False)
369 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
370 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
372 dialog.set_default_response(gtk.RESPONSE_CANCEL)
373 dialog.get_child().add(spinner)
377 response = dialog.run()
381 if response == gtk.RESPONSE_OK:
382 return spinner.get_value_as_int()
383 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
384 raise RuntimeError("User cancelled request")
386 raise RuntimeError("Unrecognized response %r", response)
390 hildon.NumberEditor # TODO deprecated in fremantle
391 request_number = _hildon_request_number
392 except AttributeError:
393 request_number = _null_request_number
396 def _hildon_touch_selector(parent, title, items, defaultIndex):
397 model = gtk.ListStore(gobject.TYPE_STRING)
399 model.append((item, ))
401 selector = hildon.TouchSelector()
402 selector.append_text_column(model, True)
403 selector.set_column_selection_mode(hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE)
404 selector.set_active(0, defaultIndex)
406 dialog = hildon.PickerDialog(parent)
407 dialog.set_selector(selector)
411 response = dialog.run()
415 if response == gtk.RESPONSE_OK:
416 return selector.get_active(0)
417 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
418 raise RuntimeError("User cancelled request")
420 raise RuntimeError("Unrecognized response %r", response)
423 def _on_null_touch_selector_activated(treeView, path, column, dialog):
424 dialog.response(gtk.RESPONSE_OK)
427 def _null_touch_selector(parent, title, items, defaultIndex = -1):
428 model = gtk.ListStore(gobject.TYPE_STRING)
430 model.append((item, ))
432 cell = gtk.CellRendererText()
433 set_cell_thumb_selectable(cell)
434 column = gtk.TreeViewColumn(title)
435 column .pack_start(cell, expand=True)
436 column.add_attribute(cell, "text", 0)
438 treeView = gtk.TreeView()
439 treeView.set_model(model)
440 treeView.append_column(column)
441 selection = treeView.get_selection()
442 selection.set_mode(gtk.SELECTION_SINGLE)
444 selection.select_path((defaultIndex, ))
446 scrolledWin = gtk.ScrolledWindow()
447 scrolledWin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
448 scrolledWin.add(treeView)
449 hildonize_scrollwindow(scrolledWin)
454 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
455 (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
457 dialog.set_default_response(gtk.RESPONSE_CANCEL)
458 dialog.get_child().add(scrolledWin)
459 parentSize = parent.get_size()
460 dialog.resize(parentSize[0], max(parentSize[1]-100, 100))
461 treeView.connect("row-activated", _on_null_touch_selector_activated, dialog)
465 response = dialog.run()
469 if response == gtk.RESPONSE_OK:
470 model, itr = selection.get_selected()
472 raise RuntimeError("No selection made")
473 return model.get_path(itr)[0]
474 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
475 raise RuntimeError("User cancelled request")
477 raise RuntimeError("Unrecognized response %r", response)
483 touch_selector = _hildon_touch_selector
484 except AttributeError:
485 touch_selector = _null_touch_selector
488 if __name__ == "__main__":
489 app = get_app_class()()
491 win = hildonize_window(app, win)
493 print touch_selector(win, "Test", ["A", "B", "C", "D"], 2)