/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: 2011-12-11 17:14:12 UTC
  • Revision ID: jelmer@samba.org-20111211171412-cgcn0yas3zlcahzg
StartĀ onĀ 0.104.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
"""GTK UI
20
20
"""
21
21
 
22
 
import gtk
23
 
import sys
 
22
from gi.repository import Gtk
24
23
 
25
 
from bzrlib import progress
26
24
from bzrlib.ui import UIFactory
27
25
 
28
26
 
29
 
class PromptDialog(gtk.Dialog):
30
 
    """ Prompt the user for a yes/no answer. """
 
27
class PromptDialog(Gtk.Dialog):
 
28
    """Prompt the user for a yes/no answer."""
 
29
 
31
30
    def __init__(self, prompt):
32
 
        gtk.Dialog.__init__(self)
33
 
        
34
 
        label = gtk.Label(prompt)
35
 
        self.vbox.pack_start(label, padding=10)
36
 
        
37
 
        self.vbox.show_all()
38
 
 
39
 
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, 
40
 
                         gtk.RESPONSE_NO)
41
 
 
42
 
 
43
 
class GtkProgressBar(gtk.ProgressBar,progress._BaseProgressBar):
44
 
    def __init__(self, _stack=None):
45
 
        gtk.ProgressBar.__init__(self)
 
31
        super(PromptDialog, self).__init__()
 
32
 
 
33
        label = Gtk.Label(label=prompt)
 
34
        self.get_content_area().pack_start(label, True, True, 10)
 
35
        self.get_content_area().show_all()
 
36
 
 
37
        self.add_buttons(Gtk.STOCK_YES, Gtk.ResponseType.YES, Gtk.STOCK_NO,
 
38
                         Gtk.ResponseType.NO)
 
39
 
 
40
 
 
41
class GtkProgressBar(Gtk.ProgressBar):
 
42
 
 
43
    def __init__(self):
 
44
        super(GtkProgressBar, self).__init__()
46
45
        self.set_fraction(0.0)
47
 
        progress._BaseProgressBar.__init__(self, _stack=_stack)
48
46
        self.current = None
49
47
        self.total = None
50
48
 
51
 
    def clear(self):
52
 
        self.hide()
53
 
 
54
49
    def tick(self):
 
50
        self.show()
55
51
        self.pulse()
56
52
 
57
 
    def child_update(self, message, current, total):
58
 
        pass
59
 
 
60
53
    def update(self, msg=None, current_cnt=None, total_cnt=None):
 
54
        self.show()
61
55
        if current_cnt is not None:
62
56
            self.current = current_cnt
63
57
        if total_cnt is not None:
69
63
            if self.fraction < 0.0 or self.fraction > 1.0:
70
64
                raise AssertionError
71
65
            self.set_fraction(self.fraction)
72
 
        while gtk.events_pending():
73
 
            gtk.main_iteration()
74
 
 
75
 
 
76
 
class ProgressBarWindow(gtk.Window):
77
 
    def __init__(self, to_file=None, show_pct=None, show_spinner=None, show_eta=None, 
78
 
                 show_bar=None, show_count=None, to_messages_file=None, _stack=None):
79
 
        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
80
 
        self._stack = _stack
 
66
        while Gtk.events_pending():
 
67
            Gtk.main_iteration()
 
68
 
 
69
    def finished(self):
 
70
        self.hide()
 
71
 
 
72
    def clear(self):
 
73
        self.hide()
 
74
 
 
75
 
 
76
class ProgressBarWindow(Gtk.Window):
 
77
 
 
78
    def __init__(self):
 
79
        super(ProgressBarWindow, self).__init__(type=Gtk.WindowType.TOPLEVEL)
81
80
        self.set_border_width(0)
82
81
        self.set_title("Progress")
83
 
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
84
 
        self.pb = GtkProgressBar(self)
 
82
        self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
 
83
        self.pb = GtkProgressBar()
85
84
        self.add(self.pb)
