/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to ui.py

  • Committer: Vincent Ladeuil
  • Date: 2009-06-10 16:38:37 UTC
  • mto: This revision was merged to the branch mainline in revision 648.
  • Revision ID: v.ladeuil+lp@free.fr-20090610163837-8n8122j38ozwd5ef
Fix #385191 by using the new progress reporting API.

* ui.py:
(GtkProgressBar): Simplified, we don't need to inherit from
_BaseProgressBar.
(GtkProgressBar.update): Show the widget.
(ProgressBarWindow.__init__): Simplified. Don't show
unconditionally.
(ProgressBarWindow.update): Show the widget.
(ProgressPanel.update): Show the widget.
(GtkUIFactory.__init__): Simplified.
(GtkUIFactory._progress_all_finished): 

* branchview/treeview.py:
(TreeView.__init__): Set the progress reporting widget.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
import gtk
23
23
import sys
24
24
 
25
 
import bzrlib.progress
 
25
from bzrlib import progress
26
26
from bzrlib.ui import UIFactory
27
27
 
28
28
 
30
30
    """ Prompt the user for a yes/no answer. """
31
31
    def __init__(self, prompt):
32
32
        gtk.Dialog.__init__(self)
33
 
        
 
33
 
34
34
        label = gtk.Label(prompt)
35
35
        self.vbox.pack_start(label, padding=10)
36
 
        
37
36
        self.vbox.show_all()
38
37
 
39
 
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, 
 
38
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO,
40
39
                         gtk.RESPONSE_NO)
41
40
 
42
41
 
43
42
class GtkProgressBar(gtk.ProgressBar):
44
 
    def __init__(self, stack):
45
 
        super(GtkProgressBar, self).__init__()
 
43
 
 
44
    def __init__(self):
 
45
        gtk.ProgressBar.__init__(self)
46
46
        self.set_fraction(0.0)
47
 
        self._stack = stack
48
 
 
49
 
    def finished(self):
50
 
        self._stack.remove(self)
51
 
 
52
 
    def clear(self):
53
 
        pass
 
47
        self.current = None
 
48
        self.total = None
54
49
 
55
50
    def tick(self):
56
51
        self.pulse()
57
52
 
58
 
    def update(self, msg=None, current=None, total=None):
 
53
    def update(self, msg=None, current_cnt=None, total_cnt=None):
 
54
        self.show()
 
55
        if current_cnt is not None:
 
56
            self.current = current_cnt
 
57
        if total_cnt is not None:
 
58
            self.total = total_cnt
59
59
        if msg is not None:
60
60
            self.set_text(msg)
61
 
        if None not in (current, total) and total > 0:
62
 
            self.set_fraction(1.0 * current / total)
 
61
        if None not in (self.current, self.total):
 
62
            self.fraction = float(self.current) / self.total
 
63
            if self.fraction < 0.0 or self.fraction > 1.0:
 
64
                raise AssertionError
 
65
            self.set_fraction(self.fraction)
63
66
        while gtk.events_pending():
64
67
            gtk.main_iteration()
65
68
 
66
 
 
67
 
class GtkProgressBarStack(gtk.Window):
 
69
    def finished(self):
 
70
        self.hide()
 
71
 
 
72
    def clear(self):
 
73
        self.hide()
 
74
 
 
75
 
 
76
class ProgressBarWindow(gtk.Window):
 
77
 
68
78
    def __init__(self):
69
 
        super(GtkProgressBarStack, self).__init__(type=gtk.WINDOW_TOPLEVEL)
 
79
        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
70
80
        self.set_border_width(0)
71
81
        self.set_title("Progress")
72
82
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
73
 
        self.vbox = gtk.VBox()
74
 
        self.add(self.vbox)
 
83
        self.pb = GtkProgressBar()
 
84
        self.add(self.pb)
 
85
        self.resize(250, 15)
75
86
        self.set_resizable(False)
76
87
 
77
 
    def _adapt_size(self):
78
 
        self.resize(250, 15 * len(self.vbox.get_children()))
79
 
 
80
 
    def get_nested(self):
81
 
        nested = GtkProgressBar(self)
82
 
        self.vbox.pack_start(nested)
83
 
        self._adapt_size()
84
 
        self.show_all()
85
 
        return nested
86
 
 
87
 
    def remove(self, pb):
88
 
        self.vbox.remove(pb)
89
 
        if len(self.vbox.get_children()) == 0: # If there is nothing to show, don't leave a ghost window here
90
 
             self.destroy()
 
88
    def tick(self, *args, **kwargs):
 
89
        self.pb.tick(*args, **kwargs)
 
90
 
 
91
    def update(self, *args, **kwargs):
 
92
        self.show_all()
 
93
        self.pb.update(*args, **kwargs)
 
