/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):
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):
89
        self.pb.tick(*args, **kwargs)
90
91
    def update(self, *args, **kwargs):
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
92
        self.show_all()
523.2.1 by Jelmer Vernooij
Fix Window-based progress indication.
93
        self.pb.update(*args, **kwargs)
94
95
    def finished(self):
96
        self.hide_all()
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
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()
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
100
        # FIXME: destroy() ? Really ? -- vila 20090610
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
101
        self.destroy()
102
103
104
class ProgressPanel(gtk.HBox):
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
105
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
106
    def __init__(self):
107
        super(ProgressPanel, self).__init__()
108
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
109
                                                 gtk.ICON_SIZE_BUTTON)
110
        image_loading.show()
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
111
112
        self.pb = GtkProgressBar()
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
113
        self.set_spacing(5)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
114
        self.set_border_width(5)
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
115
        self.pack_start(image_loading, False, False)
116
        self.pack_start(self.pb, True, True)
117
562.1.4 by Jelmer Vernooij
Implement tick in ProgressPanel.
118
    def tick(self, *args, **kwargs):
119
        self.pb.tick(*args, **kwargs)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
120
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
121
    def update(self, *args, **kwargs):
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
122
        self.show_all()
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
123
        self.pb.update(*args, **kwargs)
124
125
    def finished(self):
126
        self.pb.finished()
127
        self.hide_all()
128
129
    def clear(self):
130
        self.pb.clear()
131
        self.hide_all()
132
174 by Jelmer Vernooij
Implement simple GTK+ progress bars.
133
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
134
class PasswordDialog(gtk.Dialog):
135
    """ Prompt the user for a password. """
136
    def __init__(self, prompt):
137
        gtk.Dialog.__init__(self)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
138
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
139
        label = gtk.Label(prompt)
140
        self.vbox.pack_start(label, padding=10)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
141
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
142
        self.entry = gtk.Entry()
143
        self.entry.set_visibility(False)
144
        self.vbox.pack_end(self.entry, 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.vbox.show_all()
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
147
148
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK,
149
                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
150
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
151
    def _get_passwd(self):
152
        return self.entry.get_text()
153
154
    passwd = property(_get_passwd)
155
156
157
class GtkUIFactory(UIFactory):
0.13.12 by Jelmer Vernooij
Bunch of other small updates, add more items to
158
    """A UI factory for GTK user interfaces."""
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
159
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
160
    def __init__(self):
161
        """Create a GtkUIFactory"""
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
162
        super(GtkUIFactory, self).__init__()
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
163
        # FIXME: The following seems to be there to provide a default for cases
164
        # where set_progress_bar_widget() is not called explicitely. It will be
165
        # better to call it explicitely and get rid of that default. (I'm not
166
        # even sure it really needed now :-/ -- vila 20090610.
167
        self.set_progress_bar_widget(ProgressBarWindow())
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
168
169
    def get_boolean(self, prompt):
170
        """GtkDialog with yes/no answers"""
171
        dialog = PromptDialog(prompt)
172
        response = dialog.run()
173
        dialog.destroy()
0.13.7 by Jelmer Vernooij
Bunch of random cleanups
174
        return (response == gtk.RESPONSE_YES)
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
175
0.8.11 by Szilveszter Farkas (Phanatic)
2006-07-16 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
176
    def get_password(self, prompt='', **kwargs):
177
        """Prompt the user for a password.
178
179
        :param prompt: The prompt to present the user
180
        :param kwargs: Arguments which will be expanded into the prompt.
181
                       This lets front ends display different things if
182
                       they so choose.
183
        :return: The password string, return None if the user 
184
                 canceled the request.
185
        """
186
        dialog = PasswordDialog(prompt % kwargs)
187
        response = dialog.run()
188
        passwd = dialog.passwd
189
        dialog.destroy()
190
        if response == gtk.RESPONSE_OK:
191
            return passwd
192
        else:
193
            return None
194
645.1.1 by Vincent Ladeuil
Fix #385191 by using the new progress reporting API.
195
    def _progress_all_finished(self):
196
        """See UIFactory._progress_all_finished"""
197
        pbw = self._progress_bar_widget
198
        if pbw:
199
            pbw.finished()
200
201
    def _progress_updated(self, task):
202
        """See UIFactory._progress_updated"""
203
        pbw = self._progress_bar_widget
204
        if pbw:
205
            pbw.update(task.msg, task.current_cnt, task.total_cnt)
206
207
    def set_progress_bar_widget(self, widget):
208
        self._progress_bar_widget = widget
209