86
85
        self.resize(250, 15)
87
86
        self.set_resizable(False)
 
87
 
 
88
    def tick(self, *args, **kwargs):
88
89
        self.show_all()
 
90
        self.pb.tick(*args, **kwargs)
89
91
 
90
 
    def return_pb(self, pb):
91
 
        self._stack.return_pb(self)
92
 
    
93
92
    def update(self, *args, **kwargs):
 
93
        self.show_all()
94
94
        self.pb.update(*args, **kwargs)
95
95
 
96
 
    def tick(self, *args, **kwargs):
97
 
        self.pb.tick(*args, **kwargs)
98
 
 
99
96
    def finished(self):
100
97
        self.pb.finished()
101
 
        self.hide_all()
102
 
 
103
 
    def clear(self):
104
 
        self.pb.clear()
 
98
        self.hide()
105
99
        self.destroy()
106
100
 
107
 
    def child_progress(self, *args, **kwargs):
108
 
        return self.pb.child_progress(*args, **kwargs)
109
 
 
110
 
    def child_update(self, *args, **kwargs):
111
 
        return self.pb.child_update(*args, **kwargs)
112
 
 
113
 
    def get_progress_bar(self):
114
 
        self.show_all()
115
 
        return self
116
 
 
117
 
 
118
 
class ProgressPanel(gtk.HBox):
 
101
    def clear(self):
 
102
        self.pb.clear()
 
103
        self.hide()
 
104
 
 
105
 
 
106
class ProgressPanel(Gtk.HBox):
 
107
 
119
108
    def __init__(self):
120
109
        super(ProgressPanel, self).__init__()
121
 
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
122
 
                                                 gtk.ICON_SIZE_BUTTON)
 
110
        image_loading = Gtk.Image.new_from_stock(Gtk.STOCK_REFRESH,
 
111
                                                 Gtk.IconSize.BUTTON)
123
112
        image_loading.show()
124
 
        
125
 
        self.pb = GtkProgressBar(self)
 
113
 
 
114
        self.pb = GtkProgressBar()
126
115
        self.set_spacing(5)
127
 
        self.set_border_width(5)        
128
 
        self.pack_start(image_loading, False, False)
129
 
        self.pack_start(self.pb, True, True)
130
 
 
131
 
    def return_pb(self, pb):
132
 
        self._stack.return_pb(self)
133
 
 
134
 
    def get_progress_bar(self, to_file=None, show_pct=None, show_spinner=None, show_eta=None, 
135
 
                         show_bar=None, show_count=None, to_messages_file=None, 
136
 
                         _stack=None):
137
 
        self._stack = _stack
138
 
        self.show_all()
139
 
        return self
 
116
        self.set_border_width(5)
 
117
        self.pack_start(image_loading, False, False, 0)
 
118
        self.pack_start(self.pb, True, True, 0)
140
119
 
141
120
    def tick(self, *args, **kwargs):
 
121
        self.show_all()
142
122
        self.pb.tick(*args, **kwargs)
143
 
    
 
123
 
144
124
    def update(self, *args, **kwargs):
 
125
        self.show_all()
145
126
        self.pb.update(*args, **kwargs)
146
127
 
147
128
    def finished(self):
148
129
        self.pb.finished()
149
 
        self.hide_all()
 
130
        self.hide()
150
131
 
151
132
    def clear(self):
152
133
        self.pb.clear()
153
 
        self.hide_all()
154
 
 
155
 
    def child_progress(self, *args, **kwargs):
156
 
        return self.pb.child_progress(*args, **kwargs)
157
 
 
158
 
    def child_update(self, *args, **kwargs):
159
 
        return self.pb.child_update(*args, **kwargs)
160
 
 
161
 
 
162
 
 
163
 
class PasswordDialog(gtk.Dialog):
 
134
        self.hide()
 
135
 
 
136
 
 
137
class PasswordDialog(Gtk.Dialog):
164
138
    """ Prompt the user for a password. """
 
139
 
