/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 19:07:23 UTC
  • mto: This revision was merged to the branch mainline in revision 515.
  • Revision ID: jelmer@samba.org-20080629190723-l8mzg9x4oec0lhsl
Return cleartext from seahorse module

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
"""GTK UI
20
20
"""
21
21
 
22
 
from gi.repository import Gtk
 
22
import gtk
 
23
import sys
23
24
 
 
25
import bzrlib.progress
24
26
from bzrlib.ui import UIFactory
25
27
 
26
28
 
27
 
class PromptDialog(Gtk.Dialog):
28
 
    """Prompt the user for a yes/no answer."""
29
 
 
 
29
class PromptDialog(gtk.Dialog):
 
30
    """ Prompt the user for a yes/no answer. """
30
31
    def __init__(self, prompt):
31
 
        super(PromptDialog, self).__init__()
32
 
 
33
 
        label = Gtk.Label(label=prompt)
34
 
        self.get_content_area().pack_start(label, True, True, 10)
35
 
        self.get_content_area().show_all()
36
 
 
37
 
        self.add_buttons(Gtk.STOCK_YES, Gtk.ResponseType.YES, Gtk.STOCK_NO,
38
 
                         Gtk.ResponseType.NO)
39
 
 
40
 
 
41
 
class GtkProgressBar(Gtk.ProgressBar):
42
 
 
43
 
    def __init__(self):
 
32
        gtk.Dialog.__init__(self)
 
33
        
 
34
        label = gtk.Label(prompt)
 
35
        self.vbox.pack_start(label, padding=10)
 
36
        
 
37
        self.vbox.show_all()
 
38
 
 
39
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, 
 
40
                         gtk.RESPONSE_NO)
 
41
 
 
42
 
 
43
class GtkProgressBar(gtk.ProgressBar):
 
44
    def __init__(self, stack):
44
45
        super(GtkProgressBar, self).__init__()
45
46
        self.set_fraction(0.0)
46
 
        self.current = None
47
 
        self.total = None
 
47
        self._stack = stack
 
48
 
 
49
    def finished(self):
 
50
        self._stack.remove(self)
 
51
 
 
52
    def clear(self):
 
53
        pass
48
54
 
49
55
    def tick(self):
50
 
        self.show()
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)
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
 
 
 
61
        if None not in (current, total) and total > 0:
 
62
            self.set_fraction(1.0 * current / total)
 
63
        while gtk.events_pending():
 
64
            gtk.main_iteration()
 
65
 
 
66
 
 
67
class GtkProgressBarStack(gtk.Window):
78
68
    def __init__(self):
79
 
        super(ProgressBarWindow, self).__init__(type=Gtk.WindowType.TOPLEVEL)
 
69
        super(GtkProgressBarStack, self).__init__(type=gtk.WINDOW_TOPLEVEL)
80
70
        self.set_border_width(0)
81
71
        self.set_title("Progress")
82
 
        self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
83
 
        self.pb = GtkProgressBar()
84
 
        self.add(self.pb)
85
 
        self.resize(250, 15)
 
72
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
 
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.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()
99
 
        self.destroy()
100
 
 
101
 
    def clear(self):
102
 
        self.pb.clear()
103
 
        self.hide()
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.IconSize.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, 0)
118
 
        self.pack_start(self.pb, True, True, 0)
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()
131
 
 
132
 
    def clear(self):
133
 
        self.pb.clear()
134
 
        self.hide()
135
 
 
136
 
 
137
 
class PasswordDialog(Gtk.Dialog):
 
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()
 
91
 
 
92
 
 
93
class PasswordDialog(gtk.Dialog):
138
94
    """ Prompt the user for a password. """
139
 
 
140
95
    def __init__(self, prompt):
141
 
        super(PasswordDialog, self).__init__()
142
 
 
143
 
        label = Gtk.Label(label=prompt)
144
 
        self.get_content_area().pack_start(label, True, True, 10)
145
 
 
146
 
        self.entry = Gtk.Entry()
 
96
        gtk.Dialog.__init__(self)
 
97
        
 
98
        label = gtk.Label(prompt)
 
99
        self.vbox.pack_start(label, padding=10)
 
100
        
 
101
        self.entry = gtk.Entry()
147
102
        self.entry.set_visibility(False)
148
 
        self.get_content_area().pack_end(self.entry, False, False, 10)
149
 
 
150
 
        self.get_content_area().show_all()
151
 
 
152
 
        self.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.OK,
153
 
                         Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
154
 
 
 
103
        self.vbox.pack_end(self.entry, padding=10)
 
104
        
 
105
        self.vbox.show_all()
 
106
        
 
107
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
108
    
155
109
    def _get_passwd(self):
156
110
        return self.entry.get_text()
157
111
 
161
115
class GtkUIFactory(UIFactory):
162
116
    """A UI factory for GTK user interfaces."""
163
117
 
164
 
    def __init__(self):
165
 
        """Create a GtkUIFactory"""
 
118
    def __init__(self,
 
119
                 stdout=None,
 
120
                 stderr=None):
 
121
        """Create a GtkUIFactory.
 
122
 
 
123
        """
166
124
        super(GtkUIFactory, self).__init__()
167
 
        self.set_progress_bar_widget(None)
168
 
 
169
 
    def set_progress_bar_widget(self, widget):
170
 
        self._progress_bar_widget = widget
 
125
        self._progress_bar_stack = None
171
126
 
172
127
    def get_boolean(self, prompt):
173
128
        """GtkDialog with yes/no answers"""
174
129
        dialog = PromptDialog(prompt)
175
130
        response = dialog.run()
176
131
        dialog.destroy()
177
 
        return (response == Gtk.ResponseType.YES)
178
 
 
 
132
        return (response == gtk.RESPONSE_YES)
 
133
        
179
134
    def get_password(self, prompt='', **kwargs):
180
135
        """Prompt the user for a password.
181
136
 
190
145
        response = dialog.run()
191
146
        passwd = dialog.passwd
192
147
        dialog.destroy()
193
 
        if response == Gtk.ResponseType.OK:
 
148
        if response == gtk.RESPONSE_OK:
194
149
            return passwd
195
150
        else:
196
151
            return None
197
152
 
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
 
 
 
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