/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
1 by Scott James Remnant
Commit the first version of bzrk.
1
# -*- coding: UTF-8 -*-
2
"""Branch window.
3
4
This module contains the code to manage the branch information window,
5
which contains both the revision graph and details panes.
6
"""
7
8
__copyright__ = "Copyright © 2005 Canonical Ltd."
9
__author__    = "Scott James Remnant <scott@ubuntu.com>"
10
11
12
import gtk
13
import gobject
14
import pango
256.2.29 by Gary van der Merwe
Implement a TreeModel that loads revisions incrementaly.
15
import treemodel
1 by Scott James Remnant
Commit the first version of bzrk.
16
17
from bzrlib.osutils import format_date
18
256.2.5 by Gary van der Merwe
Oops - Renamed file without changeing import lines
19
from linegraph import linegraph, same_branch
1 by Scott James Remnant
Commit the first version of bzrk.
20
from graphcell import CellRendererGraph
256.2.29 by Gary van der Merwe
Implement a TreeModel that loads revisions incrementaly.
21
from treemodel import TreeModel
303 by Daniel Schierbeck
Made basic signaling work.
22
from treeview  import TreeView
1 by Scott James Remnant
Commit the first version of bzrk.
23
24
class BranchWindow(gtk.Window):
25
    """Branch window.
26
27
    This object represents and manages a single window containing information
28
    for a particular branch.
29
    """
30
275.1.6 by Daniel Schierbeck
Made Ctrl-W call gtk.main_quit if the window has no parent.
31
    def __init__(self, parent=None):
1 by Scott James Remnant
Commit the first version of bzrk.
32
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
33
        self.set_border_width(0)
292.2.1 by Daniel Schierbeck
Changed title of the viz window to 'revision history'
34
        self.set_title("Revision history")
1 by Scott James Remnant
Commit the first version of bzrk.
35
275.1.6 by Daniel Schierbeck
Made Ctrl-W call gtk.main_quit if the window has no parent.
36
        self._parent = parent
37
38
        self.connect('key-press-event', self._on_key_pressed)
300 by Gary van der Merwe
Fix for bug #70463: viz slow when run from olive.
39
        self.connect("destroy", lambda w: self.branch.unlock())
275.1.1 by Daniel Schierbeck
Close branch visualization window when 'destroy' message is received.
40
1 by Scott James Remnant
Commit the first version of bzrk.
41
        # Use three-quarters of the screen by default
42
        screen = self.get_screen()
4 by Scott James Remnant
Use the size of the first monitor rather than the entire screen
43
        monitor = screen.get_monitor_geometry(0)
44
        width = int(monitor.width * 0.75)
45
        height = int(monitor.height * 0.75)
1 by Scott James Remnant
Commit the first version of bzrk.
46
        self.set_default_size(width, height)
47
48
        # FIXME AndyFitz!
49
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
50
        self.set_icon(icon)
51
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
52
        self.accel_group = gtk.AccelGroup()
53
        self.add_accel_group(self.accel_group)
54
1 by Scott James Remnant
Commit the first version of bzrk.
55
        self.construct()
56
57
    def construct(self):
58
        """Construct the window contents."""
44 by David Allouche
reorganise branch window
59
        vbox = gtk.VBox(spacing=0)
60
        self.add(vbox)
61
62
        vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
280.2.1 by Gary van der Merwe
Add a message to the viz window to indicate that graph is still loading.
63
        vbox.pack_start(self.construct_loading_msg(), expand=False, fill=True)
64
        
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
65
        paned = gtk.VPaned()
66
        paned.pack1(self.construct_top(), resize=True, shrink=False)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
67
        paned.pack2(self.construct_bottom(), resize=False, shrink=True)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
68
        paned.show()
44 by David Allouche
reorganise branch window
69
        vbox.pack_start(paned, expand=True, fill=True)
70
        vbox.set_focus_child(paned)
71
72
        vbox.show()
280.2.1 by Gary van der Merwe
Add a message to the viz window to indicate that graph is still loading.
73
    
74
    def construct_loading_msg(self):
75
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
76
                                                 gtk.ICON_SIZE_BUTTON)
77
        image_loading.show()
78
        
79
        label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
80
        label_loading.set_alignment(0.0, 0.5)        
81
        label_loading.show()
82
        
83
        self.loading_msg_box = gtk.HBox()
84
        self.loading_msg_box.set_spacing(5)
85
        self.loading_msg_box.set_border_width(5)        
86
        self.loading_msg_box.pack_start(image_loading, False, False)
87
        self.loading_msg_box.pack_start(label_loading, True, True)
88
        self.loading_msg_box.show()
89
        
90
        return self.loading_msg_box
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
91
92
    def construct_top(self):
93
        """Construct the top-half of the window."""
303 by Daniel Schierbeck
Made basic signaling work.
94
        self.treeview = TreeView()
95
310 by Daniel Schierbeck
Moved to using custom signal for handling revision selections.
96
        self.treeview.connect("revision-selected",
303 by Daniel Schierbeck
Made basic signaling work.
97
                self._treeselection_changed_cb)
98
307 by Daniel Schierbeck
Made load notification work again.
99
        self.treeview.connect('revisions-loaded', 
100
                lambda x: self.loading_msg_box.hide())
101
1 by Scott James Remnant
Commit the first version of bzrk.
102
        self.treeview.show()
103
303 by Daniel Schierbeck
Made basic signaling work.
104
        return self.treeview
44 by David Allouche
reorganise branch window
105
106
    def construct_navigation(self):
107
        """Construct the navigation buttons."""
108
        frame = gtk.Frame()
109
        frame.set_shadow_type(gtk.SHADOW_OUT)
110
        frame.show()
111
        
