/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: Jelmer Vernooij
  • Date: 2008-06-29 16:24:24 UTC
  • mto: This revision was merged to the branch mainline in revision 519.
  • Revision ID: jelmer@samba.org-20080629162424-48a6rrjmmpejfcyr
Stop emitting no longer used revisions-loaded message.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
import gtk
23
23
import sys
24
24
 
25
 
from bzrlib import progress
 
25
import bzrlib.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
        
36
37
        self.vbox.show_all()
37
38
 
38
 
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO,
 
39
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, 
39
40
                         gtk.RESPONSE_NO)
40
41
 
41
42
 
42
43
class GtkProgressBar(gtk.ProgressBar):
43
 
 
44
 
    def __init__(self):
45
 
        gtk.ProgressBar.__init__(self)
 
44
    def __init__(self, stack):
 
45
        super(GtkProgressBar, self).__init__()
46
46
        self.set_fraction(0.0)
 
47
        self._stack = stack
47
48
        self.current = None
48
49
        self.total = None
49
50
 
 
51
    def finished(self):
 
52
        self._stack.remove(self)
 
53
 
 
54
    def clear(self):
 
55
        pass
 
56
 
50
57
    def tick(self):
51
 
        self.show()
52
58
        self.pulse()
53
59
 
54
 
    def update(self, msg=None, current_cnt=None, total_cnt=None):
55
 
        self.show()
56
 
        if current_cnt is not None:
57
 
            self.current = current_cnt
58
 
        if total_cnt is not None:
59
 
            self.total = total_cnt
 
60
    def update(self, msg=None, current=None, total=None):
 
61
        if current:
 
62
            self.current = current
 
63
        if total:
 
64
            self.total = total
60
65
        if msg is not None:
61
66
            self.set_text(msg)
62
67
        if None not in (self.current, self.total):
63
 
            self.fraction = float(self.current) / self.total
64
 
            if self.fraction < 0.0 or self.fraction > 1.0:
65
 
                raise AssertionError
66
 
            self.set_fraction(self.fraction)
 
68
            self.set_fraction(1.0 * self.current / self.total)
67
69
        while gtk.events_pending():
68
70
            gtk.main_iteration()
69
71
 
70
 
    def finished(self):
71
 
        self.hide()
72
 
 
73
 
    def clear(self):
74
 
        self.hide()
75
 
 
76
 
 
77
 
class ProgressBarWindow(gtk.Window):
78
 
 
 
72
 
 
73
class GtkWindowProgressBarStack(gtk.Window):
79
74
    def __init__(self):
80
 
        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
 
75
        super(GtkWindowProgressBarStack, self).__init__(type=gtk.WINDOW_TOPLEVEL)
81
76
        self.set_border_width(0)
82
77
        self.set_title("Progress")
83
78
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
84
 
        self.pb = GtkProgressBar()
85
 
        self.add(self.pb)
86
 
        self.resize(250, 15)
 
79
        self.vbox = gtk.VBox()
 
80
        self.add(self.vbox)
87
81
        self.set_resizable(False)
88
82
 
89
 
    def tick(self, *args, **kwargs):
90
 
        self.show_all()
91
 
        self.pb.tick(*args, **kwargs)
92
 
 
93
 
    def update(self, *args, **kwargs):
94
 
        self.show_all()
95
 
        self.pb.update(*args, **kwargs)
96
 
 
97
 
    def finished(self):
98
 
        self.pb.finished()
99
 
        self.hide_all()
100
 
        self.destroy()
101
 
 
102
 
    def clear(self):
103
 
        self.pb.clear()
104
 
        self.hide_all()
105
 
 
106
 
 
107
 
class ProgressPanel(gtk.HBox):
108
 
 
109
 
    def __init__(self):
110
 
        super(ProgressPanel, self).__init__()
111
 
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
112
 
                                                 gtk.ICON_SIZE_BUTTON)
113
 
        image_loading.show()
114
 
 
115
 
        self.pb = GtkProgressBar()
116
 
        self.set_spacing(5)
117
 
        self.set_border_width(5)
118
 
        self.pack_start(image_loading, False, False)
119
 
        self.pack_start(self.pb, True, True)
120
 
 
121
 
    def tick(self, *args, **kwargs):
122
 
        self.show_all()
123
 
        self.pb.tick(*args, **kwargs)
124
 
 
125
 
    def update(self, *args, **kwargs):
126
 
        self.show_all()
127
 
        self.pb.update(*args, **kwargs)
128
 
 
129
 
    def finished(self):
130
 
        self.pb.finished()
131
 
        self.hide_all()
132
 
 
133
 
    def clear(self):
134
 
        self.pb.clear()
135
 
        self.hide_all()
 
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()
136
97
 
137
98
 
138
99
class PasswordDialog(gtk.Dialog):
139
100
    """ Prompt the user for a password. """
140
 
 
141
101
    def __init__(self, prompt):
142
102
        gtk.Dialog.__init__(self)
143
 
 
 
103
        
144
104
        label = gtk.Label(prompt)
145
105
        self.vbox.pack_start(label, padding=10)
146
 
 
 
106
        
147
107
        self.entry = gtk.Entry()
148
108
        self.entry.set_visibility(False)
149
109
        self.vbox.pack_end(self.entry, padding=10)
150
 
 
 
110
        
151
111
        self.vbox.show_all()
152
 
 
153
 
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK,
154
 
                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
155
 
 
 
112
        
 
113
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
114
    
156
115
    def _get_passwd(self):
157
116
        return self.entry.get_text()
158
117
 
162
121
class GtkUIFactory(UIFactory):
163
122
    """A UI factory for GTK user interfaces."""
164
123
 
165
 
    def __init__(self):
166
 
        """Create a GtkUIFactory"""
 
124
    def __init__(self,
 
125
                 stdout=None,
 
126
                 stderr=None):
 
127
        """Create a GtkUIFactory.
 
128
 
 
129
        """
167
130
        super(GtkUIFactory, self).__init__()
168
 
        self.set_progress_bar_widget(None)
169
 
 
170
 
    def set_progress_bar_widget(self, widget):
171
 
        self._progress_bar_widget = widget
 
131
        self._progress_bar_stack = None
172
132
 
173
133
    def get_boolean(self, prompt):
174
134
        """GtkDialog with yes/no answers"""
176
136
        response = dialog.run()
177
137
        dialog.destroy()
178
138
        return (response == gtk.RESPONSE_YES)
179
 
 
 
139
        
180
140
    def get_password(self, prompt='', **kwargs):
181
141
        """Prompt the user for a password.
182
142
 
196
156
        else:
197
157
            return None
198
158
 
199
 
    def _progress_all_finished(self):
200
 
        """See UIFactory._progress_all_finished"""
201
 
        pbw = self._progress_bar_widget
202
 
        if pbw:
203
 
            pbw.finished()
204
 
 
205
 
    def _progress_updated(self, task):
206
 
        """See UIFactory._progress_updated"""
207
 
        if self._progress_bar_widget is None:
208
 
            # Default to a window since nobody gave us a better mean to report
209
 
            # progress.
210
 
            self.set_progress_bar_widget(ProgressBarWindow())
211
 
        self._progress_bar_widget.update(task.msg,
212
 
                                         task.current_cnt, task.total_cnt)
213
 
 
 
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