/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):
61
        if current_cnt:
62
            self.current = current_cnt
63
        if total_cnt:
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
69
            self.set_fraction(self.fraction)
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
70
        while gtk.events_pending():
71
            gtk.main_iteration()
72
73
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
74
class ProgressBarWindow(gtk.Window):
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
75
    def __init__(self, to_file=None, show_pct=None, show_spinner=None, show_eta=None, 
76
                 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.
77
        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
78
        self._stack = _stack
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
79
        self.set_border_width(0)
80
        self.set_title("Progress")
81
        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.
82
        self.pb = GtkProgressBar(self)
83
        self.add(self.pb)
84
        self.resize(250, 15)
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
85
        self.set_resizable(False)
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
86
        self.show_all()
87
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
88
    def return_pb(self, pb):
89
        self._stack.return_pb(self)
90
    
91
    def update(self, *args, **kwargs):
92
        self.pb.update(*args, **kwargs)
93
94
    def finished(self):
95
        self.pb.finished()
96
        self.hide_all()
97
 
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
98
    def clear(self):
99
        self.pb.clear()
100
        self.destroy()
101
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
102
    def child_progress(self, *args, **kwargs):
103
        return self.pb.child_progress(*args, **kwargs)
104
105
    def child_update(self, *args, **kwargs):
106
        return self.pb.child_update(*args, **kwargs)
107
108
    def get_progress_bar(self):
109
        self.show_all()
110
        return self
111
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
112
113
class ProgressPanel(gtk.HBox):
114
    def __init__(self):
115
        super(ProgressPanel, self).__init__()
116
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
117
                                                 gtk.ICON_SIZE_BUTTON)
118
        image_loading.show()
119
        
120
        self.pb = GtkProgressBar(self)
121
        self.set_spacing(5)
122
        self.set_border_width(5)        
123
        self.pack_start(image_loading, False, False)
124
        self.pack_start(self.pb, True, True)
125
126
    def return_pb(self, pb):
127
        self._stack.return_pb(self)
128
129
    def get_progress_bar(self, to_file=None, show_pct=None, show_spinner=None, show_eta=None, 
130
                         show_bar=None, show_count=None, to_messages_file=None, 
131
                         _stack=None):
132
        self._stack = _stack
133
        self.show_all()
134
        return self
135
    
136
    def update(self, *args, **kwargs):
137
        self.pb.update(*args, **kwargs)
138
139
    def finished(self):
140
        self.pb.finished()
141
        self.hide_all()
142
143
    def clear(self):
144
        self.pb.clear()
145
        self.hide_all()
146
147
    def child_progress(self, *args, **kwargs):
148
        return self.pb.child_progress(*args, **kwargs)
149
150
    def child_update(self, *args, **kwargs):
151
        return self.pb.child_update(*args, **kwargs)
152
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
153
154
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
155
class PasswordDialog(gtk.Dialog):
156
    """ Prompt the user for a password. """
157
    def __init__(self, prompt):
158
        gtk.Dialog.__init__(self)
159
        
160
        label = gtk.Label(prompt)
161
        self.vbox.pack_start(label, padding=10)
162
        
163
        self.entry = gtk.Entry()
164
        self.entry.set_visibility(False)
165
        self.vbox.pack_end(self.entry, padding=10)
166
        
167
        self.vbox.show_all()
168
        
169
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
170
    
171
    def _get_passwd(self):
172
        return self.entry.get_text()
173
174
    passwd = property(_get_passwd)
175
176
177
class GtkUIFactory(UIFactory):
0.13.12 by Jelmer Vernooij
Bunch of other small updates, add more items to
178
    """A UI factory for GTK user interfaces."""
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
179
180
    def __init__(self,
181
                 stdout=None,
182
                 stderr=None):
183
        """Create a GtkUIFactory.
184
185
        """
186
        super(GtkUIFactory, self).__init__()
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
187
        self.set_nested_progress_bar_widget(ProgressBarWindow)
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
188
189
    def get_boolean(self, prompt):
190
        """GtkDialog with yes/no answers"""
191
        dialog = PromptDialog(prompt)
192
        response = dialog.run()
193
        dialog.destroy()
0.13.7 by Jelmer Vernooij
Bunch of random cleanups
194
        return (response == gtk.RESPONSE_YES)
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
195
        
196
    def get_password(self, prompt='', **kwargs):
197
        """Prompt the user for a password.
198
199
        :param prompt: The prompt to present the user
200
        :param kwargs: Arguments which will be expanded into the prompt.
201
                       This lets front ends display different things if
202
                       they so choose.
203
        :return: The password string, return None if the user 
204
                 canceled the request.
205
        """
206
        dialog = PasswordDialog(prompt % kwargs)
207
        response = dialog.run()
208
        passwd = dialog.passwd
209
        dialog.destroy()
210
        if response == gtk.RESPONSE_OK:
211
            return passwd
212
        else:
213
            return None
214
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
215
    def set_nested_progress_bar_widget(self, widget):
216
        self._progress_bar_stack = progress.ProgressBarStack(klass=widget)
217
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
218
    def nested_progress_bar(self):
219
        """Return a nested progress bar.
220
        """
221
        return self._progress_bar_stack.get_nested()
222
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
223
    def set_progress_bar_vbox(self, vbox):
224
        """Change the vbox to put progress bars in.
225
        """
226
        self._progress_bar_stack = vbox
227
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
228
    def clear_term(self):
229
        """Prepare the terminal for output.
230
231
        It has no sense when talking about GTK."""
232
        pass