>>>>> "vila" == Vincent Ladeuil <[email protected]> writes:
Jelmer> We rely on this in a lot of places, and we can't get
Jelmer> rid of it in the near future, and perhaps
Jelmer> never. Progress bars can be created by pretty much
Jelmer> any call to bzrlib.
vila> I will tend to answer to that by:
vila> if we have a progress widget:
vila> use it
vila> else:
vila> tell bzr to *not* report progress
vila> And try to add progress widgets anywhere it's
vila> needed. This can be done progressively driven by demand
vila> (bzr doesn't report progress everywhere it should
vila> either).
Jelmer> If you for example run "bzr gannotate" in a subversion
Jelmer> working copy you get a window-based progress bar.
Gannotate should defines its own progress widget.
But I don't have a subversion working copy handy, do you have
another example *I* can use to reproduce and test the
window-based progress bar ?
vila> That also means that if you *don't* need a window-based
vila> progress bar, you can't avoid using one either...
Addressed in the associated patch.
vila> And then there is the question of destroying that
vila> window when you don't need it anymore which we have no
vila> way to detect :-/
I used _progress_all_finished for that purpose.
<snip/>
vila> But describing ad-hoc tests rocks ! How did you test ? :-)
Still standing, I *think* my patch is correct in that respect,
but I still feel that the overall design (past *and* present) is
not bullet-proof.
Jelmer> There's some bits of the network activity still being
Jelmer> printed to stdout.
That's very strange because the default ui don't do that, only
TextUIFactory can produce that so far, and bzr-gtk installed its
own ui via open_display which should be called very early for any
command.
Again, a recipe to reproduce ?
Jelmer> It would be nice to show this information in the
Jelmer> progress bars, or alternatively we could just hide it
Jelmer> for now.
That should be the case.
<snip/>
vila> So let's try to make it works again before making it
vila> right, ok ? :)
I think it works :-)
Vincent
# 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: 97fc94d9e224fa3776cf87e5f9bb7b6fe1d0f2f5
# timestamp: 2009-06-12 13:34:56 +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-12 11:34:44 +0000
@@ -111,8 +111,9 @@
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)
+ if getattr(ui.ui_factory, "set_progress_bar_widget", None) is not None:
+ # We'are using our own ui, let's tell it to use our widget.
+ 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-12 11:34:44 +0000
@@ -30,34 +30,29 @@
""" 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.show()
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 +67,63 @@
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.show_all()
+ self.pb.tick(*args, **kwargs)
- def return_pb(self, pb):
- self._stack.return_pb(self)
-
def update(self, *args, **kwargs):
+ self.show_all()
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()
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
+ def clear(self):
+ self.pb.clear()
+ self.hide_all()
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.show_all()
self.pb.tick(*args, **kwargs)
-
+
def update(self, *args, **kwargs):
+ self.show_all()
self.pb.update(*args, **kwargs)
def finished(self):
@@ -152,30 +134,25 @@
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 +162,13 @@
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)
+ self.set_progress_bar_widget(None)
+
+ def set_progress_bar_widget(self, widget):
+ self._progress_bar_widget = widget
def get_boolean(self, prompt):
"""GtkDialog with yes/no answers"""
@@ -200,7 +176,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 +196,19 @@
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()
+ self.set_progress_bar_widget(None)
+
+ def _progress_updated(self, task):
+ """See UIFactory._progress_updated"""
+ if self._progress_bar_widget is None:
+ # Default to a window since nobody gave us a better mean to report
+ # progress.
+ self.set_progress_bar_widget(ProgressBarWindow())
+ self._progress_bar_widget.update(task.msg,
+ task.current_cnt, task.total_cnt)
+
# Begin bundle
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
0iUA
--
bzr-gtk mailing list
[email protected]
Modify settings or unsubscribe at:
https://lists.canonical.com/mailman/listinfo/bzr-gtk