/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
47
        self.current = None
49
48
        self.total = None
50
49
 
51
 
    def finished(self):
52
 
        self._stack.remove(self)
53
 
 
54
 
    def clear(self):
55
 
        pass
56
 
 
57
50
    def tick(self):
58
51
        self.pulse()
59
52
 
60
 
    def update(self, msg=None, current=None, total=None):
61
 
        if current:
62
 
            self.current = current
63
 
        if total:
64
 
            self.total = total
 
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
65
59
        if msg is not None:
66
60
            self.set_text(msg)
67
61
        if None not in (self.current, self.total):
68
 
            self.set_fraction(1.0 * 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)
69
66
        while gtk.events_pending():
70
67
            gtk.main_iteration()
71
68
 
72
 
 
73
 
class GtkWindowProgressBarStack(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
 
74
78
    def __init__(self):
75
 
        super(GtkWindowProgressBarStack, self).__init__(type=gtk.WINDOW_TOPLEVEL)
 
79
        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
76
80
        self.set_border_width(0)
77
81
        self.set_title("Progress")
78
82
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
79
 
        self.vbox = gtk.VBox()
80
 
        self.add(self.vbox)
 
83
        self.pb = GtkProgressBar()
 
84
        self.add(self.pb)
 
85
        self.resize(250, 15)
81
86
        self.set_resizable(False)
82
87
 
83
 
    def _adapt_size(self):
84
 
        self.resize(250, 15 * len(self.vbox.get_children()))
85
 
 
86
 
    def get_nested(self):
87
 
        nested = GtkProgressBar(self)
88
 
        self.vbox.pack_start(nested)
89
 
        self._adapt_size()
90
 
        self.show_all()
91
 
        return nested
92
 
 
93
 
    def remove(self, pb):
94
 
        self.vbox.remove(pb)
95
 
        if len(self.vbox.get_children()) == 0: # If there is nothing to show, don't leave a ghost window here
96
 
             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()
97
132
 
98
133
 
99
134
class PasswordDialog(gtk.Dialog):
100
135
    """ Prompt the user for a password. """
101
136
    def __init__(self, prompt):
102
137
        gtk.Dialog.__init__(self)
103
 
        
 
138
 
104
139
        label = gtk.Label(prompt)
105
140
        self.vbox.pack_start(label, padding=10)
106
 
        
 
141
 
107
142
        self.entry = gtk.Entry()
108
143
        self.entry.set_visibility(False)
109
144
        self.vbox.pack_end(self.entry, padding=10)
110
 
        
 
145
 
111
146
        self.vbox.show_all()
112
 
        
113
 
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
114
 
    
 
147
 
 
148
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
149
                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
150
 
115
151
    def _get_passwd(self):
116
152
        return self.entry.get_text()
117
153
 
121
157
class GtkUIFactory(UIFactory):
122
158
    """A UI factory for GTK user interfaces."""
123
159
 
124
 
    def __init__(self,
125
 
                 stdout=None,
126
 
                 stderr=None):
127
 
        """Create a GtkUIFactory.
128
 
 
129
 
        """
 
160
    def __init__(self):
 
161
        """Create a GtkUIFactory"""
130
162
        super(GtkUIFactory, self).__init__()
131
 
        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())
132
168
 
133
169
    def get_boolean(self, prompt):
134
170
        """GtkDialog with yes/no answers"""
136
172
        response = dialog.run()
137
173
        dialog.destroy()
138
174
        return (response == gtk.RESPONSE_YES)
139
 
        
 
175
 
140
176
    def get_password(self, prompt='', **kwargs):
141
177
        """Prompt the user for a password.
142
178
 
156
192
        else:
157
193
            return None
158
194
 
159
 
    def nested_progress_bar(self):
160
 
        """Return a nested progress bar.
161
 
        """
162
 
        if self._progress_bar_stack is None:
163
 
            self._progress_bar_stack = GtkWindowProgressBarStack()
164
 
        return self._progress_bar_stack.get_nested()
165
 
 
166
 
    def set_progress_bar_vbox(self, vbox):
167
 
        """Change the vbox to put progress bars in.
168
 
        """
169
 
        self._progress_bar_stack = vbox
170
 
 
171
 
    def clear_term(self):
172
 
        """Prepare the terminal for output.
173
 
 
174
 
        It has no sense when talking about GTK."""
175
 
        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