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