/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: Curtis Hovey
  • Date: 2011-09-05 03:44:26 UTC
  • mto: This revision was merged to the branch mainline in revision 741.
  • Revision ID: sinzui.is@verizon.net-20110905034426-p98pxnay9rmzkr99
Fix the initializer for many classes.
Replace Gtk.Dialog.vbox with .get_content_area().

Show diffs side-by-side

added added

removed removed

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