Rev 517: Simplify progress bar code, use embedded progress bar inside viz window. in file:///data/jelmer/bzr-gtk/trunk/

Jelmer Vernooij jelmer at samba.org
Sun Jun 29 19:12:46 BST 2008


At file:///data/jelmer/bzr-gtk/trunk/

------------------------------------------------------------
revno: 517
revision-id: jelmer at samba.org-20080629181229-1l2m4cf7vvbyh8qg
parent: jelmer at samba.org-20080629162424-48a6rrjmmpejfcyr
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: trunk
timestamp: Sun 2008-06-29 20:12:29 +0200
message:
  Simplify progress bar code, use embedded progress bar inside viz window.
modified:
  branchview/linegraph.py        graph.py-20051016214152-ebf565808c860cf7
  branchview/treeview.py         treeview.py-20071020204704-vk1erblrjhbcgw94-1
  ui.py                          ui.py-20060716163355-owuqwa9uhnlfsojs-1
=== modified file 'branchview/linegraph.py'
--- a/branchview/linegraph.py	2008-06-29 16:11:12 +0000
+++ b/branchview/linegraph.py	2008-06-29 18:12:29 +0000
@@ -47,7 +47,7 @@
     def update_root_progress(step_number):
         """IFF our container received a root progress bar, then update it."""
         if root_progress is not None:
-            root_progress.update(current=step_number)
+            root_progress.update(current_cnt=step_number)
 
     graph_parents = {}
     ghosts = set()
@@ -75,10 +75,10 @@
     update_root_progress(2)
     progress_bar = ui.ui_factory.nested_progress_bar()
     try:
-        progress_bar.update(msg="Removing ghosts", total=len(ghosts))
+        progress_bar.update(msg="Removing ghosts", total_cnt=len(ghosts))
         for i, ghost in enumerate(ghosts):
             if i % 25 == 0:
-                progress_bar.update(current=i)
+                progress_bar.update(None, current_cnt=i)
             for ghost_child in graph_children[ghost]:
                 graph_parents[ghost_child] = [p for p in graph_parents[ghost_child]
                                               if p not in ghosts]
@@ -118,7 +118,7 @@
     update_root_progress(3)
     progress_bar = ui.ui_factory.nested_progress_bar()
     try:
-        progress_bar.update(msg="Finding nodes", total=len(merge_sorted_revisions))
+        progress_bar.update(msg="Finding nodes", total_cnt=len(merge_sorted_revisions))
         for (rev_index, (sequence_number,
                          revid,
                          merge_depth,
@@ -126,7 +126,7 @@
                          end_of_merge)) in enumerate(merge_sorted_revisions):
 
             if rev_index % 25 == 0:
-                progress_bar.update(current=rev_index)
+                progress_bar.update(None, current_cnt=rev_index)
             if maxnum and rev_index >= maxnum:
                 break
             revid_index[revid] = rev_index
@@ -184,10 +184,10 @@
         update_root_progress(4)
         progress_bar = ui.ui_factory.nested_progress_bar()
         try:
-            progress_bar.update(msg="Organizing edges", total=len(branch_ids))
+            progress_bar.update(msg="Organizing edges", total_cnt=len(branch_ids))
             for i, branch_id in enumerate(branch_ids):
                 if i % 25 == 0:
-                    progress_bar.update(current=i)
+                    progress_bar.update(None, current_cnt=i)
                 branch_line = branch_lines[branch_id]
                 
                 # Find the col_index for the direct parent branch. This will be the
@@ -314,10 +314,10 @@
         update_root_progress(5)
         progress_bar = ui.ui_factory.nested_progress_bar()
         try:
-            progress_bar.update(msg="Pretifying graph", total=len(lines))
+            progress_bar.update(msg="Pretifying graph", total_cnt=len(lines))
             for i, (child_index, parent_index, line_col_indexes) in enumerate(lines):
                 if i % 25 == 0:
-                    progress_bar.update(current=i)
+                    progress_bar.update(None, current_cnt=i)
                 (child_col_index, child_color) = linegraph[child_index][1]
                 (parent_col_index, parent_color) = linegraph[parent_index][1]
                 

=== modified file 'branchview/treeview.py'
--- a/branchview/treeview.py	2008-06-29 16:24:24 +0000
+++ b/branchview/treeview.py	2008-06-29 18:12:29 +0000
@@ -16,11 +16,13 @@
 from bzrlib import ui
 
 from bzrlib.plugins.gtk import _i18n
+from bzrlib.plugins.gtk.ui import GtkProgressBar, ProgressPanel
 from linegraph import linegraph, same_branch
 from graphcell import CellRendererGraph
 from treemodel import TreeModel
 from bzrlib.revision import NULL_REVISION
 