112
        hbox = gtk.HBox(spacing=12)
113
        frame.add(hbox)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
114
        hbox.show()
115
116
        self.back_button = gtk.Button(stock=gtk.STOCK_GO_BACK)
44 by David Allouche
reorganise branch window
117
        self.back_button.set_relief(gtk.RELIEF_NONE)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
118
        self.back_button.add_accelerator("clicked", self.accel_group, ord('['),
119
                                         0, 0)
120
        self.back_button.connect("clicked", self._back_clicked_cb)
121
        hbox.pack_start(self.back_button, expand=False, fill=True)
122
        self.back_button.show()
123
124
        self.fwd_button = gtk.Button(stock=gtk.STOCK_GO_FORWARD)
44 by David Allouche
reorganise branch window
125
        self.fwd_button.set_relief(gtk.RELIEF_NONE)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
126
        self.fwd_button.add_accelerator("clicked", self.accel_group, ord(']'),
127
                                        0, 0)
128
        self.fwd_button.connect("clicked", self._fwd_clicked_cb)
129
        hbox.pack_start(self.fwd_button, expand=False, fill=True)
130
        self.fwd_button.show()
131
44 by David Allouche
reorganise branch window
132
        return frame
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
133
134
    def construct_bottom(self):
135
        """Construct the bottom half of the window."""
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
136
        from bzrlib.plugins.gtk.logview import LogView
256.2.23 by Gary van der Merwe
Show Children
137
        self.logview = LogView(None, True, [], True)
44 by David Allouche
reorganise branch window
138
        (width, height) = self.get_size()
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
139
        self.logview.set_size_request(width, int(height / 2.5))
140
        self.logview.show()
141
        self.logview.set_show_callback(self._show_clicked_cb)
142
        self.logview.set_go_callback(self._go_clicked_cb)
143
        return self.logview
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
144
40 by David Allouche
remove --robust, pyflakes fixes, update README
145
    def set_branch(self, branch, start, maxnum):
1 by Scott James Remnant
Commit the first version of bzrk.
146
        """Set the branch and start position for this window.
147
148
        Creates a new TreeModel and populates it with information about
149
        the new branch before updating the window title and model of the
150
        treeview itself.
151
        """
10 by Scott James Remnant
Add an extra window type, clicking the little icons next to a parent
152
        self.branch = branch
311 by Daniel Schierbeck
Moved branch locking from the treeview to the branchwin.
153
        self.branch.lock_read()
292.2.1 by Daniel Schierbeck
Changed title of the viz window to 'revision history'
154
        self.set_title(branch.nick + " - revision history")
303 by Daniel Schierbeck
Made basic signaling work.
155
        self.treeview.set_branch(branch, start, maxnum)
265.1.1 by Gary van der Merwe
Show bzr viz interface quickly.
156
    
275.1.5 by Daniel Schierbeck
Made windows close correctly on Ctrl-W and made the application quit on Ctrl-Q.
157
    def _on_key_pressed(self, widget, event):
158
        """ Key press event handler. """
159
        keyname = gtk.gdk.keyval_name(event.keyval)
160
        func = getattr(self, '_on_key_press_' + keyname, None)
161
        if func:
162
            return func(event)
163
164
    def _on_key_press_w(self, event):
165
        if event.state & gtk.gdk.CONTROL_MASK:
166
            self.destroy()
275.1.6 by Daniel Schierbeck
Made Ctrl-W call gtk.main_quit if the window has no parent.
167
            if self._parent is None:
168
                gtk.main_quit()
275.1.5 by Daniel Schierbeck
Made windows close correctly on Ctrl-W and made the application quit on Ctrl-Q.
169
170
    def _on_key_press_q(self, event):
171
        if event.state & gtk.gdk.CONTROL_MASK:
172
            gtk.main_quit()
265.1.1 by Gary van der Merwe
Show bzr viz interface quickly.
173
    
280.1.2 by Daniel Schierbeck
Switched to handle the 'changed' signal from the treeview's treeselection instead of the 'cursor-changed' signal from the treeview itself, allowing more flexibility (particularly the ability to handle programmatic selections)
174
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
175
        """callback for when the treeview changes."""
176
        revision = self.treeview.get_revision()
177
        parents  = self.treeview.get_parents()
178
        children = self.treeview.get_children()
179
180
        if revision is not None:
256.2.62 by Gary van der Merwe
Merge Trunk.
181
            self.back_button.set_sensitive(len(parents) > 0)
182
            self.fwd_button.set_sensitive(len(children) > 0)
280.1.2 by Daniel Schierbeck
Switched to handle the 'changed' signal from the treeview's treeselection instead of the 'cursor-changed' signal from the treeview itself, allowing more flexibility (particularly the ability to handle programmatic selections)
183
            tags = []
184
            if self.branch.supports_tags():
185
                tagdict = self.branch.tags.get_reverse_tag_dict()
186
                if tagdict.has_key(revision.revision_id):
187
                    tags = tagdict[revision.revision_id]
256.2.62 by Gary van der Merwe
Merge Trunk.
188
            self.logview.set_revision(revision, tags, children)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
189
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
190
    def _back_clicked_cb(self, *args):
191
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
192
        self.treeview.back()
193
        
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
194
    def _fwd_clicked_cb(self, *args):
195
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
196
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
197
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
198
    def _go_clicked_cb(self, revid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
199
        """Callback for when the go button for a parent is clicked."""
305 by Daniel Schierbeck
Moved revision selection to the new view.
200
        self.treeview.set_revision(revid)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
201
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
202
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
203
        """Callback for when the show button for a parent is clicked."""
308 by Daniel Schierbeck
Made Show Diff work again.
204
        self.treeview.show_diff(self.branch, revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
205
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
206