/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-11-29 10:06:50 UTC
  • Revision ID: jelmer@samba.org-20111129100650-9oit3f44pxre4uq8
Credit Curtis.

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):
61
 
        if current_cnt:
 
54
        self.show()
 
55
        if current_cnt is not None:
62
56
            self.current = current_cnt
63
 
        if total_cnt:
 
57
        if total_cnt is not None:
64
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
62
            self.fraction = float(self.current) / self.total
 
63
            if self.fraction < 0.0 or self.fraction > 1.0:
 
64
                raise AssertionError
69
65
            self.set_fraction(self.fraction)
70
 
        while gtk.events_pending():
71
 
            gtk.main_iteration()
72
 
 
73
 
 
74
 
class ProgressBarWindow(gtk.Window):
 
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
 
75
78
    def __init__(self):
76
 
        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
 
79
        super(ProgressBarWindow, self).__init__(type=Gtk.WindowType.TOPLEVEL)
77
80
        self.set_border_width(0)
78
81
        self.set_title("Progress")
79
 
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
80
 
        self.pb = GtkProgressBar(self)
 
82
        self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
 
83
        self.pb = GtkProgressBar()
81
84
        self.add(self.pb)
82
85
        self.resize(250, 15)
83
86
        self.set_resizable(False)
84
 
        self.show_all()
85
 
 
86
 
    def clear(self):
87
 
        self.pb.clear()
 
87
 
 
88
    def tick(self, *args, **kwargs):
 
89
        self.show_all()
 
90
        self.pb.tick(*args, **kwargs)
 
91
 
 
92
    def update(self, *args, **kwargs):
 
93
        self.show_all()
 
94
        self.pb.update(*args, **kwargs)
 
95
 
 
96
    def finished(self):
 
97
        self.pb.finished()
 
98
        self.hide()
88
99
        self.destroy()
89
100
 
90
 
 
91
 
class ProgressPanel(gtk.HBox):
 
101
    def clear(self):
 
102
        self.pb.clear()
 
103
        self.hide()
 
104
 
 
105
 
 
106
class ProgressPanel(Gtk.HBox):
 
107
 
92
108
    def __init__(self):
93
109
        super(ProgressPanel, self).__init__()
94
 
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
95
 
                                                 gtk.ICON_SIZE_BUTTON)
 
110
        image_loading = Gtk.Image.new_from_stock(Gtk.STOCK_REFRESH,
 
111
                                                 Gtk.IconSize.BUTTON)
96
112
        image_loading.show()
97
 
        
98
 
        self.pb = GtkProgressBar(self)
 
113
 
 
114
        self.pb = GtkProgressBar()
99
115
        self.set_spacing(5)
100
 
        self.set_border_width(5)        
101
 
        self.pack_start(image_loading, False, False)
102
 
        self.pack_start(self.pb, True, True)
103
 
 
104
 
    def return_pb(self, pb):
105
 
        self._stack.return_pb(self)
106
 
 
107
 
    def get_progress_bar(self, to_file=None, show_pct=None, show_spinner=None, show_eta=None, 
108
 
                         show_bar=None, show_count=None, to_messages_file=None, 
109
 
                         _stack=None):
110
 
        self._stack = _stack
 
116
        self.set_border_width(5)
 
117
        self.pack_start(image_loading, False, False, 0)
 
118
        self.pack_start(self.pb, True, True, 0)
 
119
 
 
120
    def tick(self, *args, **kwargs):
111
121
        self.show_all()
112
 
        return self
113
 
    
 
122
        self.pb.tick(*args, **kwargs)
 
123
 
114
124
    def update(self, *args, **kwargs):
 
125
        self.show_all()
115
126
        self.pb.update(*args, **kwargs)
116
127
 
117
128
    def finished(self):
118
129
        self.pb.finished()
119
 
        self.hide_all()
 
130
        self.hide()
120
131
 
121
132
    def clear(self):
122
133
        self.pb.clear()
123
 
        self.hide_all()
124
 
 
125
 
    def child_progress(self, *args, **kwargs):
126
 
        return self.pb.child_progress(*args, **kwargs)
127
 
 
128
 
    def child_update(self, *args, **kwargs):
129
 
        return self.pb.child_update(*args, **kwargs)
130
 
 
131
 
 
132
 
 
133
 
class PasswordDialog(gtk.Dialog):
 
134
        self.hide()
 
135
 
 
136
 
 
137
class PasswordDialog(Gtk.Dialog):
134
138
    """ Prompt the user for a password. """
 
139
 
135
140
    def __init__(self, prompt):
136
 
        gtk.Dialog.__init__(self)
137
 
        
138
 
        label = gtk.Label(prompt)
139
 
        self.vbox.pack_start(label, padding=10)
140
 
        
141
 
        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()
142
147
        self.entry.set_visibility(False)
143
 
        self.vbox.pack_end(self.entry, padding=10)
144
 
        
145
 
        self.vbox.show_all()
146
 
        
147
 
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
148
 
    
 
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
 
149
155
    def _get_passwd(self):
150
156
        return self.entry.get_text()
151
157
 
155
161
class GtkUIFactory(UIFactory):
156
162
    """A UI factory for GTK user interfaces."""
157
163
 
158
 
    def __init__(self,
159
 
                 stdout=None,
160
 
                 stderr=None):
161
 
        """Create a GtkUIFactory.
162
 
 
163
 
        """
 
164
    def __init__(self):
 
165
        """Create a GtkUIFactory"""
164
166
        super(GtkUIFactory, self).__init__()
165
 
        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
166
171
 
167
172
    def get_boolean(self, prompt):
168
173
        """GtkDialog with yes/no answers"""
169
174
        dialog = PromptDialog(prompt)
170
175
        response = dialog.run()
171
176
        dialog.destroy()
172
 
        return (response == gtk.RESPONSE_YES)
173
 
        
 
177
        return (response == Gtk.ResponseType.YES)
 
178
 
174
179
    def get_password(self, prompt='', **kwargs):
175
180
        """Prompt the user for a password.
176
181
 
185
190
        response = dialog.run()
186
191
        passwd = dialog.passwd
187
192
        dialog.destroy()
188
 
        if response == gtk.RESPONSE_OK:
 
193
        if response == Gtk.ResponseType.OK:
189
194
            return passwd
190
195
        else:
191
196
            return None
192
197
 
193
 
    def set_nested_progress_bar_widget(self, widget):
194
 
        self._progress_bar_stack = progress.ProgressBarStack(klass=widget)
195
 
 
196
 
    def nested_progress_bar(self):
197
 
        """Return a nested progress bar.
198
 
        """
199
 
        return self._progress_bar_stack.get_nested()
200
 
 
201
 
    def set_progress_bar_vbox(self, vbox):
202
 
        """Change the vbox to put progress bars in.
203
 
        """
204
 
        self._progress_bar_stack = vbox
205
 
 
206
 
    def clear_term(self):
207
 
        """Prepare the terminal for output.
208
 
 
209
 
        It has no sense when talking about GTK."""
210
 
        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