>>>>> "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

Reply via email to