/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
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
31
    def __init__(self, branch, start, maxnum, 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)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
34
35
        self.branch = branch
36
        self.start  = start
37
        self.maxnum = maxnum
38
39
        self.set_title(branch.nick + " - revision history")
1 by Scott James Remnant
Commit the first version of bzrk.
40
275.1.6 by Daniel Schierbeck
Made Ctrl-W call gtk.main_quit if the window has no parent.
41
        self._parent = parent
42
43
        self.connect('key-press-event', self._on_key_pressed)
275.1.1 by Daniel Schierbeck
Close branch visualization window when 'destroy' message is received.
44
1 by Scott James Remnant
Commit the first version of bzrk.
45
        # Use three-quarters of the screen by default
46
        screen = self.get_screen()
4 by Scott James Remnant
Use the size of the first monitor rather than the entire screen
47
        monitor = screen.get_monitor_geometry(0)
48
        width = int(monitor.width * 0.75)
49
        height = int(monitor.height * 0.75)
1 by Scott James Remnant
Commit the first version of bzrk.
50
        self.set_default_size(width, height)
51
52
        # FIXME AndyFitz!
53
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
54
        self.set_icon(icon)
55
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
56
        self.accel_group = gtk.AccelGroup()
57
        self.add_accel_group(self.accel_group)
58
1 by Scott James Remnant
Commit the first version of bzrk.
59
        self.construct()
60
61
    def construct(self):
62
        """Construct the window contents."""
44 by David Allouche
reorganise branch window
63
        vbox = gtk.VBox(spacing=0)
64
        self.add(vbox)
65
66
        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.
67
        vbox.pack_start(self.construct_loading_msg(), expand=False, fill=True)
68
        
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
69
        paned = gtk.VPaned()
70
        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,
71
        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
72
        paned.show()
44 by David Allouche
reorganise branch window
73
        vbox.pack_start(paned, expand=True, fill=True)
74
        vbox.set_focus_child(paned)
75
76
        vbox.show()
280.2.1 by Gary van der Merwe
Add a message to the viz window to indicate that graph is still loading.
77
    
78
    def construct_loading_msg(self):
79
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
80
                                                 gtk.ICON_SIZE_BUTTON)
81
        image_loading.show()
82
        
83
        label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
84
        label_loading.set_alignment(0.0, 0.5)        
85
        label_loading.show()
86
        
87
        self.loading_msg_box = gtk.HBox()
88
        self.loading_msg_box.set_spacing(5)
89
        self.loading_msg_box.set_border_width(5)        
90
        self.loading_msg_box.pack_start(image_loading, False, False)
91
        self.loading_msg_box.pack_start(label_loading, True, True)
92
        self.loading_msg_box.show()
93
        
94
        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
95
96
    def construct_top(self):
97
        """Construct the top-half of the window."""
303 by Daniel Schierbeck
Made basic signaling work.
98
        self.treeview = TreeView()
99
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
100
        self.treeview.set_branch(self.branch, self.start, self.maxnum)
101
310 by Daniel Schierbeck
Moved to using custom signal for handling revision selections.
102
        self.treeview.connect("revision-selected",
303 by Daniel Schierbeck
Made basic signaling work.
103
                self._treeselection_changed_cb)
104
307 by Daniel Schierbeck
Made load notification work again.
105
        self.treeview.connect('revisions-loaded', 
106
                lambda x: self.loading_msg_box.hide())
107
1 by Scott James Remnant
Commit the first version of bzrk.
108
        self.treeview.show()
109
303 by Daniel Schierbeck
Made basic signaling work.
110
        return self.treeview
44 by David Allouche
reorganise branch window
111
112
    def construct_navigation(self):
113
        """Construct the navigation buttons."""
114
        frame = gtk.Frame()
115
        frame.set_shadow_type(gtk.SHADOW_OUT)
116
        frame.show()
117
        
118
        hbox = gtk.HBox(spacing=12)
119
        frame.add(hbox)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
120
        hbox.show()
