/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-07-17 11:51:03 UTC
  • Revision ID: jelmer@samba.org-20080717115103-djh5sb0pvpse2zkb
Add note about glade.

Show diffs side-by-side

added added

removed removed

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