94
 
 
95
    def finished(self):
 
96
        self.hide_all()
 
97
 
 
98
    def clear(self):
 
99
        self.pb.clear()
 
100
        # FIXME: destroy() ? Really ? -- vila 20090610
 
101
        self.destroy()
 
102
 
 
103
 
 
104
class ProgressPanel(gtk.HBox):
 
105
 
 
106
    def __init__(self):
 
107
        super(ProgressPanel, self).__init__()
 
108
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
 
109
                                                 gtk.ICON_SIZE_BUTTON)
 
110
        image_loading.show()
 
111
 
 
112
        self.pb = GtkProgressBar()
 
113
        self.set_spacing(5)
 
114
        self.set_border_width(5)
 
115
        self.pack_start(image_loading, False, False)
 
116
        self.pack_start(self.pb, True, True)
 
117
 
 
118
    def tick(self, *args, **kwargs):
 
119
        self.pb.tick(*args, **kwargs)
 
120
 
 
121
    def update(self, *args, **kwargs):
 
122
        self.show_all()
 
123
        self.pb.update(*args, **kwargs)
 
124
 
 
125
    def finished(self):
 
126
        self.pb.finished()
 
127
        self.hide_all()
 
128
 
 
129
    def clear(self):
 
130
        self.pb.clear()
 
131
        self.hide_all()
91
132
 
92
133
 
93
134
class PasswordDialog(gtk.Dialog):
94
135
    """ Prompt the user for a password. """
95
136
    def __init__(self, prompt):
96
137
        gtk.Dialog.__init__(self)
97
 
        
 
138
 
98
139
        label = gtk.Label(prompt)
99
140
        self.vbox.pack_start(label, padding=10)
100
 
        
 
141
 
101
142
        self.entry = gtk.Entry()
102
143
        self.entry.set_visibility(False)
103
144
        self.vbox.pack_end(self.entry, padding=10)
104
 
        
 
145
 
105
146
        self.vbox.show_all()
106
 
        
107
 
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
108
 
    
 
147
 
 
148
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
149
                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
150
 
109
151
    def _get_passwd(self):
110
152
        return self.entry.get_text()
111
153
 
115
157
class GtkUIFactory(UIFactory):
116
158
    """A UI factory for GTK user interfaces."""
117
159
 
118
 
    def __init__(self,
119
 
                 stdout=None,
120
 
                 stderr=None):
121
 
        """Create a GtkUIFactory.
122
 
 
123
 
        """
 
160
    def __init__(self):
 
161
        """Create a GtkUIFactory"""
124
162
        super(GtkUIFactory, self).__init__()
125
 
        self._progress_bar_stack = None
 
163
        # FIXME: The following seems to be there to provide a default for cases
 
164
        # where set_progress_bar_widget() is not called explicitely. It will be
 
165
        # better to call it explicitely and get rid of that default. (I'm not
 
166
        # even sure it really needed now :-/ -- vila 20090610.
 
167
        self.set_progress_bar_widget(ProgressBarWindow())
126
168
 
127
169
    def get_boolean(self, prompt):
128
170
        """GtkDialog with yes/no answers"""
130
172
        response = dialog.run()
131
173
        dialog.destroy()
132
174
        return (response == gtk.RESPONSE_YES)
133
 
        
 
175
 
134
176
    def get_password(self, prompt='', **kwargs):
135
177
        """Prompt the user for a password.
136
178
 
150
192
        else:
151
193
            return None
152
194
 
153
 
    def nested_progress_bar(self):
154
 
        """Return a nested progress bar.
155
 
        """
156
 
        if self._progress_bar_stack is None:
157
 
            self._progress_bar_stack = GtkProgressBarStack()
158
 
        return self._progress_bar_stack.get_nested()
159
 
 
160
 
    def set_progress_bar_vbox(self, vbox):
161
 
        """Change the vbox to put progress bars in.
162
 
        """
163
 
        self._progress_bar_stack = vbox
164
 
 
165
 
    def clear_term(self):
166
 
        """Prepare the terminal for output.
167
 
 
168
 
        It has no sense when talking about GTK."""
169
 
        pass
 
195
    def _progress_all_finished(self):
 
196
        """See UIFactory._progress_all_finished"""
 
197
        pbw = self._progress_bar_widget
 
198
        if pbw:
 
199
            pbw.finished()
 
200
 
 
201
    def _progress_updated(self, task):
 
202
        """See UIFactory._progress_updated"""
 
203
        pbw = self._progress_bar_widget
 
204
        if pbw:
 
205
            pbw.update(task.msg, task.current_cnt, task.total_cnt)
 
206
 
 
207
    def set_progress_bar_widget(self, widget):
 
208
        self._progress_bar_widget = widget
 
209