/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to ui.py

  • Committer: Jelmer Vernooij
  • Date: 2006-05-19 16:56:46 UTC
  • mfrom: (0.1.25 gannotate)
  • Revision ID: jelmer@samba.org-20060519165646-0d867938fdbc9097
Merge in Dan Loda's gannotate plugin and put it in annotate/

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 Szilveszter Farkas <szilveszter.farkas@gmail.com>
2
 
# Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
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
 
 
25
 
from bzrlib import progress
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
 
        self.vbox.show_all()
37
 
 
38
 
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO,
39
 
                         gtk.RESPONSE_NO)
40
 
 
41
 
 
42
 
class GtkProgressBar(gtk.ProgressBar):
43
 
 
44
 
    def __init__(self):
45
 
        gtk.ProgressBar.__init__(self)
46
 
        self.set_fraction(0.0)
47
 
        self.current = None
48
 
        self.total = None
49
 
 
50
 
    def tick(self):
51
 
        self.show()
52
 
        self.pulse()
53
 
 
54
 
    def update(self, msg=None, current_cnt=None, total_cnt=None):
55
 
        self.show()
56
 
        if current_cnt is not None:
57
 
            self.current = current_cnt
58
 
        if total_cnt is not None:
59
 
            self.total = total_cnt
60
 
        if msg is not None:
61
 
            self.set_text(msg)
62
 
        if None not in (self.current, self.total):
63
 
            self.fraction = float(self.current) / self.total
64
 
            if self.fraction < 0.0 or self.fraction > 1.0:
65
 
                raise AssertionError
66
 
            self.set_fraction(self.fraction)
67
 
        while gtk.events_pending():
68
 
            gtk.main_iteration()
69
 
 
70
 
    def finished(self):
71
 
        self.hide()
72
 
 
73
 
    def clear(self):
74
 
        self.hide()
75
 
 
76
 
 
77
 
class ProgressBarWindow(gtk.Window):
78
 
 
79
 
    def __init__(self):
80
 
        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
81
 
        self.set_border_width(0)
82
 
        self.set_title("Progress")
83
 
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
84
 
        self.pb = GtkProgressBar()
85
 
        self.add(self.pb)
86
 
        self.resize(250, 15)
87
 
        self.set_resizable(False)
88
 
 
89
 
    def tick(self, *args, **kwargs):
90
 
        self.show_all()
91
 
        self.pb.tick(*args, **kwargs)
92
 
 
93
 
    def update(self, *args, **kwargs):
94
 
        self.show_all()
95
 
        self.pb.update(*args, **kwargs)
96
 
 
97
 
    def finished(self):
98
 
        self.pb.finished()
99
 
        self.hide_all()
100
 
        self.destroy()
101
 
 
102
 
    def clear(self):
103
 
        self.pb.clear()
104
 
        self.hide_all()
105
 
 
106
 
 
107
 
class ProgressPanel(gtk.HBox):
108
 
 
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()
114
 
 
115
 
        self.pb = GtkProgressBar()
116
 
        self.set_spacing(5)
117
 
        self.set_border_width(5)
118
 
        self.pack_start(image_loading, False, False)
119
 
        self.pack_start(self.pb, True, True)
120
 
 
121
 
    def tick(self, *args, **kwargs):
122
 
        self.show_all()
123
 
        self.pb.tick(*args, **kwargs)
124
 
 
125
 
    def update(self, *args, **kwargs):
126
 
        self.show_all()
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
 
 
137
 
 
138
 
class PasswordDialog(gtk.Dialog):
139
 
    """ Prompt the user for a password. """
140
 
 
141
 
    def __init__(self, prompt):
142
 
        gtk.Dialog.__init__(self)
143
 
 
144
 
        label = gtk.Label(prompt)
145
 
        self.vbox.pack_start(label, padding=10)
146
 
 
147
 
        self.entry = gtk.Entry()
148
 
        self.entry.set_visibility(False)
149
 
        self.vbox.pack_end(self.entry, padding=10)
150
 
 
151
 
        self.vbox.show_all()
152
 
 
153
 
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK,
154
 
                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
155
 
 
156
 
    def _get_passwd(self):
157
 
        return self.entry.get_text()
158
 
 
159
 
    passwd = property(_get_passwd)
160
 
 
161
 
 
162
 
class GtkUIFactory(UIFactory):
163
 
    """A UI factory for GTK user interfaces."""
164
 
 
165
 
    def __init__(self):
166
 
        """Create a GtkUIFactory"""
167
 
        super(GtkUIFactory, self).__init__()
168
 
        self.set_progress_bar_widget(None)
169
 
 
170
 
    def set_progress_bar_widget(self, widget):
171
 
        self._progress_bar_widget = widget
172
 
 
173
 
    def get_boolean(self, prompt):
174
 
        """GtkDialog with yes/no answers"""
175
 
        dialog = PromptDialog(prompt)
176
 
        response = dialog.run()
177
 
        dialog.destroy()
178
 
        return (response == gtk.RESPONSE_YES)
179
 
 
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
 
 
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"""
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)
213