/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: Scott James Remnant
  • Date: 2005-10-17 01:07:49 UTC
  • Revision ID: scott@netsplit.com-20051017010749-15fa95fc2cf09289
Commit the first version of bzrk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 Szilveszter Farkas <szilveszter.farkas@gmail.com>
2
 
# Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
3
 
 
4
 
# This program is free software; you can redistribute it and/or modify
5
 
# it under the terms of the GNU General Public License as published by
6
 
# the Free Software Foundation; either version 2 of the License, or
7
 
# (at your option) any later version.
8
 
 
9
 
# This program is distributed in the hope that it will be useful,
10
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
# GNU General Public License for more details.
13
 
 
14
 
# You should have received a copy of the GNU General Public License
15
 
# along with this program; if not, write to the Free Software
16
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
 
 
18
 
 
19
 
"""GTK UI
20
 
"""
21
 
 
22
 
import gtk
23
 
import sys
24
 
 
25
 
from bzrlib import progress
26
 
from bzrlib.ui import UIFactory
27
 
 
28
 
 
29
 
class PromptDialog(gtk.Dialog):
30
 
    """ Prompt the user for a yes/no answer. """
31
 
    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)
46
 
        self.set_fraction(0.0)
47
 
        progress._BaseProgressBar.__init__(self, _stack=_stack)
48
 
        self.current = None
49
 
        self.total = None
50
 
 
51
 
    def clear(self):
52
 
        self.hide()
53
 
 
54
 
    def tick(self):
55
 
        self.pulse()
56
 
 
57
 
    def child_update(self, message, current, total):
58
 
        pass
59
 
 
60
 
    def update(self, msg=None, current_cnt=None, total_cnt=None):
61
 
        if current_cnt is not None:
62
 
            self.current = current_cnt
63
 
        if total_cnt is not None:
64
 
            self.total = total_cnt
65
 
        if msg is not None:
66
 
            self.set_text(msg)
67
 
        if None not in (self.current, self.total):
68
 
            self.fraction = float(self.current) / self.total
69
 
            if self.fraction < 0.0 or self.fraction > 1.0:
70
 
                raise AssertionError
71
 
            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
81
 
        self.set_border_width(0)
82
 
        self.set_title("Progress")
83
 
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
84
 
        self.pb = GtkProgressBar(self)
85
 
        self.add(self.pb)
86
 
        self.resize(250, 15)
87
 
        self.set_resizable(False)
88
 
        self.show_all()
89
 
 
90
 
    def return_pb(self, pb):
91
 
        self._stack.return_pb(self)
92
 
    
93
 
    def update(self, *args, **kwargs):
94
 
        self.pb.update(*args, **kwargs)
95
 
 
96
 
    def tick(self, *args, **kwargs):
97
 
        self.pb.tick(*args, **kwargs)
98
 
 
99
 
    def finished(self):
100
 
        self.pb.finished()
101
 
        self.hide_all()
102
 
 
103
 
    def clear(self):
104
 
        self.pb.clear()
105
 
        self.destroy()
106
 
 
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):
119
 
    def __init__(self):
120
 
        super(ProgressPanel, self).__init__()
121
 
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
122
 
                                                 gtk.ICON_SIZE_BUTTON)
123
 
        image_loading.show()
124
 
        
125
 
        self.pb = GtkProgressBar(self)
126
 
        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
140
 
 
141
 
    def tick(self, *args, **kwargs):
142
 
        self.pb.tick(*args, **kwargs)
143
 
    
144
 
    def update(self, *args, **kwargs):
145
 
        self.pb.update(*args, **kwargs)
146
 
 
147
 
    def finished(self):
148
 
        self.pb.finished()
149
 
        self.hide_all()
150
 
 
151
 
    def clear(self):
152
 
        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):
164
 
    """ Prompt the user for a password. """
165
 
    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()
172
 
        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
 
    
179
 
    def _get_passwd(self):
180
 
        return self.entry.get_text()
181
 
 
182
 
    passwd = property(_get_passwd)
183
 
 
184
 
 
185
 
class GtkUIFactory(UIFactory):
186
 
    """A UI factory for GTK user interfaces."""
187
 
 
188
 
    def __init__(self,
189
 
                 stdout=None,
190
 
                 stderr=None):
191
 
        """Create a GtkUIFactory.
192
 
 
193
 
        """
194
 
        super(GtkUIFactory, self).__init__()
195
 
        self.set_nested_progress_bar_widget(ProgressBarWindow)
196
 
 
197
 
    def get_boolean(self, prompt):
198
 
        """GtkDialog with yes/no answers"""
199
 
        dialog = PromptDialog(prompt)
200
 
        response = dialog.run()
201
 
        dialog.destroy()
202
 
        return (response == gtk.RESPONSE_YES)
203
 
        
204
 
    def get_password(self, prompt='', **kwargs):
205
 
        """Prompt the user for a password.
206
 
 
207
 
        :param prompt: The prompt to present the user
208
 
        :param kwargs: Arguments which will be expanded into the prompt.
209
 
                       This lets front ends display different things if
210
 
                       they so choose.
211
 
        :return: The password string, return None if the user 
212
 
                 canceled the request.
213
 
        """
214
 
        dialog = PasswordDialog(prompt % kwargs)
215
 
        response = dialog.run()
216
 
        passwd = dialog.passwd
217
 
        dialog.destroy()
218
 
        if response == gtk.RESPONSE_OK:
219
 
            return passwd
220
 
        else:
221
 
            return None
222
 
 
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