/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-08-29 14:12:30 UTC
  • mto: This revision was merged to the branch mainline in revision 741.
  • Revision ID: sinzui.is@verizon.net-20110829141230-6nv7h0oxjrojb1y1
Updated hacking doc.

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
 
        
 
31
        Gtk.Dialog.__init__(self)
 
32
 
 
33
        label = Gtk.Label(label=prompt)
 
34
        self.vbox.pack_start(label, True, True, 10)
37
35
        self.vbox.show_all()
38
36
 
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):
45
 
        super(GtkProgressBar, self).__init__()
 
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):
 
44
        Gtk.ProgressBar.__init__(self)
46
45
        self.set_fraction(0.0)
47
 
        self._stack = stack
48
46
        self.current = None
49
47
        self.total = None
50
48
 
51
 
    def finished(self):
52
 
        self._stack.remove(self)
53
 
 
54
 
    def clear(self):
55
 
        pass
56
 
 
57
49
    def tick(self):
 
50
        self.show()
58
51
        self.pulse()
59
52
 
60
 
    def update(self, msg=None, current=None, total=None):
61
 
        if current:
62
 
            self.current = current
63
 
        if total:
64
 
            self.total = total
 
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
65
59
        if msg is not None:
66
60
            self.set_text(msg)
67
61
        if None not in (self.current, self.total):
68
 
            self.set_fraction(1.0 * self.current / self.total)
69
 
        while gtk.events_pending():
70
 
            gtk.main_iteration()
71
 
 
72
 
 
73
 
class GtkWindowProgressBarStack(gtk.Window):
 
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
 
74
78
    def __init__(self):
75
 
        super(GtkWindowProgressBarStack, self).__init__(type=gtk.WINDOW_TOPLEVEL)
 
79
        super(ProgressBarWindow, self).__init__(type=Gtk.WindowType.TOPLEVEL)
76
80
        self.set_border_width(0)
77
81
        self.set_title("Progress")
78
 
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
79
 
        self.vbox = gtk.VBox()
80
 
        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)
81
86
        self.set_resizable(False)
82
87
 
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()
97
 
 
98
 
 
99
 
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):
100
138
    """ Prompt the user for a password. """
 
139
 
101
140
    def __init__(self, prompt):
102
 
        gtk.Dialog.__init__(self)
103
 
        
104
 
        label = gtk.Label(prompt)
105
 
        self.vbox.pack_start(label, padding=10)
106
 
        
107
 
        self.entry = gtk.Entry()
 
141
        Gtk.Dialog.__init__(self)
 
142
 
 
143
        label = Gtk.Label(label=prompt)
 
144
        self.vbox.pack_start(label, True, True, 10)
 
145
 
 
146
        self.entry = Gtk.Entry()
108
147
        self.entry.set_visibility(False)
109
148
        self.vbox.pack_end(self.entry, padding=10)
110
 
        
 
149
 
111
150
        self.vbox.show_all()
112
 
        
113
 
        self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
114
 
    
 
151
 
 
152
        self.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.OK,
 
153
                         Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
 
154
 
115
155
    def _get_passwd(self):
116
156
        return self.entry.get_text()
117
157
 
121
161
class GtkUIFactory(UIFactory):
122
162
    """A UI factory for GTK user interfaces."""
123
163
 
124
 
    def __init__(self,
125
 
                 stdout=None,
126
 
                 stderr=None):
127
 
        """Create a GtkUIFactory.
128
 
 
129
 
        """
 
164
    def __init__(self):
 
165
        """Create a GtkUIFactory"""
130
166
        super(GtkUIFactory, self).__init__()
131
 
        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
132
171
 
133
172
    def get_boolean(self, prompt):
134
173
        """GtkDialog with yes/no answers"""
135
174
        dialog = PromptDialog(prompt)
136
175
        response = dialog.run()
137
176
        dialog.destroy()
138
 
        return (response == gtk.RESPONSE_YES)
139
 
        
 
177
        return (response == Gtk.ResponseType.YES)
 
178
 
140
179
    def get_password(self, prompt='', **kwargs):
141
180
        """Prompt the user for a password.
142
181
 
151
190
        response = dialog.run()
152
191
        passwd = dialog.passwd
153
192
        dialog.destroy()
154
 
        if response == gtk.RESPONSE_OK:
 
193
        if response == Gtk.ResponseType.OK:
155
194
            return passwd
156
195
        else:
157
196
            return None
158
197
 
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
 
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