/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: Vincent Ladeuil
  • Date: 2008-06-10 15:25:47 UTC
  • mto: This revision was merged to the branch mainline in revision 504.
  • Revision ID: v.ladeuil+lp@free.fr-20080610152547-dwmil1p8pd0mfpnl
Fix third failing test (thanks to jam).

* tests/test_commit.py:
(TestPendingRevisions.test_pending_revisions_multi_merge): Fix
provided by jam: bzr we now filter the pending merges so that only
the 'heads()' are included. We just ensure that the pending merges
contain the unique tips for the ancestries.

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
22
23
import sys
23
24
 
24
25
import bzrlib.progress
25
 
from bzrlib.symbol_versioning import (deprecated_method, 
26
 
        zero_eight)
27
26
from bzrlib.ui import UIFactory
28
27
 
29
28
 
37
36
        
38
37
        self.vbox.show_all()
39
38
 
40
 
        self.add_buttons(gtk.STOCK_YES, gtk.RESPONSE_YES, gtk.STOCK_NO, gtk.RESPONSE_NO)
 
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__()
 
46
        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
 
54
 
 
55
    def tick(self):
 
56
        self.pulse()
 
57
 
 
58
    def update(self, msg=None, current=None, total=None):
 
59
        if msg is not None:
 
60
            self.set_text(msg)
 
61
        if None not in (current, total):
 
62
            self.set_fraction(1.0 * current / total)
 
63
        while gtk.events_pending():
 
64
            gtk.main_iteration()
 
65
 
 
66
 
 
67
class GtkProgressBarStack(gtk.Window):
 
68
    def __init__(self):
 
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()
 
74
        self.add(self.vbox)
 
75
        self.set_resizable(False)
 
76
 
 
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()
41
91
 
42
92
 
43
93
class PasswordDialog(gtk.Dialog):
63
113
 
64
114
 
65
115
class GtkUIFactory(UIFactory):
66
 
    """A UI factory for GTK user interefaces."""
 
116
    """A UI factory for GTK user interfaces."""
67
117
 
68
118
    def __init__(self,
69
 
                 bar_type=None,
70
119
                 stdout=None,
71
120
                 stderr=None):
72
121
        """Create a GtkUIFactory.
73
122
 
74
 
        :param bar_type: The type of progress bar to create. It defaults to 
75
 
                         letting the bzrlib.progress.ProgressBar factory auto
76
 
                         select.
77
123
        """
78
124
        super(GtkUIFactory, self).__init__()
79
 
        self._bar_type = bar_type
80
 
        if stdout is None:
81
 
            self.stdout = sys.stdout
82
 
        else:
83
 
            self.stdout = stdout
84
 
        if stderr is None:
85
 
            self.stderr = sys.stderr
86
 
        else:
87
 
            self.stderr = stderr
 
125
        self._progress_bar_stack = None
88
126
 
89
127
    def get_boolean(self, prompt):
90
128
        """GtkDialog with yes/no answers"""
91
129
        dialog = PromptDialog(prompt)
92
130
        response = dialog.run()
93
131
        dialog.destroy()
94
 
        if response == gtk.RESPONSE_YES:
95
 
            return True
96
 
        else:
97
 
            return False
 
132
        return (response == gtk.RESPONSE_YES)
98
133
        
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()
105
 
 
106
134
    def get_password(self, prompt='', **kwargs):
107
135
        """Prompt the user for a password.
108
136
 
124
152
 
125
153
    def nested_progress_bar(self):
126
154
        """Return a nested progress bar.
127
 
        
128
 
        The actual bar type returned depends on the progress module which
129
 
        may return a tty or dots bar depending on the terminal.
130
 
        
131
 
        FIXME: It should return a GtkProgressBar actually.
132
155
        """
133
156
        if self._progress_bar_stack is None:
134
 
            self._progress_bar_stack = bzrlib.progress.ProgressBarStack(
135
 
                klass=self._bar_type)
 
157
            self._progress_bar_stack = GtkProgressBarStack()
136
158
        return self._progress_bar_stack.get_nested()
137
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
 
138
165
    def clear_term(self):
139
166
        """Prepare the terminal for output.
140
167