/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: 2010-05-25 17:09:02 UTC
  • mto: This revision was merged to the branch mainline in revision 691.
  • Revision ID: jelmer@samba.org-20100525170902-3to8g5iw7ovw79kh
Split out olive into a separate directory.

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
21
22
import gtk
22
23
import sys
23
24
 
24
 
import bzrlib.progress
25
 
from bzrlib.symbol_versioning import (deprecated_method, 
26
 
        zero_eight)
 
25
from bzrlib import progress
27
26
from bzrlib.ui import UIFactory
28
27
 
29
28
 
31
30
    """ Prompt the user for a yes/no answer. """
32
31
    def __init__(self, prompt):
33
32
        gtk.Dialog.__init__(self)
34
 
        
 
33
 
35
34
        label = gtk.Label(prompt)
36
35
        self.vbox.pack_start(label, padding=10)
37
 
        
38
36
        self.vbox.show_all()
39
37
 
40
 
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, gtk.RESPONSE_NO)
 
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()
41
136
 
42
137
 
43
138
class PasswordDialog(gtk.Dialog):
44
139
    """ Prompt the user for a password. """
 
140
 
45
141
    def __init__(self, prompt):
46
142
        gtk.Dialog.__init__(self)
47
 
        
 
143
 
48
144
        label = gtk.Label(prompt)
49
145
        self.vbox.pack_start(label, padding=10)
50
 
        
 
146
 
51
147
        self.entry = gtk.Entry()
52
148
        self.entry.set_visibility(False)
53
149
        self.vbox.pack_end(self.entry, padding=10)
54
 
        
 
150
 
55
151
        self.vbox.show_all()
56
 
        
57
 
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
58
 
    
 
152
 
 
153
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
154
                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
155
 
59
156
    def _get_passwd(self):
60
157
        return self.entry.get_text()
61
158
 
63
160
 
64
161
 
65
162
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
 
        """
 
163
    """A UI factory for GTK user interfaces."""
 
164
 
 
165
    def __init__(self):
 
166
        """Create a GtkUIFactory"""
78
167
        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
 
168
        self.set_progress_bar_widget(None)
 
169
 
 
170
    def set_progress_bar_widget(self, widget):
 
171
        self._progress_bar_widget = widget
88
172
 
89
173
    def get_boolean(self, prompt):
90
174
        """GtkDialog with yes/no answers"""
91
175
        dialog = PromptDialog(prompt)
92
176
        response = dialog.run()
93
177
        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()
 
178
        return (response == gtk.RESPONSE_YES)
105
179
 
106
180
    def get_password(self, prompt='', **kwargs):
107
181
        """Prompt the user for a password.
122
196
        else:
123
197
            return None
124
198
 
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
 
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