/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 18:12:29 UTC
  • mto: This revision was merged to the branch mainline in revision 519.
  • Revision ID: jelmer@samba.org-20080629181229-1l2m4cf7vvbyh8qg
Simplify progress bar code, use embedded progress bar inside viz window.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright (C) 2006 Szilveszter Farkas <szilveszter.farkas@gmail.com>
 
2
# Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
2
3
 
3
4
# This program is free software; you can redistribute it and/or modify
4
5
# it under the terms of the GNU General Public License as published by
21
22
import gtk
22
23
import sys
23
24
 
24
 
import bzrlib.progress
 
25
from bzrlib import progress
25
26
from bzrlib.ui import UIFactory
26
27
 
27
28
 
35
36
        
36
37
        self.vbox.show_all()
37
38
 
38
 
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, gtk.RESPONSE_NO)
39
 
 
40
 
 
41
 
class GtkProgressBar(gtk.ProgressBar):
42
 
    def __init__(self, stack):
43
 
        super(GtkProgressBar, self).__init__()
 
39
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, 
 
40
                         gtk.RESPONSE_NO)
 
41
 
 
42
 
 
43
class GtkProgressBar(gtk.ProgressBar,progress._BaseProgressBar):
 
44
    def __init__(self, _stack=None):
 
45
        gtk.ProgressBar.__init__(self)
44
46
        self.set_fraction(0.0)
45
 
        self._stack = stack
46
 
 
47
 
    def finished(self):
48
 
        self._stack.remove(self)
 
47
        progress._BaseProgressBar.__init__(self, _stack=_stack)
 
48
        self.current = None
 
49
        self.total = None
49
50
 
50
51
    def clear(self):
51
 
        pass
 
52
        self.hide()
52
53
 
53
54
    def tick(self):
54
55
        self.pulse()
55
56
 
56
 
    def update(self, msg=None, current=None, total=None):
 
57
    def child_update(self, message, current, total):
 
58
        pass
 
59
 
 
60
    def update(self, msg=None, current_cnt=None, total_cnt=None):
 
61
        if current_cnt:
 
62
            self.current = current_cnt
 
63
        if total_cnt:
 
64
            self.total = total_cnt
57
65
        if msg is not None:
58
66
            self.set_text(msg)
59
 
        self.set_fraction(1.0 * current / total)
 
67
        if None not in (self.current, self.total):
 
68
            self.fraction = float(self.current) / self.total
 
69
            self.set_fraction(self.fraction)
60
70
        while gtk.events_pending():
61
71
            gtk.main_iteration()
62
72
 
63
73
 
64
 
class GtkProgressBarStack(gtk.Window):
 
74
class ProgressBarWindow(gtk.Window):
65
75
    def __init__(self):
66
 
        super(GtkProgressBarStack, self).__init__(type=gtk.WINDOW_TOPLEVEL)
 
76
        super(ProgressBarWindow, self).__init__(type=gtk.WINDOW_TOPLEVEL)
67
77
        self.set_border_width(0)
68
78
        self.set_title("Progress")
69
79
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
70
 
        self.vbox = gtk.VBox()
71
 
        self.add(self.vbox)
 
80
        self.pb = GtkProgressBar(self)
 
81
        self.add(self.pb)
 
82
        self.resize(250, 15)
72
83
        self.set_resizable(False)
73
 
 
74
 
    def _adapt_size(self):
75
 
        self.resize(250, 15 * len(self.vbox.get_children()))
76
 
 
77
 
    def get_nested(self):
78
 
        nested = GtkProgressBar(self)
79
 
        self.vbox.pack_start(nested)
80
 
        self._adapt_size()
81
 
        self.show_all()
82
 
        return nested
83
 
 
84
 
    def remove(self, pb):
85
 
        self.vbox.remove(pb)
 
84
        self.show_all()
 
85
 
 
86
    def clear(self):
 
87
        self.pb.clear()
 
88
        self.destroy()
 
89
 
 
90
 
 
91
class ProgressPanel(gtk.HBox):
 
92
    def __init__(self):
 
93
        super(ProgressPanel, self).__init__()
 
94
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
 
95
                                                 gtk.ICON_SIZE_BUTTON)
 
96
        image_loading.show()
 
97
        
 
98
        self.pb = GtkProgressBar(self)
 
99
        self.set_spacing(5)
 
100
        self.set_border_width(5)        
 
101
        self.pack_start(image_loading, False, False)
 
102
        self.pack_start(self.pb, True, True)
 
103
 
 
104
    def return_pb(self, pb):
 
105
        self._stack.return_pb(self)
 
106
 
 
107
    def get_progress_bar(self, to_file=None, show_pct=None, show_spinner=None, show_eta=None, 
 
108
                         show_bar=None, show_count=None, to_messages_file=None, 
 
109
                         _stack=None):
 
110
        self._stack = _stack
 
111
        self.show_all()
 
112
        return self
 
113
    
 
114
    def update(self, *args, **kwargs):
 
115
        self.pb.update(*args, **kwargs)
 
116
 
 
117
    def finished(self):
 
118
        self.pb.finished()
 
119
        self.hide_all()
 
120
 
 
121
    def clear(self):
 
122
        self.pb.clear()
 
123
        self.hide_all()
 
124
 
 
125
    def child_progress(self, *args, **kwargs):
 
126
        return self.pb.child_progress(*args, **kwargs)
 
127
 
 
128
    def child_update(self, *args, **kwargs):
 
129
        return self.pb.child_update(*args, **kwargs)
 
130
 
86
131
 
87
132
 
88
133
class PasswordDialog(gtk.Dialog):
117
162
 
118
163
        """
119
164
        super(GtkUIFactory, self).__init__()
120
 
        if stdout is None:
121
 
            self.stdout = sys.stdout
122
 
        else:
123
 
            self.stdout = stdout
124
 
        if stderr is None:
125
 
            self.stderr = sys.stderr
126
 
        else:
127
 
            self.stderr = stderr
128
 
        self._progress_bar_stack = None
 
165
        self.set_nested_progress_bar_widget(ProgressBarWindow)
129
166
 
130
167
    def get_boolean(self, prompt):
131
168
        """GtkDialog with yes/no answers"""
153
190
        else:
154
191
            return None
155
192
 
 
193
    def set_nested_progress_bar_widget(self, widget):
 
194
        self._progress_bar_stack = progress.ProgressBarStack(klass=widget)
 
195
 
156
196
    def nested_progress_bar(self):
157
197
        """Return a nested progress bar.
158
198
        """
159
 
        if self._progress_bar_stack is None:
160
 
            self._progress_bar_stack = GtkProgressBarStack()
161
199
        return self._progress_bar_stack.get_nested()
162
200
 
163
201
    def set_progress_bar_vbox(self, vbox):