4 from __future__ import with_statement
26 __pretty_app_name__ = "DoneIt"
27 __app_name__ = "doneit"
29 __app_magic__ = 0xdeadbeef
32 '/usr/lib/doneit/doneit.glade',
33 os.path.join(os.path.dirname(__file__), "doneit.glade"),
34 os.path.join(os.path.dirname(__file__), "../lib/doneit.glade"),
37 _user_data = os.path.expanduser("~/.%s/" % __app_name__)
38 _user_settings = "%s/settings.ini" % _user_data
44 self._deviceIsOnline = True
45 self._connection = None
47 for path in self._glade_files:
48 if os.path.isfile(path):
49 self._widgetTree = gtk.glade.XML(path)
52 self.display_error_message("Cannot find doneit.glade")
55 os.makedirs(self._user_data)
60 self._clipboard = gtk.clipboard_get()
61 self.__window = self._widgetTree.get_widget("mainWindow")
62 self.__errorDisplay = gtk_toolbox.ErrorDisplay(self._widgetTree)
65 self._isFullScreen = False
66 if hildon is not None:
67 self._app = hildon.Program()
68 self.__window = hildon.Window()
69 self._widgetTree.get_widget("mainLayout").reparent(self.__window)
70 self._app.add_window(self.__window)
71 self._widgetTree.get_widget("usernameentry").set_property('hildon-input-mode', 7)
72 self._widgetTree.get_widget("passwordentry").set_property('hildon-input-mode', 7|(1 << 29))
73 self._widgetTree.get_widget("projectsCombo").get_child().set_property('hildon-input-mode', (1 << 4))
75 gtkMenu = self._widgetTree.get_widget("mainMenubar")
77 for child in gtkMenu.get_children():
79 self.__window.set_menu(menu)
82 self.__window.connect("key-press-event", self._on_key_press)
83 self.__window.connect("window-state-event", self._on_window_state_change)
85 pass # warnings.warn("No Hildon", UserWarning, 2)
88 "on_doneit_quit": self._on_close,
89 "on_paste": self._on_paste,
90 "on_about": self._on_about_activate,
92 self._widgetTree.signal_autoconnect(callbackMapping)
96 self.__window.set_title("%s" % self.__pretty_app_name__)
97 self.__window.connect("destroy", self._on_close)
98 self.__window.show_all()
100 backgroundSetup = threading.Thread(target=self._idle_setup)
101 backgroundSetup.setDaemon(True)
102 backgroundSetup.start()
104 def _idle_setup(self):
105 # Barebones UI handlers
107 gtk.gdk.threads_enter()
110 gtk_null.GtkNull(self._widgetTree),
113 gtk.gdk.threads_leave()
115 # Setup maemo specifics
122 self._osso = osso.Context(DoneIt.__app_name__, DoneIt.__version__, False)
123 device = osso.DeviceState(self._osso)
124 device.set_device_state_callback(self._on_device_state_change, 0)
126 pass # warnings.warn("No OSSO", UserWarning, 2)
132 self._connection = None
133 if conic is not None:
134 self._connection = conic.Connection()
135 self._connection.connect("connection-event", self._on_connection_change, self.__app_magic__)
136 self._connection.request_connection(conic.CONNECT_FLAG_NONE)
138 pass # warnings.warn("No Internet Connectivity API ", UserWarning)
140 # Setup costly backends
142 gtk.gdk.threads_enter()
144 self._todoUIs.extend([
145 gtk_rtmilk.GtkRtMilk(self._widgetTree),
147 self._todoUI = self._todoUIs[1]
148 self._todoUI.enable()
150 gtk.gdk.threads_leave()
152 def display_error_message(self, msg):
153 error_dialog = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg)
155 def close(dialog, response, editor):
156 editor.about_dialog = None
158 error_dialog.connect("response", close, self)
161 def _on_device_state_change(self, shutdown, save_unsaved_data, memory_low, system_inactivity, message, userData):
163 For system_inactivity, we have no background tasks to pause
165 @note Hildon specific
170 if save_unsaved_data or shutdown:
173 def _on_connection_change(self, connection, event, magicIdentifier):
175 @note Hildon specific
179 status = event.get_status()
180 error = event.get_error()
181 iap_id = event.get_iap_id()
182 bearer = event.get_bearer_type()
184 if status == conic.STATUS_CONNECTED:
185 self._deviceIsOnline = True
186 elif status == conic.STATUS_DISCONNECTED:
187 self._deviceIsOnline = False
189 def _on_window_state_change(self, widget, event, *args):
191 @note Hildon specific
193 if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
194 self._isFullScreen = True
196 self._isFullScreen = False
198 def _on_close(self, *args, **kwds):
199 if self._osso is not None:
207 def _on_paste(self, *args):
210 def _on_key_press(self, widget, event, *args):
212 @note Hildon specific
214 if event.keyval == gtk.keysyms.F6:
215 if self._isFullScreen:
216 self.__window.unfullscreen()
218 self.__window.fullscreen()
220 def _on_about_activate(self, *args):
221 dlg = gtk.AboutDialog()
222 dlg.set_name(self.__pretty_app_name__)
223 dlg.set_version(self.__version__)
224 dlg.set_copyright("Copyright 2008 - LGPL")
227 dlg.set_authors([""])
235 failureCount, testCount = doctest.testmod()
237 print "Tests Successful"
244 gtk.gdk.threads_init()
246 if hildon is not None:
247 gtk.set_application_name(DoneIt.__pretty_app_name__)
252 class DummyOptions(object):
258 if __name__ == "__main__":
259 if len(sys.argv) > 1:
265 if optparse is not None:
266 parser = optparse.OptionParser()
267 parser.add_option("-t", "--test", action="store_true", dest="test", help="Run tests")
268 (commandOptions, commandArgs) = parser.parse_args()
270 commandOptions = DummyOptions()
273 if commandOptions.test: