class ProgressBar(object): """Update a progressbar no more than 10 times a second.""" pulsating = True visible = False progress = 0.0 updates_delay = 0.1 timer = None inhibitor_defer = None def __init__(self, clock=reactor): """Initialize this instance.""" self.clock = clock try: self.launcher = UbuntuOneLauncher() except TypeError: # Unity GIR can cause a TypeError here so we should not fail self.launcher = DummyLauncher() def cleanup(self): """Cleanup this instance.""" if self.timer: self.timer.cleanup() self.timer = None def _timeout(self, result): """The aggregating timer has expired, so update the UI.""" self.timer = None self.launcher.set_progress(self.progress) logger.debug("progressbar updated: %f", self.progress) def set_progress(self, progress): """Steps amount changed. Set up a timer if there isn't one ticking.""" self.progress = progress if not self.visible: self.visible = True self.launcher.show_progressbar() logger.debug("progressbar shown") if self.inhibitor_defer is None: self.inhibitor_defer = session.inhibit_logout_suspend( FILE_SYNC_IN_PROGRESS) if not self.timer: self.timer = Timer(self.updates_delay, clock=self.clock) self.timer.addCallback(self._timeout) def completed(self): """All has completed.""" self.cleanup() self.visible = False self.launcher.hide_progressbar() logger.debug("progressbar hidden") if self.inhibitor_defer is not None: def inhibitor_callback(inhibitor): """The inhibitor was found, so cancel it.""" self.inhibitor_defer = None return inhibitor.cancel() self.inhibitor_defer.addCallback(inhibitor_callback)