121
122
        self.back_button = gtk.Button(stock=gtk.STOCK_GO_BACK)
44 by David Allouche
reorganise branch window
123
        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
124
        self.back_button.add_accelerator("clicked", self.accel_group, ord('['),
125
                                         0, 0)
126
        self.back_button.connect("clicked", self._back_clicked_cb)
127
        hbox.pack_start(self.back_button, expand=False, fill=True)
128
        self.back_button.show()
129
130
        self.fwd_button = gtk.Button(stock=gtk.STOCK_GO_FORWARD)
44 by David Allouche
reorganise branch window
131
        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
132
        self.fwd_button.add_accelerator("clicked", self.accel_group, ord(']'),
133
                                        0, 0)
134
        self.fwd_button.connect("clicked", self._fwd_clicked_cb)
135
        hbox.pack_start(self.fwd_button, expand=False, fill=True)
136
        self.fwd_button.show()
137
44 by David Allouche
reorganise branch window
138
        return frame
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
139
140
    def construct_bottom(self):
141
        """Construct the bottom half of the window."""
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
142
        from bzrlib.plugins.gtk.logview import LogView
256.2.23 by Gary van der Merwe
Show Children
143
        self.logview = LogView(None, True, [], True)
44 by David Allouche
reorganise branch window
144
        (width, height) = self.get_size()
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
145
        self.logview.set_size_request(width, int(height / 2.5))
146
        self.logview.show()
147
        self.logview.set_show_callback(self._show_clicked_cb)
148
        self.logview.set_go_callback(self._go_clicked_cb)
149
        return self.logview
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
150
275.1.5 by Daniel Schierbeck
Made windows close correctly on Ctrl-W and made the application quit on Ctrl-Q.
151
    def _on_key_pressed(self, widget, event):
152
        """ Key press event handler. """
153
        keyname = gtk.gdk.keyval_name(event.keyval)
154
        func = getattr(self, '_on_key_press_' + keyname, None)
155
        if func:
156
            return func(event)
157
158
    def _on_key_press_w(self, event):
159
        if event.state & gtk.gdk.CONTROL_MASK:
160
            self.destroy()
275.1.6 by Daniel Schierbeck
Made Ctrl-W call gtk.main_quit if the window has no parent.
161
            if self._parent is None:
162
                gtk.main_quit()
275.1.5 by Daniel Schierbeck
Made windows close correctly on Ctrl-W and made the application quit on Ctrl-Q.
163
164
    def _on_key_press_q(self, event):
165
        if event.state & gtk.gdk.CONTROL_MASK:
166
            gtk.main_quit()
265.1.1 by Gary van der Merwe
Show bzr viz interface quickly.
167
    
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)
168
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
169
        """callback for when the treeview changes."""
170
        revision = self.treeview.get_revision()
171
        parents  = self.treeview.get_parents()
172
        children = self.treeview.get_children()
173
174
        if revision is not None:
256.2.62 by Gary van der Merwe
Merge Trunk.
175
            self.back_button.set_sensitive(len(parents) > 0)
176
            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)
177
            tags = []
178
            if self.branch.supports_tags():
179
                tagdict = self.branch.tags.get_reverse_tag_dict()
180
                if tagdict.has_key(revision.revision_id):
181
                    tags = tagdict[revision.revision_id]
256.2.62 by Gary van der Merwe
Merge Trunk.
182
            self.logview.set_revision(revision, tags, children)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
183
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
184
    def _back_clicked_cb(self, *args):
185
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
186
        self.treeview.back()
187
        
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
188
    def _fwd_clicked_cb(self, *args):
189
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
190
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
191
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
192
    def _go_clicked_cb(self, revid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
193
        """Callback for when the go button for a parent is clicked."""
305 by Daniel Schierbeck
Moved revision selection to the new view.
194
        self.treeview.set_revision(revid)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
195
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
196
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
197
        """Callback for when the show button for a parent is clicked."""
308 by Daniel Schierbeck
Made Show Diff work again.
198
        self.treeview.show_diff(self.branch, revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
199
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
200