/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
1
# Copyright (C) 2006 Szilveszter Farkas <szilveszter.farkas@gmail.com>
225 by Jelmer Vernooij
Add docstrings, remove unused code.
2
# Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
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
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
25
from bzrlib import progress
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
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
225 by Jelmer Vernooij
Add docstrings, remove unused code.
39
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, 
40
                         gtk.RESPONSE_NO)
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
41
42
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
43
class GtkProgressBar(gtk.ProgressBar,progress._BaseProgressBar):
44
    def __init__(self, _stack=None):
45
        gtk.ProgressBar.__init__(self)
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
46
        self.set_fraction(0.0)
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
47
        progress._BaseProgressBar.__init__(self, _stack=_stack)
475.2.1 by Chad MILLER
Make "vizualize" use the GUI progress bar defined in the parent 'ui' module.
48
        self.current = None
49
        self.total = None
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
50
51
    def clear(self):
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
52
        self.hide()
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
53
54
    def tick(self):
55
        self.pulse()
56
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
57
    def child_update(self, message, current, total):
58
        pass
59
60
    def update(self, msg=None, current_cnt=None, total_cnt=None):
533.10.1 by Jelmer Vernooij
Consider 0 a valid value for progress bars.
61
        if current_cnt is not None:
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
62
            self.current = current_cnt
533.10.1 by Jelmer Vernooij
Consider 0 a valid value for progress bars.
63
        if total_cnt is not None:
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
64
            self.total = total_cnt
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
65
        if msg is not None:
66
            self.set_text(msg)
475.2.1 by Chad MILLER
Make "vizualize" use the GUI progress bar defined in the parent 'ui' module.
67
        if None not in (self.current, self.total):
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
68
            self.fraction = float(self.current) / self.total
533.10.1 by Jelmer Vernooij
Consider 0 a valid value for progress bars.
69
            if self.fraction < 0.0 or self.fraction > 1.0:
70
                raise AssertionError
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
71
            self.set_fraction(self.fraction)
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
72
        while gtk.events_pending():
73
            gtk.main_iteration()
74
75
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
76
class ProgressBarWindow(gtk.Window):
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
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):
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
79
        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
80
        self._stack = _stack
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
81
        self.set_border_width(0)
82
        self.set_title("Progress")
83
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
84
        self.pb = GtkProgressBar(self)
85
        self.add(self.pb)
86
        self.resize(250, 15)
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
87
        self.set_resizable(False)
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
88
        self.show_all()
89
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
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
575 by Jelmer Vernooij
Add ProgressBarWindow.tick().
96
    def tick(self, *args, **kwargs):
97
        self.pb.tick(*args, **kwargs)
98
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
99
    def finished(self):
100
        self.pb.finished()
101
        self.hide_all()
102
 
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
103
    def clear(self):
104
        self.pb.clear()
105
        self.destroy()
106
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
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
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
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
562.1.4 by Jelmer Vernooij
Implement tick in ProgressPanel.
140
141
    def tick(self, *args, **kwargs):
142
        self.pb.tick(*args, **kwargs)
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
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
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
161
162
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
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):
0.13.12 by Jelmer Vernooij
Bunch of other small updates, add more items to
186
    """A UI factory for GTK user interfaces."""
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
187
188
    def __init__(self,
189
                 stdout=None,
190
                 stderr=None):
191
        """Create a GtkUIFactory.
192
193
        """
194
        super(GtkUIFactory, self).__init__()
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
195
        self.set_nested_progress_bar_widget(ProgressBarWindow)
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
196
197
    def get_boolean(self, prompt):
198
        """GtkDialog with yes/no answers"""
199
        dialog = PromptDialog(prompt)
200
        response = dialog.run()
201
        dialog.destroy()
0.13.7 by Jelmer Vernooij
Bunch of random cleanups
202
        return (response == gtk.RESPONSE_YES)
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
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
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
223
    def set_nested_progress_bar_widget(self, widget):
224
        self._progress_bar_stack = progress.ProgressBarStack(klass=widget)
225
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
226
    def nested_progress_bar(self):
227
        """Return a nested progress bar.
228
        """
229
        return self._progress_bar_stack.get_nested()
230
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
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
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
236
    def clear_term(self):
237
        """Prepare the terminal for output.
238
239
        It has no sense when talking about GTK."""
240
        pass