+
 class TreeView(gtk.VBox):
 
     __gproperties__ = {
@@ -106,6 +108,10 @@
         """
         gtk.VBox.__init__(self, spacing=0)
 
+        loading_msg_widget = ProgressPanel()
+        ui.ui_factory.set_nested_progress_bar_widget(loading_msg_widget.get_progress_bar)
+        self.pack_start(loading_msg_widget, expand=False, fill=True)
+
         self.scrolled_window = gtk.ScrolledWindow()
         self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC,
                                         gtk.POLICY_AUTOMATIC)
@@ -269,8 +275,8 @@
                        should be broken.
         """
 
-        loading_progress = ui.ui_factory.nested_progress_bar()
-        loading_progress.update(msg="Loading ancestry graph", total=5)
+        self.progress_bar = ui.ui_factory.nested_progress_bar()
+        self.progress_bar.update(msg="Loading ancestry graph", total_cnt=5)
 
         try:
             if self.compact:
@@ -287,7 +293,7 @@
                                                             broken_line_length,
                                                             show_graph,
                                                             self.mainline_only,
-                                                            loading_progress)
+                                                            self.progress_bar)
 
             self.model = TreeModel(self.branch, linegraphdata)
             self.graph_cell.columns_len = columns_len
@@ -306,7 +312,7 @@
 
             return False
         finally:
-            loading_progress.finished()
+            self.progress_bar.finished()
 
     def construct_treeview(self):
         self.treeview = gtk.TreeView()
@@ -390,7 +396,7 @@
         self.treeview.append_column(self.date_column)
         
         return self.treeview
-
+    
     def _on_selection_changed(self, treeview):
         """callback for when the treeview changes."""
         (path, focus) = treeview.get_cursor()

=== modified file 'ui.py'
--- a/ui.py	2008-06-29 16:20:15 +0000
+++ b/ui.py	2008-06-29 18:12:29 +0000
@@ -22,7 +22,7 @@
 import gtk
 import sys
 
-import bzrlib.progress
+from bzrlib import progress
 from bzrlib.ui import UIFactory
 
 
@@ -40,60 +40,94 @@
                          gtk.RESPONSE_NO)
 
 
-class GtkProgressBar(gtk.ProgressBar):
-    def __init__(self, stack):
-        super(GtkProgressBar, self).__init__()
+class GtkProgressBar(gtk.ProgressBar,progress._BaseProgressBar):
+    def __init__(self, _stack=None):
+        gtk.ProgressBar.__init__(self)
         self.set_fraction(0.0)
-        self._stack = stack
+        progress._BaseProgressBar.__init__(self, _stack=_stack)
         self.current = None
         self.total = None
 
-    def finished(self):
-        self._stack.remove(self)
-
     def clear(self):
-        pass
+        self.hide()
 
     def tick(self):
         self.pulse()
 
-    def update(self, msg=None, current=None, total=None):
-        if current:
-            self.current = current
-        if total:
-            self.total = total
+    def child_update(self, message, current, total):
+        pass
+
+    def update(self, msg=None, current_cnt=None, total_cnt=None):
+        if current_cnt:
+            self.current = current_cnt
+        if total_cnt:
+            self.total = total_cnt
         if msg is not None:
             self.set_text(msg)
         if None not in (self.current, self.total):
-            self.set_fraction(1.0 * self.current / self.total)
+            self.fraction = float(self.current) / self.total
+            self.set_fraction(self.fraction)
         while gtk.events_pending():
             gtk.main_iteration()
 
 
-class GtkWindowProgressBarStack(gtk.Window):
+class ProgressBarWindow(gtk.Window):
     def __init__(self):
-        super(GtkWindowProgressBarStack, self).__init__(type=gtk.WINDOW_TOPLEVEL)
+        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
         self.set_border_width(0)
         self.set_title("Progress")
         self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
-        self.vbox = gtk.VBox()
-        self.add(self.vbox)
+        self.pb = GtkProgressBar(self)
+        self.add(self.pb)
+        self.resize(250, 15)
         self.set_resizable(False)
-
-    def _adapt_size(self):
-        self.resize(250, 15 * len(self.vbox.get_children()))
-
-    def get_nested(self):
-        nested = GtkProgressBar(self)
-        self.vbox.pack_start(nested)
-        self._adapt_size()
-        self.show_all()
-        return nested
-
-    def remove(self, pb):
-        self.vbox.remove(pb)
-        if len(self.vbox.get_children()) == 0: # If there is nothing to show, don't leave a ghost window here
-             self.destroy()
+        self.show_all()
+
+    def clear(self):
+        self.pb.clear()
+        self.destroy()
+
+
+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.set_spacing(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 update(self, *args, **kwargs):
+        self.pb.update(*args, **kwargs)
+
+    def finished(self):
+        self.pb.finished()
+        self.hide_all()
+
+    def clear(self):
+        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):
@@ -128,7 +162,7 @@
 
         """
         super(GtkUIFactory, self).__init__()
-        self._progress_bar_stack = None
+        self.set_nested_progress_bar_widget(ProgressBarWindow)
 
     def get_boolean(self, prompt):
         """GtkDialog with yes/no answers"""
@@ -156,11 +190,12 @@
         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.
         """
-        if self._progress_bar_stack is None:
-            self._progress_bar_stack = GtkWindowProgressBarStack()
         return self._progress_bar_stack.get_nested()
 
     def set_progress_bar_vbox(self, vbox):




More information about the bazaar-commits mailing list