/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-18 20:12:54 UTC
  • mto: This revision was merged to the branch mainline in revision 555.
  • Revision ID: jelmer@samba.org-20080718201254-phkice8vdvr2svvm
Fix license path finding.

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 finished(self):
 
97
        self.pb.finished()
 
98
        self.hide_all()
 
99
 
 
100
    def clear(self):
 
101
        self.pb.clear()
 
102
        self.destroy()
 
103
 
 
104
    def child_progress(self, *args, **kwargs):
 
105
        return self.pb.child_progress(*args, **kwargs)
 
106
 
 
107
    def child_update(self, *args, **kwargs):
 
108
        return self.pb.child_update(*args, **kwargs)
 
109
 
 
110
    def get_progress_bar(self):
 
111
        self.show_all()
 
112
        return self
 
113
 
 
114
 
 
115
class ProgressPanel(gtk.HBox):
 
116
    def __init__(self):
 
117
        super(ProgressPanel, self).__init__()
 
118
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
 
119
                                                 gtk.ICON_SIZE_BUTTON)
 
120
        image_loading.show()
 
121
        
 
122
        self.pb = GtkProgressBar(self)
 
123
        self.set_spacing(5)
 
124
        self.set_border_width(5)        
 
125
        self.pack_start(image_loading, False, False)
 
126
        self.pack_start(self.pb, True, True)
 
127
 
 
128
    def return_pb(self, pb):
 
129
        self._stack.return_pb(self)
 
130
 
 
131
    def get_progress_bar(self, to_file=None, show_pct=None, show_spinner=None, show_eta=None, 
 
132
                         show_bar=None, show_count=None, to_messages_file=None, 
 
133
                         _stack=None):
 
134
        self._stack = _stack
 
135
        self.show_all()
 
136
        return self
 
137
    
 
138
    def update(self, *args, **kwargs):
 
139
        self.pb.update(*args, **kwargs)
 
140
 
 
141
    def finished(self):
 
142
        self.pb.finished()
 
143
        self.hide_all()
 
144
 
 
145
    def clear(self):
 
146
        self.pb.clear()
 
147
        self.hide_all()
 
148
 
 
149
    def child_progress(self, *args, **kwargs):
 
150
        return self.pb.child_progress(*args, **kwargs)
 
151
 
 
152
    def child_update(self, *args, **kwargs):
 
153
        return self.pb.child_update(*args, **kwargs)
 
154
 
 
155
 
 
156
 
 
157
class PasswordDialog(gtk.Dialog):
 
158
    """ Prompt the user for a password. """
 
159
    def __init__(self, prompt):
 
160
        gtk.Dialog.__init__(self)
 
161
        
 
162
        label = gtk.Label(prompt)
 
163
        self.vbox.pack_start(label, padding=10)
 
164
        
 
165
        self.entry = gtk.Entry()
 
166
        self.entry.set_visibility(False)
 
167
        self.vbox.pack_end(self.entry, padding=10)
 
168
        
 
169
        self.vbox.show_all()
 
170
        
 
171
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
172
    
 
173
    def _get_passwd(self):
 
174
        return self.entry.get_text()
 
175
 
 
176
    passwd = property(_get_passwd)
 
177
 
 
178
 
 
179
class GtkUIFactory(UIFactory):
 
180
    """A UI factory for GTK user interfaces."""
 
181
 
 
182
    def __init__(self,
 
183
                 stdout=None,
 
184
                 stderr=None):
 
185
        """Create a GtkUIFactory.
 
186
 
 
187
        """
 
188
        super(GtkUIFactory, self).__init__()
 
189
        self.set_nested_progress_bar_widget(ProgressBarWindow)
 
190
 
 
191
    def get_boolean(self, prompt):
 
192
        """GtkDialog with yes/no answers"""
 
193
        dialog = PromptDialog(prompt)
 
194
        response = dialog.run()
 
195
        dialog.destroy()
 
196
        return (response == gtk.RESPONSE_YES)
 
197
        
 
198
    def get_password(self, prompt='', **kwargs):
 
199
        """Prompt the user for a password.
 
200
 
 
201
        :param prompt: The prompt to present the user
 
202
        :param kwargs: Arguments which will be expanded into the prompt.
 
203
                       This lets front ends display different things if
 
204
                       they so choose.
 
205
        :return: The password string, return None if the user 
 
206
                 canceled the request.
 
207
        """
 
208
        dialog = PasswordDialog(prompt % kwargs)
 
209
        response = dialog.run()
 
210
        passwd = dialog.passwd
 
211
        dialog.destroy()
 
212
        if response == gtk.RESPONSE_OK:
 
213
            return passwd
 
214
        else:
 
215
            return None
 
216
 
 
217
    def set_nested_progress_bar_widget(self, widget):
 
218
        self._progress_bar_stack = progress.ProgressBarStack(klass=widget)
 
219
 
 
220
    def nested_progress_bar(self):
 
221
        """Return a nested progress bar.
 
222
        """
 
223
        return self._progress_bar_stack.get_nested()
 
224
 
 
225
    def set_progress_bar_vbox(self, vbox):
 
226
        """Change the vbox to put progress bars in.
 
227
        """
 
228
        self._progress_bar_stack = vbox
 
229
 
 
230
    def clear_term(self):
 
231
        """Prepare the terminal for output.
 
232
 
 
233
        It has no sense when talking about GTK."""
 
234
        pass