This patch uses the new progress reporting API available in bzr
since 1.12 :-P
The nice thing is that bzr viz now shows a lot more than before
(or at least that what I remember :-)
I'm pretty sure the patch is conservative but I'd appreciate
feedback on any edge case (I mostly tested viz).
The intent is to land that patch ASAP as one can't use bzr.dev
and bzr-gtk trunk anymore.
bzr-1.16 is pretty close, it would be nice to release
bzr-gtk-0.9.6 soon (hint [1] :)
Vincent
[1]: Looks like we can settle on bug
https://bugs.edge.launchpad.net/bzr-gtk/+bug/377476 now, yes ? :-D
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [email protected]
# target_branch: http://bazaar.launchpad.net/%7Ebzr-gtk/bzr-gtk/trunk
# testament_sha1: 59d56ae84cef73018cdac15b13d16e97b08fb68a
# timestamp: 2009-06-10 18:42:05 +0200
# base_revision_id: [email protected]
#
# Begin patch
=== modified file 'NEWS'
--- NEWS 2009-05-28 15:28:13 +0000
+++ NEWS 2009-06-10 16:38:37 +0000
@@ -4,6 +4,9 @@
* Add colored status messages in Olive file list (Jasper Groenewegen)
+ * Use the new progress bar implementation from bzrlib.
+ (Vincent Ladeuil, 385191)
+
CHANGES
* Add ginfo command line option (Jasper Groenewegen)
=== modified file 'branchview/treeview.py'
--- branchview/treeview.py 2008-08-02 20:44:17 +0000
+++ branchview/treeview.py 2009-06-10 16:38:37 +0000
@@ -111,8 +111,10 @@
gtk.VBox.__init__(self, spacing=0)
loading_msg_widget = ProgressPanel()
- if getattr(ui.ui_factory, "set_nested_progress_bar_widget", None) is not None:
- ui.ui_factory.set_nested_progress_bar_widget(loading_msg_widget.get_progress_bar)
+ # FIXME: Why is the following needed ? Are there really cases where we
+ # use a TreeView without installing our own ui ? --vila 20090610
+ if getattr(ui.ui_factory, "set_progress_bar_widget", None) is not None:
+ ui.ui_factory.set_progress_bar_widget(loading_msg_widget)
self.pack_start(loading_msg_widget, expand=False, fill=True)
self.scrolled_window = gtk.ScrolledWindow()
=== modified file 'ui.py'
--- ui.py 2008-07-25 21:07:46 +0000
+++ ui.py 2009-06-10 16:38:37 +0000
@@ -30,34 +30,28 @@
""" Prompt the user for a yes/no answer. """
def __init__(self, prompt):
gtk.Dialog.__init__(self)
-
+
label = gtk.Label(prompt)
self.vbox.pack_start(label, padding=10)
-
self.vbox.show_all()
- self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO,
+ self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO,
gtk.RESPONSE_NO)
-class GtkProgressBar(gtk.ProgressBar,progress._BaseProgressBar):
- def __init__(self, _stack=None):
+class GtkProgressBar(gtk.ProgressBar):
+
+ def __init__(self):
gtk.ProgressBar.__init__(self)
self.set_fraction(0.0)
- progress._BaseProgressBar.__init__(self, _stack=_stack)
self.current = None
self.total = None
- def clear(self):
- self.hide()
-
def tick(self):
self.pulse()
- def child_update(self, message, current, total):
- pass
-
def update(self, msg=None, current_cnt=None, total_cnt=None):
+ self.show()
if current_cnt is not None:
self.current = current_cnt
if total_cnt is not None:
@@ -72,76 +66,60 @@
while gtk.events_pending():
gtk.main_iteration()
+ def finished(self):
+ self.hide()
+
+ def clear(self):
+ self.hide()
+
class ProgressBarWindow(gtk.Window):
- def __init__(self, to_file=None, show_pct=None, show_spinner=None, show_eta=None,
- show_bar=None, show_count=None, to_messages_file=None, _stack=None):
+
+ def __init__(self):
super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
- self._stack = _stack
self.set_border_width(0)
self.set_title("Progress")
self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
- self.pb = GtkProgressBar(self)
+ self.pb = GtkProgressBar()
self.add(self.pb)
self.resize(250, 15)
self.set_resizable(False)
+
+ def tick(self, *args, **kwargs):
+ self.pb.tick(*args, **kwargs)
+
+ def update(self, *args, **kwargs):
self.show_all()
-
- def return_pb(self, pb):
- self._stack.return_pb(self)
-
- def update(self, *args, **kwargs):
self.pb.update(*args, **kwargs)
- def tick(self, *args, **kwargs):
- self.pb.tick(*args, **kwargs)
-
def finished(self):
- self.pb.finished()
self.hide_all()
-
+
def clear(self):
self.pb.clear()
+ # FIXME: destroy() ? Really ? -- vila 20090610
self.destroy()
- def child_progress(self, *args, **kwargs):
- return self.pb.child_progress(*args, **kwargs)
-
- def child_update(self, *args, **kwargs):
- return self.pb.child_update(*args, **kwargs)
-
- def get_progress_bar(self):
- self.show_all()
- return self
-
class ProgressPanel(gtk.HBox):
+
def __init__(self):
super(ProgressPanel, self).__init__()
image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
gtk.ICON_SIZE_BUTTON)
image_loading.show()
-
- self.pb = GtkProgressBar(self)
+
+ self.pb = GtkProgressBar()
self.set_spacing(5)
- self.set_border_width(5)
+ self.set_border_width(5)
self.pack_start(image_loading, False, False)
self.pack_start(self.pb, True, True)
- def return_pb(self, pb):
- self._stack.return_pb(self)
-
- def get_progress_bar(self, to_file=None, show_pct=None, show_spinner=None, show_eta=None,
- show_bar=None, show_count=None, to_messages_file=None,
- _stack=None):
- self._stack = _stack
- self.show_all()
- return self
-
def tick(self, *args, **kwargs):
self.pb.tick(*args, **kwargs)
-
+
def update(self, *args, **kwargs):
+ self.show_all()
self.pb.update(*args, **kwargs)
def finished(self):
@@ -152,30 +130,24 @@
self.pb.clear()
self.hide_all()
- def child_progress(self, *args, **kwargs):
- return self.pb.child_progress(*args, **kwargs)
-
- def child_update(self, *args, **kwargs):
- return self.pb.child_update(*args, **kwargs)
-
-
class PasswordDialog(gtk.Dialog):
""" Prompt the user for a password. """
def __init__(self, prompt):
gtk.Dialog.__init__(self)
-
+
label = gtk.Label(prompt)
self.vbox.pack_start(label, padding=10)
-
+
self.entry = gtk.Entry()
self.entry.set_visibility(False)
self.vbox.pack_end(self.entry, padding=10)
-
+
self.vbox.show_all()
-
- self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
-
+
+ self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK,
+ gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
+
def _get_passwd(self):
return self.entry.get_text()
@@ -185,14 +157,14 @@
class GtkUIFactory(UIFactory):
"""A UI factory for GTK user interfaces."""
- def __init__(self,
- stdout=None,
- stderr=None):
- """Create a GtkUIFactory.
-
- """
+ def __init__(self):
+ """Create a GtkUIFactory"""
super(GtkUIFactory, self).__init__()
- self.set_nested_progress_bar_widget(ProgressBarWindow)
+ # FIXME: The following seems to be there to provide a default for cases
+ # where set_progress_bar_widget() is not called explicitely. It will be
+ # better to call it explicitely and get rid of that default. (I'm not
+ # even sure it really needed now :-/ -- vila 20090610.
+ self.set_progress_bar_widget(ProgressBarWindow())
def get_boolean(self, prompt):
"""GtkDialog with yes/no answers"""
@@ -200,7 +172,7 @@
response = dialog.run()
dialog.destroy()
return (response == gtk.RESPONSE_YES)
-
+
def get_password(self, prompt='', **kwargs):
"""Prompt the user for a password.
@@ -220,21 +192,18 @@
else:
return None
- def set_nested_progress_bar_widget(self, widget):
- self._progress_bar_stack = progress.ProgressBarStack(klass=widget)
-
- def nested_progress_bar(self):
- """Return a nested progress bar.
- """
- return self._progress_bar_stack.get_nested()
-
- def set_progress_bar_vbox(self, vbox):
- """Change the vbox to put progress bars in.
- """
- self._progress_bar_stack = vbox
-
- def clear_term(self):
- """Prepare the terminal for output.
-
- It has no sense when talking about GTK."""
- pass
+ def _progress_all_finished(self):
+ """See UIFactory._progress_all_finished"""
+ pbw = self._progress_bar_widget
+ if pbw:
+ pbw.finished()
+
+ def _progress_updated(self, task):
+ """See UIFactory._progress_updated"""
+ pbw = self._progress_bar_widget
+ if pbw:
+ pbw.update(task.msg, task.current_cnt, task.total_cnt)
+
+ def set_progress_bar_widget(self, widget):
+ self._progress_bar_widget = widget
+
# Begin bundle
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
--
bzr-gtk mailing list
[email protected]
Modify settings or unsubscribe at:
https://lists.canonical.com/mailman/listinfo/bzr-gtk