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