/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
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
17
from bzrlib.plugins.gtk.window import Window
1 by Scott James Remnant
Commit the first version of bzrk.
18
from bzrlib.osutils import format_date
19
256.2.5 by Gary van der Merwe
Oops - Renamed file without changeing import lines
20
from linegraph import linegraph, same_branch
1 by Scott James Remnant
Commit the first version of bzrk.
21
from graphcell import CellRendererGraph
256.2.29 by Gary van der Merwe
Implement a TreeModel that loads revisions incrementaly.
22
from treemodel import TreeModel
303 by Daniel Schierbeck
Made basic signaling work.
23
from treeview  import TreeView
1 by Scott James Remnant
Commit the first version of bzrk.
24
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
25
class BranchWindow(Window):
1 by Scott James Remnant
Commit the first version of bzrk.
26
    """Branch window.
27
28
    This object represents and manages a single window containing information
29
    for a particular branch.
30
    """
31
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
32
    def __init__(self, branch, start, maxnum, parent=None):
322 by Jelmer Vernooij
Add docstrings.
33
        """Create a new BranchWindow.
34
35
        :param branch: Branch object for branch to show.
36
        :param start: Revision id of top revision.
37
        :param maxnum: Maximum number of revisions to display, 
38
                       None for no limit.
39
        """
40
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
41
        Window.__init__(self, parent=parent)
1 by Scott James Remnant
Commit the first version of bzrk.
42
        self.set_border_width(0)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
43
44
        self.branch = branch
45
        self.start  = start
46
        self.maxnum = maxnum
47
48
        self.set_title(branch.nick + " - revision history")
1 by Scott James Remnant
Commit the first version of bzrk.
49
50
        # Use three-quarters of the screen by default
51
        screen = self.get_screen()
4 by Scott James Remnant
Use the size of the first monitor rather than the entire screen
52
        monitor = screen.get_monitor_geometry(0)
53
        width = int(monitor.width * 0.75)
54
        height = int(monitor.height * 0.75)
1 by Scott James Remnant
Commit the first version of bzrk.
55
        self.set_default_size(width, height)
56
57
        # FIXME AndyFitz!
58
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
59
        self.set_icon(icon)
60
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
61
        self.accel_group = gtk.AccelGroup()
62
        self.add_accel_group(self.accel_group)
63
1 by Scott James Remnant
Commit the first version of bzrk.
64
        self.construct()
65
66
    def construct(self):
67
        """Construct the window contents."""
327.1.1 by Daniel Schierbeck
Added spacing between toolbar and treeview in the viz.
68
        vbox = gtk.VBox(spacing=5)
44 by David Allouche
reorganise branch window
69
        self.add(vbox)
70
71
        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.
72
        vbox.pack_start(self.construct_loading_msg(), expand=False, fill=True)
73
        
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
74
        paned = gtk.VPaned()
75
        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,
76
        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
77
        paned.show()
44 by David Allouche
reorganise branch window
78
        vbox.pack_start(paned, expand=True, fill=True)
79
        vbox.set_focus_child(paned)
80
81
        vbox.show()
280.2.1 by Gary van der Merwe
Add a message to the viz window to indicate that graph is still loading.
82
    
83
    def construct_loading_msg(self):
84
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
85
                                                 gtk.ICON_SIZE_BUTTON)
86
        image_loading.show()
87
        
88
        label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
89
        label_loading.set_alignment(0.0, 0.5)        
90
        label_loading.show()
91
        
92
        self.loading_msg_box = gtk.HBox()
93
        self.loading_msg_box.set_spacing(5)
94
        self.loading_msg_box.set_border_width(5)        
95
        self.loading_msg_box.pack_start(image_loading, False, False)
96
        self.loading_msg_box.pack_start(label_loading, True, True)
97
        self.loading_msg_box.show()
98
        
99
        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
100
101
    def construct_top(self):
102
        """Construct the top-half of the window."""
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
103
        # FIXME: Make broken_line_length configurable
104
        self.treeview = TreeView(self.branch, self.start, self.maxnum, 32)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
