/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
96
    def finished(self):
97
        self.pb.finished()
98
        self.hide_all()
99
 
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
100
    def clear(self):
101
        self.pb.clear()
102
        self.destroy()
103
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
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
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
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
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
155
156
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
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):
0.13.12 by Jelmer Vernooij
Bunch of other small updates, add more items to
180
    """A UI factory for GTK user interfaces."""
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
181
182
    def __init__(self,
183
                 stdout=None,
184
                 stderr=None):
185
        """Create a GtkUIFactory.
186
187
        """
188
        super(GtkUIFactory, self).__init__()
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
189
        self.set_nested_progress_bar_widget(ProgressBarWindow)
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
190
191
    def get_boolean(self, prompt):
192
        """GtkDialog with yes/no answers"""
193
        dialog = PromptDialog(prompt)
194
        response = dialog.run()
195
        dialog.destroy()
0.13.7 by Jelmer Vernooij
Bunch of random cleanups
196
        return (response == gtk.RESPONSE_YES)
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
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
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
217
    def set_nested_progress_bar_widget(self, widget):
218
        self._progress_bar_stack = progress.ProgressBarStack(klass=widget)
219
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
220
    def nested_progress_bar(self):
221
        """Return a nested progress bar.
222
        """
223
        return self._progress_bar_stack.get_nested()
224
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
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
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
230
    def clear_term(self):
231
        """Prepare the terminal for output.
232
233
        It has no sense when talking about GTK."""
234
        pass