1
1
# Copyright (C) 2006 Szilveszter Farkas <szilveszter.farkas@gmail.com>
2
# Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
4
3
# This program is free software; you can redistribute it and/or modify
5
4
# it under the terms of the GNU General Public License as published by
37
38
self.vbox.show_all()
39
self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO,
43
class GtkProgressBar(gtk.ProgressBar):
44
def __init__(self, stack):
45
super(GtkProgressBar, self).__init__()
46
self.set_fraction(0.0)
50
self._stack.remove(self)
58
def update(self, msg=None, current=None, total=None):
61
if None not in (current, total) and total > 0:
62
self.set_fraction(1.0 * current / total)
63
while gtk.events_pending():
67
class GtkProgressBarStack(gtk.Window):
69
super(GtkProgressBarStack, self).__init__(type=gtk.WINDOW_TOPLEVEL)
70
self.set_border_width(0)
71
self.set_title("Progress")
72
self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
73
self.vbox = gtk.VBox()
75
self.set_resizable(False)
77
def _adapt_size(self):
78
self.resize(250, 15 * len(self.vbox.get_children()))
81
nested = GtkProgressBar(self)
82
self.vbox.pack_start(nested)
89
if len(self.vbox.get_children()) == 0: # If there is nothing to show, don't leave a ghost window here
40
self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, gtk.RESPONSE_NO)
93
43
class PasswordDialog(gtk.Dialog):
115
65
class GtkUIFactory(UIFactory):
116
"""A UI factory for GTK user interfaces."""
66
"""A UI factory for GTK user interefaces."""
118
68
def __init__(self,
121
72
"""Create a GtkUIFactory.
74
:param bar_type: The type of progress bar to create. It defaults to
75
letting the bzrlib.progress.ProgressBar factory auto
124
78
super(GtkUIFactory, self).__init__()
125
self._progress_bar_stack = None
79
self._bar_type = bar_type
81
self.stdout = sys.stdout
85
self.stderr = sys.stderr
127
89
def get_boolean(self, prompt):
128
90
"""GtkDialog with yes/no answers"""
129
91
dialog = PromptDialog(prompt)
130
92
response = dialog.run()
132
return (response == gtk.RESPONSE_YES)
94
if response == gtk.RESPONSE_YES:
99
@deprecated_method(zero_eight)
100
def progress_bar(self):
101
"""See UIFactory.nested_progress_bar()."""
102
# this in turn is abstract, and creates either a tty or dots
103
# bar depending on what we think of the terminal
104
return bzrlib.progress.ProgressBar()
134
106
def get_password(self, prompt='', **kwargs):
135
107
"""Prompt the user for a password.
153
125
def nested_progress_bar(self):
154
126
"""Return a nested progress bar.
128
The actual bar type returned depends on the progress module which
129
may return a tty or dots bar depending on the terminal.
131
FIXME: It should return a GtkProgressBar actually.
156
133
if self._progress_bar_stack is None:
157
self._progress_bar_stack = GtkProgressBarStack()
134
self._progress_bar_stack = bzrlib.progress.ProgressBarStack(
135
klass=self._bar_type)
158
136
return self._progress_bar_stack.get_nested()
160
def set_progress_bar_vbox(self, vbox):
161
"""Change the vbox to put progress bars in.
163
self._progress_bar_stack = vbox
165
138
def clear_term(self):
166
139
"""Prepare the terminal for output.