105
310 by Daniel Schierbeck
Moved to using custom signal for handling revision selections.
106
        self.treeview.connect("revision-selected",
303 by Daniel Schierbeck
Made basic signaling work.
107
                self._treeselection_changed_cb)
108
307 by Daniel Schierbeck
Made load notification work again.
109
        self.treeview.connect('revisions-loaded', 
110
                lambda x: self.loading_msg_box.hide())
111
1 by Scott James Remnant
Commit the first version of bzrk.
112
        self.treeview.show()
113
303 by Daniel Schierbeck
Made basic signaling work.
114
        return self.treeview
44 by David Allouche
reorganise branch window
115
116
    def construct_navigation(self):
117
        """Construct the navigation buttons."""
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
118
        self.toolbar = gtk.Toolbar()
119
        self.toolbar.set_style(gtk.TOOLBAR_BOTH_HORIZ)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
120
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
121
        self.back_button = gtk.ToolButton(stock_id=gtk.STOCK_GO_BACK)
122
        self.back_button.set_is_important(True)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
123
        self.back_button.add_accelerator("clicked", self.accel_group, ord('['),
124
                                         0, 0)
125
        self.back_button.connect("clicked", self._back_clicked_cb)
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
126
        self.toolbar.insert(self.back_button, -1)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
127
        self.back_button.show()
128
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
129
        self.fwd_button = gtk.ToolButton(stock_id=gtk.STOCK_GO_FORWARD)
130
        self.fwd_button.set_is_important(True)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
131
        self.fwd_button.add_accelerator("clicked", self.accel_group, ord(']'),
132
                                        0, 0)
133
        self.fwd_button.connect("clicked", self._fwd_clicked_cb)
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
134
        self.toolbar.insert(self.fwd_button, -1)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
135
        self.fwd_button.show()
136
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
137
        self.toolbar.show()
138
139
        return self.toolbar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
140
141
    def construct_bottom(self):
142
        """Construct the bottom half of the window."""
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
143
        from bzrlib.plugins.gtk.logview import LogView
324.2.4 by Daniel Schierbeck
Added 'Changes' page to logview.
144
        self.logview = LogView(None, True, [], True, branch=self.branch)
44 by David Allouche
reorganise branch window
145
        (width, height) = self.get_size()
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
146
        self.logview.set_size_request(width, int(height / 2.5))
147
        self.logview.show()
148
        self.logview.set_show_callback(self._show_clicked_cb)
149
        self.logview.set_go_callback(self._go_clicked_cb)
150
        return self.logview
265.1.1 by Gary van der Merwe
Show bzr viz interface quickly.
151
    
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)
152
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
153
        """callback for when the treeview changes."""
154
        revision = self.treeview.get_revision()
155
        parents  = self.treeview.get_parents()
156
        children = self.treeview.get_children()
157
158
        if revision is not None:
256.2.62 by Gary van der Merwe
Merge Trunk.
159
            self.back_button.set_sensitive(len(parents) > 0)
160
            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)
161
            tags = []
162
            if self.branch.supports_tags():
163
                tagdict = self.branch.tags.get_reverse_tag_dict()
164
                if tagdict.has_key(revision.revision_id):
165
                    tags = tagdict[revision.revision_id]
256.2.62 by Gary van der Merwe
Merge Trunk.
166
            self.logview.set_revision(revision, tags, children)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
167
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
168
    def _back_clicked_cb(self, *args):
169
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
170
        self.treeview.back()
171
        
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
172
    def _fwd_clicked_cb(self, *args):
173
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
174
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
175
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
176
    def _go_clicked_cb(self, revid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
177
        """Callback for when the go button for a parent is clicked."""
305 by Daniel Schierbeck
Moved revision selection to the new view.
178
        self.treeview.set_revision(revid)
152 by Jelmer Vernooij
Cleanup some more code.
179
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
180
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
181
        """Callback for when the show button for a parent is clicked."""
308 by Daniel Schierbeck
Made Show Diff work again.
182
        self.treeview.show_diff(self.branch, revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
183
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
184