/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
24
from bzrlib.ui import UIFactory
25
26
27
class PromptDialog(gtk.Dialog):
724 by Jelmer Vernooij
Fix formatting, imports.
28
    """Prompt the user for a yes/no answer."""
29
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
30
    def __init__(self, prompt):
31
        gtk.Dialog.__init__(self)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
32
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
33
        label = gtk.Label(prompt)
34
        self.vbox.pack_start(label, padding=10)
35
        self.vbox.show_all()
36
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
37
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO,
225 by Jelmer Vernooij
Add docstrings, remove unused code.
38
                         gtk.RESPONSE_NO)
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
39
40
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
41
class GtkProgressBar(gtk.ProgressBar):
42
43
    def __init__(self):
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
44
        gtk.ProgressBar.__init__(self)
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
45
        self.set_fraction(0.0)
475.2.1 by Chad MILLER
Make "vizualize" use the GUI progress bar defined in the parent 'ui' module.
46
        self.current = None
47
        self.total = None
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
48
49
    def tick(self):
645.1.2 by Vincent Ladeuil
Address Jelmer's review.
50
        self.show()
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
51
        self.pulse()
52
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
53
    def update(self, msg=None, current_cnt=None, total_cnt=None):
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
54
        self.show()
533.10.1 by Jelmer Vernooij
Consider 0 a valid value for progress bars.
55
        if current_cnt is not None:
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
56
            self.current = current_cnt
533.10.1 by Jelmer Vernooij
Consider 0 a valid value for progress bars.
57
        if total_cnt is not None:
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
58
            self.total = total_cnt
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
59
        if msg is not None:
60
            self.set_text(msg)
475.2.1 by Chad MILLER
Make "vizualize" use the GUI progress bar defined in the parent 'ui' module.
61
        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.
62
            self.fraction = float(self.current) / self.total
533.10.1 by Jelmer Vernooij
Consider 0 a valid value for progress bars.
63
            if self.fraction < 0.0 or self.fraction > 1.0:
64
                raise AssertionError
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
65
            self.set_fraction(self.fraction)
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
66
        while gtk.events_pending():
67
            gtk.main_iteration()
68
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
69
    def finished(self):
70
        self.hide()
71
72
    def clear(self):
73
        self.hide()
74
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
75
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
76
class ProgressBarWindow(gtk.Window):
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
77
78
    def __init__(self):
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)
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
80
        self.set_border_width(0)
81
        self.set_title("Progress")
82
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
83
        self.pb = GtkProgressBar()
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
84
        self.add(self.pb)
85
        self.resize(250, 15)
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
86
        self.set_resizable(False)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
87
88
    def tick(self, *args, **kwargs):
645.1.2 by Vincent Ladeuil
Address Jelmer's review.
89
        self.show_all()
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
90
        self.pb.tick(*args, **kwargs)
91
92
    def update(self, *args, **kwargs):
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
93
        self.show_all()
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
94
        self.pb.update(*args, **kwargs)
95
96
    def finished(self):
645.1.2 by Vincent Ladeuil
Address Jelmer's review.
97
        self.pb.finished()
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
98
        self.hide_all()
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
99
        self.destroy()
100
645.1.2 by Vincent Ladeuil
Address Jelmer's review.
101
    def clear(self):
102
        self.pb.clear()
103
        self.hide_all()
104
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
105
106
class ProgressPanel(gtk.HBox):
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
107
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
108
    def __init__(self):
109
        super(ProgressPanel, self).__init__()
110
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
111
                                                 gtk.ICON_SIZE_BUTTON)
112
        image_loading.show()
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
113
114
        self.pb = GtkProgressBar()
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
115
        self.set_spacing(5)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
116
        self.set_border_width(5)
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
117
        self.pack_start(image_loading, False, False)
118
        self.pack_start(self.pb, True, True)
119
562.1.4 by Jelmer Vernooij
Implement tick in ProgressPanel.
120
    def tick(self, *args, **kwargs):
645.1.2 by Vincent Ladeuil
Address Jelmer's review.
121
        self.show_all()
562.1.4 by Jelmer Vernooij
Implement tick in ProgressPanel.
122
        self.pb.tick(*args, **kwargs)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
123
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
124
    def update(self, *args, **kwargs):
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
125
        self.show_all()
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
126
        self.pb.update(*args, **kwargs)
127
128
    def finished(self):
129
        self.pb.finished()
130
        self.hide_all()
131
132
    def clear(self):
133
        self.pb.clear()
134
        self.hide_all()
135
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
136
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
137
class PasswordDialog(gtk.Dialog):
138
    """ Prompt the user for a password. """
645.1.2 by Vincent Ladeuil
Address Jelmer's review.
139
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
140
    def __init__(self, prompt):
141
        gtk.Dialog.__init__(self)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
142
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
143
        label = gtk.Label(prompt)
144
        self.vbox.pack_start(label, padding=10)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
145
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
146
        self.entry = gtk.Entry()
147
        self.entry.set_visibility(False)
148
        self.vbox.pack_end(self.entry, padding=10)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
149
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
150
        self.vbox.show_all()
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
151
152
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK,
153
                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
154
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
155
    def _get_passwd(self):
156
        return self.entry.get_text()
157
158
    passwd = property(_get_passwd)
159
160
161
class GtkUIFactory(UIFactory):
0.13.12 by Jelmer Vernooij
Bunch of other small updates, add more items to
162
    """A UI factory for GTK user interfaces."""
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
163
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
164
    def __init__(self):
165
        """Create a GtkUIFactory"""
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
166
        super(GtkUIFactory, self).__init__()
645.1.2 by Vincent Ladeuil
Address Jelmer's review.
167
        self.set_progress_bar_widget(None)
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
168
645.1.3 by Vincent Ladeuil
Cleanup.
169
    def set_progress_bar_widget(self, widget):
170
        self._progress_bar_widget = widget
171
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
172
    def get_boolean(self, prompt):
173
        """GtkDialog with yes/no answers"""
174
        dialog = PromptDialog(prompt)
175
        response = dialog.run()
176
        dialog.destroy()
0.13.7 by Jelmer Vernooij
Bunch of random cleanups
177
        return (response == gtk.RESPONSE_YES)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
178
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
179
    def get_password(self, prompt='', **kwargs):
180
        """Prompt the user for a password.
181
182
        :param prompt: The prompt to present the user
183
        :param kwargs: Arguments which will be expanded into the prompt.
184
                       This lets front ends display different things if
185
                       they so choose.
186
        :return: The password string, return None if the user 
187
                 canceled the request.
188
        """
189
        dialog = PasswordDialog(prompt % kwargs)
190
        response = dialog.run()
191
        passwd = dialog.passwd
192
        dialog.destroy()
193
        if response == gtk.RESPONSE_OK:
194
            return passwd
195
        else:
196
            return None
197
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
198
    def _progress_all_finished(self):
199
        """See UIFactory._progress_all_finished"""
200
        pbw = self._progress_bar_widget
201
        if pbw:
202
            pbw.finished()
203
204
    def _progress_updated(self, task):
205
        """See UIFactory._progress_updated"""
645.1.2 by Vincent Ladeuil
Address Jelmer's review.
206
        if self._progress_bar_widget is None:
207
            # Default to a window since nobody gave us a better mean to report
208
            # progress.
209
            self.set_progress_bar_widget(ProgressBarWindow())
210
        self._progress_bar_widget.update(task.msg,
211
                                         task.current_cnt, task.total_cnt)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
212