Minor tweaks in prep for more fremantle work
[gc-dialer] / src / hildonize.py
1 #!/usr/bin/env python
2
3
4 import gtk
5 import dbus
6
7
8 class _NullHildonModule(object):
9         pass
10
11
12 try:
13         import hildon as _hildon
14         hildon  = _hildon # Dumb but gets around pyflakiness
15 except (ImportError, OSError):
16         hildon = _NullHildonModule
17
18
19 IS_HILDON_SUPPORTED = hildon is not _NullHildonModule
20
21
22 class _NullHildonProgram(object):
23
24         def add_window(self, window):
25                 pass
26
27
28 def _hildon_get_app_class():
29         return hildon.Program
30
31
32 def _null_get_app_class():
33         return _NullHildonProgram
34
35
36 if IS_HILDON_SUPPORTED:
37         get_app_class = _hildon_get_app_class
38 else:
39         get_app_class = _null_get_app_class
40
41
42 def _hildon_set_application_title(window, title):
43         pass
44
45
46 def _null_set_application_title(window, title):
47         window.set_title(title)
48
49
50 if IS_HILDON_SUPPORTED:
51         set_application_title = _hildon_set_application_title
52 else:
53         set_application_title = _null_set_application_title
54
55
56 def _fremantle_hildonize_window(app, window):
57         oldWindow = window
58         newWindow = hildon.StackableWindow()
59         oldWindow.get_child().reparent(newWindow)
60         app.add_window(newWindow)
61         return newWindow
62
63
64 def _hildon_hildonize_window(app, window):
65         oldWindow = window
66         newWindow = hildon.Window()
67         oldWindow.get_child().reparent(newWindow)
68         app.add_window(newWindow)
69         return newWindow
70
71
72 def _null_hildonize_window(app, window):
73         return window
74
75
76 try:
77         hildon.StackableWindow
78         hildonize_window = _fremantle_hildonize_window
79 except AttributeError:
80         try:
81                 hildon.Window
82                 hildonize_window = _hildon_hildonize_window
83         except AttributeError:
84                 hildonize_window = _null_hildonize_window
85
86
87 def _fremantle_hildonize_menu(window, gtkMenu, buttons):
88         appMenu = hildon.AppMenu()
89         for button in buttons:
90                 appMenu.append(button)
91         window.set_app_menu(appMenu)
92         gtkMenu.get_parent().remove(gtkMenu)
93         return appMenu
94
95
96 def _hildon_hildonize_menu(window, gtkMenu, ignoredButtons):
97         hildonMenu = gtk.Menu()
98         for child in gtkMenu.get_children():
99                 child.reparent(hildonMenu)
100         window.set_menu(hildonMenu)
101         gtkMenu.destroy()
102         return hildonMenu
103
104
105 def _null_hildonize_menu(window, gtkMenu, ignoredButtons):
106         return gtkMenu
107
108
109 try:
110         hildon.AppMenu
111         GTK_MENU_USED = False
112         hildonize_menu = _fremantle_hildonize_menu
113 except AttributeError:
114         GTK_MENU_USED = True
115         if IS_HILDON_SUPPORTED:
116                 hildonize_menu = _hildon_hildonize_menu
117         else:
118                 hildonize_menu = _null_hildonize_menu
119
120
121 def _hildon_set_cell_thumb_selectable(renderer):
122         renderer.set_property("scale", 1.5)
123
124
125 def _null_set_cell_thumb_selectable(renderer):
126         pass
127
128
129 if IS_HILDON_SUPPORTED:
130         set_cell_thumb_selectable = _hildon_set_cell_thumb_selectable
131 else:
132         set_cell_thumb_selectable = _null_set_cell_thumb_selectable
133
134
135 def _hildon_hildonize_text_entry(textEntry):
136         textEntry.set_property('hildon-input-mode', 7)
137
138
139 def _null_hildonize_text_entry(textEntry):
140         pass
141
142
143 if IS_HILDON_SUPPORTED:
144         hildonize_text_entry = _hildon_hildonize_text_entry
145 else:
146         hildonize_text_entry = _null_hildonize_text_entry
147
148
149 def _hildon_mark_window_rotatable(window):
150         # gtk documentation is unclear whether this does a "=" or a "|="
151         window.set_flags(hildon.HILDON_PORTRAIT_MODE_SUPPORT)
152
153
154 def _null_mark_window_rotatable(window):
155         pass
156
157
158 try:
159         hildon.HILDON_PORTRAIT_MODE_SUPPORT
160         mark_window_rotatable = _hildon_mark_window_rotatable
161 except AttributeError:
162         mark_window_rotatable = _null_mark_window_rotatable
163
164
165 def _hildon_window_to_portrait(window):
166         # gtk documentation is unclear whether this does a "=" or a "|="
167         window.set_flags(hildon.HILDON_PORTRAIT_MODE_SUPPORT)
168
169
170 def _hildon_window_to_landscape(window):
171         # gtk documentation is unclear whether this does a "=" or a "&= ~"
172         window.unset_flags(hildon.HILDON_PORTRAIT_MODE_REQUEST)
173
174
175 def _null_window_to_portrait(window):
176         pass
177
178
179 def _null_window_to_landscape(window):
180         pass
181
182
183 try:
184         hildon.HILDON_PORTRAIT_MODE_SUPPORT
185         hildon.HILDON_PORTRAIT_MODE_REQUEST
186
187         window_to_portrait = _hildon_window_to_portrait
188         window_to_landscape = _hildon_window_to_landscape
189 except AttributeError:
190         window_to_portrait = _null_window_to_portrait
191         window_to_landscape = _null_window_to_landscape
192
193
194 def get_device_orientation():
195         bus = dbus.SystemBus()
196         try:
197                 rawMceRequest = bus.get_object("com.nokia.mce", "/com/nokia/mce/request")
198                 mceRequest = dbus.Interface(rawMceRequest, dbus_interface="com.nokia.mce.request")
199                 orientation, standState, faceState, xAxis, yAxis, zAxis = mceRequest.get_device_orientation()
200         except dbus.exception.DBusException:
201                 # catching for documentation purposes that when a system doesn't
202                 # support this, this is what to expect
203                 raise
204
205         if orientation == "":
206                 return gtk.ORIENTATION_HORIZONTAL
207         elif orientation == "":
208                 return gtk.ORIENTATION_VERTICAL
209         else:
210                 raise RuntimeError("Unknown orientation: %s" % orientation)
211
212
213 def _hildon_hildonize_password_entry(textEntry):
214         textEntry.set_property('hildon-input-mode', 7 | (1 << 29))
215
216
217 def _null_hildonize_password_entry(textEntry):
218         pass
219
220
221 if IS_HILDON_SUPPORTED:
222         hildonize_password_entry = _hildon_hildonize_password_entry
223 else:
224         hildonize_password_entry = _null_hildonize_password_entry
225
226
227 def _hildon_hildonize_combo_entry(comboEntry):
228         comboEntry.set_property('hildon-input-mode', 1 << 4)
229
230
231 def _null_hildonize_combo_entry(textEntry):
232         pass
233
234
235 if IS_HILDON_SUPPORTED:
236         hildonize_combo_entry = _hildon_hildonize_combo_entry
237 else:
238         hildonize_combo_entry = _null_hildonize_combo_entry
239
240
241 def _fremantle_hildonize_scrollwindow(scrolledWindow):
242         pannableWindow = hildon.PannableArea()
243
244         child = scrolledWindow.get_child()
245         scrolledWindow.remove(child)
246         pannableWindow.add(child)
247
248         parent = scrolledWindow.get_parent()
249         parent.remove(scrolledWindow)
250         parent.add(pannableWindow)
251
252         return pannableWindow
253
254
255 def _hildon_hildonize_scrollwindow(scrolledWindow):
256         hildon.hildon_helper_set_thumb_scrollbar(scrolledWindow, True)
257         return scrolledWindow
258
259
260 def _null_hildonize_scrollwindow(scrolledWindow):
261         return scrolledWindow
262
263
264 try:
265         hildon.PannableArea
266         hildonize_scrollwindow = _fremantle_hildonize_scrollwindow
267         hildonize_scrollwindow_with_viewport = _hildon_hildonize_scrollwindow
268 except AttributeError:
269         try:
270                 hildon.hildon_helper_hildonize_scrollwindow
271                 hildonize_scrollwindow = _hildon_hildonize_scrollwindow
272                 hildonize_scrollwindow_with_viewport = _hildon_hildonize_scrollwindow
273         except AttributeError:
274                 hildonize_scrollwindow = _null_hildonize_scrollwindow
275                 hildonize_scrollwindow_with_viewport = _null_hildonize_scrollwindow
276
277
278 def _hildon_request_number(parent, title, range, default):
279         spinner = hildon.NumberEditor(*range)
280         spinner.set_value(default)
281
282         dialog = gtk.Dialog(
283                 title,
284                 parent,
285                 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
286                 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
287         )
288         dialog.set_default_response(gtk.RESPONSE_CANCEL)
289         dialog.get_child().add(spinner)
290
291         try:
292                 dialog.show_all()
293                 response = dialog.run()
294         finally:
295                 dialog.hide()
296
297         if response == gtk.RESPONSE_OK:
298                 return spinner.get_value()
299         elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
300                 raise RuntimeError("User cancelled request")
301         else:
302                 raise RuntimeError("Unrecognized response %r", response)
303
304
305 def _null_request_number(parent, title, range, default):
306         adjustment = gtk.Adjustment(default, range[0], range[1], 1, 5, 0)
307         spinner = gtk.SpinButton(adjustment, 0, 0)
308         spinner.set_wrap(False)
309
310         dialog = gtk.Dialog(
311                 title,
312                 parent,
313                 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
314                 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
315         )
316         dialog.set_default_response(gtk.RESPONSE_CANCEL)
317         dialog.get_child().add(spinner)
318
319         try:
320                 dialog.show_all()
321                 response = dialog.run()
322         finally:
323                 dialog.hide()
324
325         if response == gtk.RESPONSE_OK:
326                 return spinner.get_value_as_int()
327         elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
328                 raise RuntimeError("User cancelled request")
329         else:
330                 raise RuntimeError("Unrecognized response %r", response)
331
332
333 try:
334         hildon.NumberEditor # TODO deprecated in fremantle
335         request_number = _hildon_request_number
336 except AttributeError:
337         request_number = _null_request_number