/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-03-03 14:10:25 UTC
  • mto: This revision was merged to the branch mainline in revision 686.
  • Revision ID: jelmer@samba.org-20100303141025-rz53ongyh8miv3q5
Don't crash when there is already a lan-notify instance running.

Show diffs side-by-side

added added

removed removed

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