# GtkProgress.py # # Copyright (c) 2004,2005 Canonical # # Author: Michael Vogt # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA import pygtk pygtk.require('2.0') import gtk import apt import apt_pkg from gettext import gettext as _ # intervals of the start up progress # 3x caching and menu creation STEPS_UPDATE_CACHE = [33, 66, 100] class GtkOpProgress(apt.OpProgress): def __init__(self, host_window, progressbar, status, parent, steps=STEPS_UPDATE_CACHE): # used for the "one run progressbar" self.steps = steps[:] self.base = 0 self.old = 0 self.next = int(self.steps.pop(0)) self._parent = parent self._window = host_window self._status = status self._progressbar = progressbar # Do not show the close button self._window.realize() host_window.window.set_functions(gtk.gdk.FUNC_MOVE) self._window.set_transient_for(parent) def update(self, percent): #print percent #print self.Op #print self.SubOp self._window.show() self._parent.set_sensitive(False) # if the old percent was higher, a new progress was started if self.old > percent: # set the borders to the next interval self.base = self.next try: self.next = int(self.steps.pop(0)) except: pass progress = self.base + percent/100 * (self.next - self.base) self.old = percent self._status.set_markup("%s" % self.op) self._progressbar.set_fraction(progress/100.0) while gtk.events_pending(): gtk.main_iteration() def done(self): self._parent.set_sensitive(True) def hide(self): self._window.hide() class GtkFetchProgress(apt.progress.FetchProgress): def __init__(self, parent, summary="", descr=""): # if this is set to false the download will cancel self._continue = True # init vars here # FIXME: find a more elegant way, this sucks self.summary = parent.label_fetch_summary self.status = parent.label_fetch_status self.progress = parent.progressbar_fetch self.window_fetch = parent.window_fetch self.window_fetch.set_transient_for(parent.window_main) self.window_fetch.realize() self.window_fetch.window.set_functions(gtk.gdk.FUNC_MOVE) # set summary if self.summary != "": self.summary.set_markup("%s \n\n%s" % (summary, descr)) def start(self): self.progress.set_fraction(0) self.window_fetch.show() def stop(self): self.window_fetch.hide() def on_button_fetch_cancel_clicked(self, widget): self._continue = False def pulse(self): apt.progress.FetchProgress.pulse(self) currentItem = self.currentItems + 1 if currentItem > self.totalItems: currentItem = self.totalItems if self.currentCPS > 0: statusText = (_("Downloading file %li of %li with %s/s" % (currentItem, self.totalItems, apt_pkg.SizeToStr(self.currentCPS)))) else: statusText = (_("Downloading file %li of %li with unknown " "speed") % (currentItem, self.totalItems)) self.progress.set_fraction(self.percent/100.0) self.status.set_markup("%s" % statusText) # TRANSLATORS: show the remaining time in a progress bar: #self.progress.set_text(_("About %s left" % (apt_pkg.TimeToStr(self.eta)))) # FIXME: show remaining time self.progress.set_text("") while gtk.events_pending(): gtk.main_iteration() return self._continue