/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: 2011-04-10 18:44:39 UTC
  • mto: This revision was merged to the branch mainline in revision 730.
  • Revision ID: jelmer@samba.org-20110410184439-g7hqaacexqtviq13
Move i18n support to a separate file, so gettext files aren't loaded unless bzr-gtk is used.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright (C) 2006 Szilveszter Farkas <szilveszter.farkas@gmail.com>
 
2
# Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
2
3
 
3
4
# This program is free software; you can redistribute it and/or modify
4
5
# it under the terms of the GNU General Public License as published by
19
20
"""
20
21
 
21
22
import gtk
22
 
import sys
23
23
 
24
 
import bzrlib.progress
25
 
from bzrlib.symbol_versioning import (deprecated_method, 
26
 
        zero_eight)
27
24
from bzrlib.ui import UIFactory
28
25
 
29
26
 
30
27
class PromptDialog(gtk.Dialog):
31
 
    """ Prompt the user for a yes/no answer. """
 
28
    """Prompt the user for a yes/no answer."""
 
29
 
32
30
    def __init__(self, prompt):
33
31
        gtk.Dialog.__init__(self)
34
 
        
 
32
 
35
33
        label = gtk.Label(prompt)
36
34
        self.vbox.pack_start(label, padding=10)
37
 
        
38
35
        self.vbox.show_all()
39
36
 
40
 
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, gtk.RESPONSE_NO)
 
37
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO,
 
38
                         gtk.RESPONSE_NO)
 
39
 
 
40
 
 
41
class GtkProgressBar(gtk.ProgressBar):
 
42
 
 
43
    def __init__(self):
 
44
        gtk.ProgressBar.__init__(self)
 
45
        self.set_fraction(0.0)
 
46
        self.current = None
 
47
        self.total = None
 
48
 
 
49
    def tick(self):
 
50
        self.show()
 
51
        self.pulse()
 
52
 
 
53
    def update(self, msg=None, current_cnt=None, total_cnt=None):
 
54
        self.show()
 
55
        if current_cnt is not None:
 
56
            self.current = current_cnt
 
57
        if total_cnt is not None:
 
58
            self.total = total_cnt
 
59
        if msg is not None:
 
60
            self.set_text(msg)
 
61
        if None not in (self.current, self.total):
 
62
            self.fraction = float(self.current) / self.total
 
63
            if self.fraction < 0.0 or self.fraction > 1.0:
 
64
                raise AssertionError
 
65
            self.set_fraction(self.fraction)
 
66
        while gtk.events_pending():
 
67
            gtk.main_iteration()
 
68
 
 
69
    def finished(self):
 
70
        self.hide()
 
71
 
 
72
    def clear(self):
 
73
        self.hide()
 
74
 
 
75
 
 
76
class ProgressBarWindow(gtk.Window):
 
77
 
 
78
    def __init__(self):
 
79
        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
 
80
        self.set_border_width(0)
 
81
        self.set_title("Progress")
 
82
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
 
83
        self.pb = GtkProgressBar()
 
84
        self.add(self.pb)
 
85
        self.resize(250, 15)
 
86
        self.set_resizable(False)
 
87
 
 
88
    def tick(self, *args, **kwargs):
 
89
        self.show_all()
 
90
        self.pb.tick(*args, **kwargs)
 
91
 
 
92
    def update(self, *args, **kwargs):
 
93
        self.show_all()
 
94
        self.pb.update(*args, **kwargs)
 
95
 
 
96
    def finished(self):
 
97
        self.pb.finished()
 
98
        self.hide_all()
 
99
        self.destroy()
 
100
 
 
101
    def clear(self):
 
102
        self.pb.clear()
 
103
        self.hide_all()
 
104
 
 
105
 
 
106
class ProgressPanel(gtk.HBox):
 
107
 
 
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()
 
113
 
 
114
        self.pb = GtkProgressBar()
 
115
        self.set_spacing(5)
 
116
        self.set_border_width(5)
 
117
        self.pack_start(image_loading, False, False)
 
118
        self.pack_start(self.pb, True, True)
 
119
 
 
120
    def tick(self, *args, **kwargs):
 
121
        self.show_all()
 
122
        self.pb.tick(*args, **kwargs)
 
123
 
 
124
    def update(self, *args, **kwargs):
 
125
        self.show_all()
 
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()
41
135
 
42
136
 
43
137
class PasswordDialog(gtk.Dialog):
44
138
    """ Prompt the user for a password. """
 
139
 
45
140
    def __init__(self, prompt):
46
141
        gtk.Dialog.__init__(self)
47
 
        
 
142
 
48
143
        label = gtk.Label(prompt)
49
144
        self.vbox.pack_start(label, padding=10)
50
 
        
 
145
 
51
146
        self.entry = gtk.Entry()
52
147
        self.entry.set_visibility(False)
53
148
        self.vbox.pack_end(self.entry, padding=10)
54
 
        
 
149
 
55
150
        self.vbox.show_all()
56
 
        
57
 
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
58
 
    
 
151
 
 
152
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
153
                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
154
 
59
155
    def _get_passwd(self):
60
156
        return self.entry.get_text()
61
157
 
63
159
 
64
160
 
65
161
class GtkUIFactory(UIFactory):
66
 
    """A UI factory for GTK user interefaces."""
67
 
 
68
 
    def __init__(self,
69
 
                 bar_type=None,
70
 
                 stdout=None,
71
 
                 stderr=None):
72
 
        """Create a GtkUIFactory.
