Release 0.42.1
[zeroinstall/zeroinstall-rsl.git] / zeroinstall / 0launch-gui / gui.py
blobf5186743c4087f84bb883aba6e8a7c668f9fb822
1 # Copyright (C) 2009, Thomas Leonard
2 # See the README file for details, or visit http://0install.net.
4 import gobject
6 from zeroinstall.support import tasks
7 from zeroinstall.injector import handler, download
9 version = '0.42.1'
11 class GUIHandler(handler.Handler):
12 dl_callbacks = None # Download -> [ callback ]
13 pulse = None
14 mainwindow = None
16 def _reset_counters(self):
17 if not self.monitored_downloads:
18 self.n_completed_downloads = 0
19 self.total_bytes_downloaded = 0
20 return False
22 def abort_all_downloads(self):
23 for dl in self.monitored_downloads.values():
24 dl.abort()
26 def downloads_changed(self):
27 if self.monitored_downloads and self.pulse is None:
28 def pulse():
29 self.mainwindow.update_download_status()
30 return True
31 pulse()
32 self.pulse = gobject.timeout_add(200, pulse)
33 elif len(self.monitored_downloads) == 0:
34 # Delay before resetting, in case we start a new download quickly
35 gobject.timeout_add(500, self._reset_counters)
37 # Stop animation
38 if self.pulse:
39 gobject.source_remove(self.pulse)
40 self.pulse = None
41 self.mainwindow.update_download_status()
43 def impl_added_to_store(self, impl):
44 self.mainwindow.update_download_status()
46 @tasks.async
47 def confirm_import_feed(self, pending, valid_sigs):
48 if self.mainwindow.systray_icon:
49 self.mainwindow.systray_icon.set_tooltip(_('Need to confirm a new GPG key'))
50 self.mainwindow.systray_icon.set_blinking(True)
52 # Wait for the user to click the icon, then continue
53 yield self.mainwindow.systray_icon_blocker
54 yield tasks.TimeoutBlocker(0.5, 'Delay')
56 from zeroinstall.gtkui import trust_box
57 box = trust_box.TrustBox(pending, valid_sigs, parent = self.mainwindow.window)
58 box.show()
59 yield box.closed
61 def report_error(self, ex, tb = None):
62 if isinstance(ex, download.DownloadAborted):
63 return # No need to tell the user about this, since they caused it
64 self.mainwindow.report_exception(ex)