/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: Jasper Groenewegen
  • Date: 2008-07-27 12:01:40 UTC
  • mfrom: (576.3.2 improve-merge)
  • mto: This revision was merged to the branch mainline in revision 579.
  • Revision ID: colbrac@xs4all.nl-20080727120140-1agdlzkc9fumjk5f
Merge merge dialog improvements

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