165
140
    def __init__(self, prompt):
166
 
        gtk.Dialog.__init__(self)
167
 
        
168
 
        label = gtk.Label(prompt)
169
 
        self.vbox.pack_start(label, padding=10)
170
 
        
171
 
        self.entry = gtk.Entry()
 
141
        super(PasswordDialog, self).__init__()
 
142
 
 
143
        label = Gtk.Label(label=prompt)
 
144
        self.get_content_area().pack_start(label, True, True, 10)
 
145
 
 
146
        self.entry = Gtk.Entry()
172
147
        self.entry.set_visibility(False)
173
 
        self.vbox.pack_end(self.entry, padding=10)
174
 
        
175
 
        self.vbox.show_all()
176
 
        
177
 
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
178
 
    
 
148
        self.get_content_area().pack_end(self.entry, False, False, 10)
 
149
 
 
150
        self.get_content_area().show_all()
 
151
 
 
152
        self.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.OK,
 
153
                         Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
 
154
 
179
155
    def _get_passwd(self):
180
156
        return self.entry.get_text()
181
157
 
185
161
class GtkUIFactory(UIFactory):
186
162
    """A UI factory for GTK user interfaces."""
187
163
 
188
 
    def __init__(self,
189
 
                 stdout=None,
190
 
                 stderr=None):
191
 
        """Create a GtkUIFactory.
192
 
 
193
 
        """
 
164
    def __init__(self):
 
165
        """Create a GtkUIFactory"""
194
166
        super(GtkUIFactory, self).__init__()
195
 
        self.set_nested_progress_bar_widget(ProgressBarWindow)
 
167
        self.set_progress_bar_widget(None)
 
168
 
 
169
    def set_progress_bar_widget(self, widget):
 
170
        self._progress_bar_widget = widget
196
171
 
197
172
    def get_boolean(self, prompt):
198
173
        """GtkDialog with yes/no answers"""
199
174
        dialog = PromptDialog(prompt)
200
175
        response = dialog.run()
201
176
        dialog.destroy()
202
 
        return (response == gtk.RESPONSE_YES)
203
 
        
 
177
        return (response == Gtk.ResponseType.YES)
 
178
 
204
179
    def get_password(self, prompt='', **kwargs):
205
180
        """Prompt the user for a password.
206
181
 
215
190
        response = dialog.run()
216
191
        passwd = dialog.passwd
217
192
        dialog.destroy()
218
 
        if response == gtk.RESPONSE_OK:
 
193
        if response == Gtk.ResponseType.OK:
219
194
            return passwd
220
195
        else:
221
196
            return None
222
197
 
223
 
    def set_nested_progress_bar_widget(self, widget):
224
 
        self._progress_bar_stack = progress.ProgressBarStack(klass=widget)
225
 
 
226
 
    def nested_progress_bar(self):
227
 
        """Return a nested progress bar.
228
 
        """
229
 
        return self._progress_bar_stack.get_nested()
230
 
 
231
 
    def set_progress_bar_vbox(self, vbox):
232
 
        """Change the vbox to put progress bars in.
233
 
        """
234
 
        self._progress_bar_stack = vbox
235
 
 
236
 
    def clear_term(self):
237
 
        """Prepare the terminal for output.
238
 
 
239
 
        It has no sense when talking about GTK."""
240
 
        pass
 
198
    def _progress_all_finished(self):
 
199
        """See UIFactory._progress_all_finished"""
 
200
        pbw = self._progress_bar_widget
 
201
        if pbw:
 
202
            pbw.finished()
 
203
 
 
204
    def _progress_updated(self, task):
 
205
        """See UIFactory._progress_updated"""
 
206
        if self._progress_bar_widget is None:
 
207
            # Default to a window since nobody gave us a better mean to report
 
208
            # progress.
 
209
            self.set_progress_bar_widget(ProgressBarWindow())
 
210
        self._progress_bar_widget.update(task.msg,
 
211
                                         task.current_cnt, task.total_cnt)
 
212