/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: 2008-06-29 15:54:40 UTC
  • mto: This revision was merged to the branch mainline in revision 519.
  • Revision ID: jelmer@samba.org-20080629155440-iuzfrlfifnplp9jq
Add simple test for linegraph.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
import gtk
23
23
import sys
24
24
 
25
 
from bzrlib import progress
 
25
import bzrlib.progress
26
26
from bzrlib.ui import UIFactory
27
27
 
28
28
 
30
30
    """ Prompt the user for a yes/no answer. """
31
31
    def __init__(self, prompt):
32
32
        gtk.Dialog.__init__(self)
33
 
 
 
33
        
34
34
        label = gtk.Label(prompt)
35
35
        self.vbox.pack_start(label, padding=10)
 
36
        
36
37
        self.vbox.show_all()
37
38
 
38
 
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO,
 
39
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, 
39
40
                         gtk.RESPONSE_NO)
40
41
 
41
42
 
42
43
class GtkProgressBar(gtk.ProgressBar):
43
 
 
44
 
    def __init__(self):
45
 
        gtk.ProgressBar.__init__(self)
 
44
    def __init__(self, stack):
 
45
        super(GtkProgressBar, self).__init__()
46
46
        self.set_fraction(0.0)
47
 
        self.current = None
48
 
        self.total = None
 
47
        self._stack = stack
 
48
 
 
49
    def finished(self):
 
50
        self._stack.remove(self)
 
51
 
 
52
    def clear(self):
 
53
        pass
49
54
 
50
55
    def tick(self):
51
56
        self.pulse()
52
57
 
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
 
58
    def update(self, msg=None, current=None, total=None):
59
59
        if msg is not None:
60
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)
 
61
        if None not in (current, total) and total > 0:
 
62
            self.set_fraction(1.0 * current / total)
66
63
        while gtk.events_pending():
67
64
            gtk.main_iteration()
68
65
 
69
 
    def finished(self):
70
 
        self.hide()
71
 
 
72
 
    def clear(self):
73
 
        self.hide()
74
 
 
75
 
 
76
 
class ProgressBarWindow(gtk.Window):
77
 
 
 
66
 
 
67
class GtkProgressBarStack(gtk.Window):
78
68
    def __init__(self):
79
 
        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
 
69
        super(GtkProgressBarStack, self).__init__(type=gtk.WINDOW_TOPLEVEL)
80
70
        self.set_border_width(0)
81
71
        self.set_title("Progress")
82
72
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
83
 
        self.pb = GtkProgressBar()
84
 
        self.add(self.pb)
85
 
        self.resize(250, 15)
 
73
        self.vbox = gtk.VBox()
 
74
        self.add(self.vbox)
86
75
        self.set_resizable(False)
87
76
 
88
 
    def tick(self, *args, **kwargs):
89
 
        self.pb.tick(*args, **kwargs)
90
 
 
91
 
    def update(self, *args, **kwargs):
92
 
        self.show_all()
93
 
        self.pb.update(*args, **kwargs)
94
 
 
95
 
    def finished(self):
96
 
        self.hide_all()
97
 
 
98
 
    def clear(self):
99
 
        self.pb.clear()
100
 
        # FIXME: destroy() ? Really ? -- vila 20090610
101
 
        self.destroy()
102
 
 
103
 
 
104
 
class ProgressPanel(gtk.HBox):
105
 
 
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()
111
 
 
112
 
        self.pb = GtkProgressBar()
113
 
        self.set_spacing(5)
114
 
        self.set_border_width(5)
115
 
        self.pack_start(image_loading, False, False)
116
 
        self.pack_start(self.pb, True, True)
117
 
 
118
 
    def tick(self, *args, **kwargs):
119
 
        self.pb.tick(*args, **kwargs)
120
 
 
121
 
    def update(self, *args, **kwargs):
122
 
        self.show_all()
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()
 
77
    def _adapt_size(self):
 
78
        self.resize(250, 15 * len(self.vbox.get_children()))
 
79
 
 
80
    def get_nested(self):
 
81
        nested = GtkProgressBar(self)
 
82
        self.vbox.pack_start(nested)
 
83
        self._adapt_size()
 
84
        self.show_all()
 
85
        return nested
 
86
 
 
87
    def remove(self, pb):
 
88
        self.vbox.remove(pb)
 
89
        if len(self.vbox.get_children()) == 0: # If there is nothing to show, don't leave a ghost window here
 
90
             self.destroy()
132
91
 
133
92
 
134
93
class PasswordDialog(gtk.Dialog):
135
94
    """ Prompt the user for a password. """
136
95
    def __init__(self, prompt):
137
96
        gtk.Dialog.__init__(self)
138
 
 
 
97
        
139
98
        label = gtk.Label(prompt)
140
99
        self.vbox.pack_start(label, padding=10)
141
 
 
 
100
        
142
101
        self.entry = gtk.Entry()
143
102
        self.entry.set_visibility(False)
144
103
        self.vbox.pack_end(self.entry, padding=10)
145
 
 
 
104
        
146
105
        self.vbox.show_all()
147
 
 
148
 
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK,
149
 
                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
150
 
 
 
106
        
 
107
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
108
    
151
109
    def _get_passwd(self):
152
110
        return self.entry.get_text()
153
111
 
157
115
class GtkUIFactory(UIFactory):
158
116
    """A UI factory for GTK user interfaces."""
159
117
 
160
 
    def __init__(self):
161
 
        """Create a GtkUIFactory"""
 
118
    def __init__(self,
 
119
                 stdout=None,
 
120
                 stderr=None):
 
121
        """Create a GtkUIFactory.
 
122
 
 
123
        """
162
124
        super(GtkUIFactory, self).__init__()
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())
 
125
        self._progress_bar_stack = None
168
126
 
169
127
    def get_boolean(self, prompt):
170
128
        """GtkDialog with yes/no answers"""
172
130
        response = dialog.run()
173
131
        dialog.destroy()
174
132
        return (response == gtk.RESPONSE_YES)
175
 
 
 
133
        
176
134
    def get_password(self, prompt='', **kwargs):
177
135
        """Prompt the user for a password.
178
136
 
192
150
        else:
193
151
            return None
194
152
 
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
 
 
 
153
    def nested_progress_bar(self):
 
154
        """Return a nested progress bar.
 
155
        """
 
156
        if self._progress_bar_stack is None:
 
157
            self._progress_bar_stack = GtkProgressBarStack()
 
158
        return self._progress_bar_stack.get_nested()
 
159
 
 
160
    def set_progress_bar_vbox(self, vbox):
 
161
        """Change the vbox to put progress bars in.
 
162
        """
 
163
        self._progress_bar_stack = vbox
 
164
 
 
165
    def clear_term(self):
 
166
        """Prepare the terminal for output.
 
167
 
 
168
        It has no sense when talking about GTK."""
 
169
        pass