73
 
 
74
 
        :param bar_type: The type of progress bar to create. It defaults to 
75
 
                         letting the bzrlib.progress.ProgressBar factory auto
76
 
                         select.
77
 
        """
 
162
    """A UI factory for GTK user interfaces."""
 
163
 
 
164
    def __init__(self):
 
165
        """Create a GtkUIFactory"""
78
166
        super(GtkUIFactory, self).__init__()
79
 
        self._bar_type = bar_type
80
 
        if stdout is None:
81
 
            self.stdout = sys.stdout
82
 
        else:
83
 
            self.stdout = stdout
84
 
        if stderr is None:
85
 
            self.stderr = sys.stderr
86
 
        else:
87
 
            self.stderr = stderr
 
167
        self.set_progress_bar_widget(None)
 
168
 
 
169
    def set_progress_bar_widget(self, widget):
 
170
        self._progress_bar_widget = widget
88
171
 
89
172
    def get_boolean(self, prompt):
90
173
        """GtkDialog with yes/no answers"""
91
174
        dialog = PromptDialog(prompt)
92
175
        response = dialog.run()
93
176
        dialog.destroy()
94
 
        if response == gtk.RESPONSE_YES:
95
 
            return True
96
 
        else:
97
 
            return False
98
 
        
99
 
    @deprecated_method(zero_eight)
100
 
    def progress_bar(self):
101
 
        """See UIFactory.nested_progress_bar()."""
102
 
        # this in turn is abstract, and creates either a tty or dots
103
 
        # bar depending on what we think of the terminal
104
 
        return bzrlib.progress.ProgressBar()
 
177
        return (response == gtk.RESPONSE_YES)
105
178
 
106
179
    def get_password(self, prompt='', **kwargs):
107
180
        """Prompt the user for a password.
122
195
        else:
123
196
            return None
124
197
 
125
 
    def nested_progress_bar(self):
126
 
        """Return a nested progress bar.
127
 
        
128
 
        The actual bar type returned depends on the progress module which
129
 
        may return a tty or dots bar depending on the terminal.
130
 
        
131
 
        FIXME: It should return a GtkProgressBar actually.
132
 
        """
133
 
        if self._progress_bar_stack is None:
134
 
            self._progress_bar_stack = bzrlib.progress.ProgressBarStack(
135
 
                klass=self._bar_type)
136
 
        return self._progress_bar_stack.get_nested()
137
 
 
138
 
    def clear_term(self):
139
 
        """Prepare the terminal for output.
140
 
 
141
 
        It has no sense when talking about GTK."""
142
 
        pass
 
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"""
 
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)
 
212