/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
15
16
from bzrlib.osutils import format_date
17
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
18
from graph import distances, graph, same_branch
1 by Scott James Remnant
Commit the first version of bzrk.
19
from graphcell import CellRendererGraph
20
21
22
class BranchWindow(gtk.Window):
23
    """Branch window.
24
25
    This object represents and manages a single window containing information
26
    for a particular branch.
27
    """
28
10 by Scott James Remnant
Add an extra window type, clicking the little icons next to a parent
29
    def __init__(self, app=None):
1 by Scott James Remnant
Commit the first version of bzrk.
30
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
31
        self.set_border_width(0)
32
        self.set_title("bzrk")
33
10 by Scott James Remnant
Add an extra window type, clicking the little icons next to a parent
34
        self.app = app
35
1 by Scott James Remnant
Commit the first version of bzrk.
36
        # Use three-quarters of the screen by default
37
        screen = self.get_screen()
4 by Scott James Remnant
Use the size of the first monitor rather than the entire screen
38
        monitor = screen.get_monitor_geometry(0)
39
        width = int(monitor.width * 0.75)
40
        height = int(monitor.height * 0.75)
1 by Scott James Remnant
Commit the first version of bzrk.
41
        self.set_default_size(width, height)
42
43
        # FIXME AndyFitz!
44
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
45
        self.set_icon(icon)
46
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
47
        self.accel_group = gtk.AccelGroup()
48
        self.add_accel_group(self.accel_group)
49
1 by Scott James Remnant
Commit the first version of bzrk.
50
        self.construct()
51
52
    def construct(self):
53
        """Construct the window contents."""
44 by David Allouche
reorganise branch window
54
        vbox = gtk.VBox(spacing=0)
55
        self.add(vbox)
56
57
        vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
58
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
59
        paned = gtk.VPaned()
60
        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,
61
        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
62
        paned.show()
44 by David Allouche
reorganise branch window
63
        vbox.pack_start(paned, expand=True, fill=True)
64
        vbox.set_focus_child(paned)
65
66
        vbox.show()
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
67
68
    def construct_top(self):
69
        """Construct the top-half of the window."""
1 by Scott James Remnant
Commit the first version of bzrk.
70
        scrollwin = gtk.ScrolledWindow()
71
        scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
72
        scrollwin.set_shadow_type(gtk.SHADOW_IN)
73
        scrollwin.show()
74
75
        self.treeview = gtk.TreeView()
76
        self.treeview.set_rules_hint(True)
77
        self.treeview.set_search_column(4)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
78
        self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
47 by Wouter van Heyst
rename _treeview_clicked_cb to correcter _treeview_row_activated_cb
79
        self.treeview.connect("row-activated", self._treeview_row_activated_cb)
1 by Scott James Remnant
Commit the first version of bzrk.
80
        scrollwin.add(self.treeview)
81
        self.treeview.show()
82
83
        cell = CellRendererGraph()
84
        column = gtk.TreeViewColumn()
45 by David Allouche
resizable graph column
85
        column.set_resizable(True)
1 by Scott James Remnant
Commit the first version of bzrk.
86
        column.pack_start(cell, expand=False)
87
        column.add_attribute(cell, "node", 1)
88
        column.add_attribute(cell, "in-lines", 2)
89
        column.add_attribute(cell, "out-lines", 3)
90
        self.treeview.append_column(column)
91
92
        cell = gtk.CellRendererText()
93
        cell.set_property("width-chars", 40)
94
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
95
        column = gtk.TreeViewColumn("Message")
96
        column.set_resizable(True)
97
        column.pack_start(cell, expand=True)
98
        column.add_attribute(cell, "text", 4)
99
        self.treeview.append_column(column)
100
101
        cell = gtk.CellRendererText()
102
        cell.set_property("width-chars", 40)
103
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
104
        column = gtk.TreeViewColumn("Committer")
105
        column.set_resizable(True)
106
        column.pack_start(cell, expand=True)
107
        column.add_attribute(cell, "text", 5)
108
        self.treeview.append_column(column)
109
110
        cell = gtk.CellRendererText()
111
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
112
        column = gtk.TreeViewColumn("Date")
113
        column.set_resizable(True)
114
        column.pack_start(cell, expand=True)
115
        column.add_attribute(cell, "text", 6)
116
        self.treeview.append_column(column)
117
44 by David Allouche
reorganise branch window
118
        return scrollwin
119
120
    def construct_navigation(self):
121
        """Construct the navigation buttons."""
122
        frame = gtk.Frame()
123
        frame.set_shadow_type(gtk.SHADOW_OUT)
124
        frame.show()
125
        
126
        hbox = gtk.HBox(spacing=12)
127
        frame.add(hbox)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
128
        hbox.show()
129
130
        self.back_button = gtk.Button(stock=gtk.STOCK_GO_BACK)
44 by David Allouche
reorganise branch window
131
        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
132
        self.back_button.add_accelerator("clicked", self.accel_group, ord('['),
133
                                         0, 0)
134
        self.back_button.connect("clicked", self._back_clicked_cb)
135
        hbox.pack_start(self.back_button, expand=False, fill=True)
136
        self.back_button.show()
137
138
        self.fwd_button = gtk.Button(stock=gtk.STOCK_GO_FORWARD)
44 by David Allouche
reorganise branch window
139
        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
140
        self.fwd_button.add_accelerator("clicked", self.accel_group, ord(']'),
141
                                        0, 0)
142
        self.fwd_button.connect("clicked", self._fwd_clicked_cb)
143
        hbox.pack_start(self.fwd_button, expand=False, fill=True)
144
        self.fwd_button.show()
145
44 by David Allouche
reorganise branch window
146
        return frame
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
147
148
    def construct_bottom(self):
149
        """Construct the bottom half of the window."""
44 by David Allouche
reorganise branch window
150
        scrollwin = gtk.ScrolledWindow()
151
        scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
152
        scrollwin.set_shadow_type(gtk.SHADOW_NONE)
153
        (width, height) = self.get_size()
154
        scrollwin.set_size_request(width, int(height / 2.5))
155
        scrollwin.show()
156
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
157
        vbox = gtk.VBox(False, spacing=6)
43 by David Allouche
parent buttons look like buttons, some layout changes
158
        vbox.set_border_width(6)
44 by David Allouche
reorganise branch window
159
        scrollwin.add_with_viewport(vbox)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
160
        vbox.show()
161
43 by David Allouche
parent buttons look like buttons, some layout changes
162
        table = gtk.Table(rows=4, columns=2)
163
        table.set_row_spacings(6)
164
        table.set_col_spacings(6)
165
        vbox.pack_start(table, expand=False, fill=True)
166
        table.show()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
167
8 by Scott James Remnant
Fiddle around with the alignment and size allocations a little
168
        align = gtk.Alignment(0.0, 0.5)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
169
        label = gtk.Label()
170
        label.set_markup("<b>Revision:</b>")
171
        align.add(label)
43 by David Allouche
parent buttons look like buttons, some layout changes
172
        table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
173
        label.show()
174
        align.show()
175
8 by Scott James Remnant
Fiddle around with the alignment and size allocations a little
176
        align = gtk.Alignment(0.0, 0.5)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
177
        self.revid_label = gtk.Label()
178
        self.revid_label.set_selectable(True)
179
        align.add(self.revid_label)
43 by David Allouche
parent buttons look like buttons, some layout changes
180
        table.attach(align, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
181
        self.revid_label.show()
182
        align.show()
183
8 by Scott James Remnant
Fiddle around with the alignment and size allocations a little
184
        align = gtk.Alignment(0.0, 0.5)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
185
        label = gtk.Label()
186
        label.set_markup("<b>Committer:</b>")
187
        align.add(label)
43 by David Allouche
parent buttons look like buttons, some layout changes
188
        table.attach(align, 0, 1, 1, 2, gtk.FILL, gtk.FILL)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
189
        label.show()
190
        align.show()
191
8 by Scott James Remnant
Fiddle around with the alignment and size allocations a little
192
        align = gtk.Alignment(0.0, 0.5)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
193
        self.committer_label = gtk.Label()
194
        self.committer_label.set_selectable(True)
195
        align.add(self.committer_label)
43 by David Allouche
parent buttons look like buttons, some layout changes
196
        table.attach(align, 1, 2, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
197
        self.committer_label.show()
198
        align.show()
199
8 by Scott James Remnant
Fiddle around with the alignment and size allocations a little
200
        align = gtk.Alignment(0.0, 0.5)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
201
        label = gtk.Label()
19.1.1 by Erik Bagfors
Support for showing the branch nick
202
        label.set_markup("<b>Branch nick:</b>")
203
        align.add(label)
43 by David Allouche
parent buttons look like buttons, some layout changes
204
        table.attach(align, 0, 1, 2, 3, gtk.FILL, gtk.FILL)
19.1.1 by Erik Bagfors
Support for showing the branch nick
205
        label.show()
206
        align.show()
207
208
        align = gtk.Alignment(0.0, 0.5)
209
        self.branchnick_label = gtk.Label()
210
        self.branchnick_label.set_selectable(True)
211
        align.add(self.branchnick_label)
43 by David Allouche
parent buttons look like buttons, some layout changes
212
        table.attach(align, 1, 2, 2, 3, gtk.EXPAND | gtk.FILL, gtk.FILL)
19.1.1 by Erik Bagfors
Support for showing the branch nick
213
        self.branchnick_label.show()
214
        align.show()
215
216
        align = gtk.Alignment(0.0, 0.5)
217
        label = gtk.Label()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
218
        label.set_markup("<b>Timestamp:</b>")
219
        align.add(label)
43 by David Allouche
parent buttons look like buttons, some layout changes
220
        table.attach(align, 0, 1, 3, 4, gtk.FILL, gtk.FILL)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
221
        label.show()
222
        align.show()
223
8 by Scott James Remnant
Fiddle around with the alignment and size allocations a little
224
        align = gtk.Alignment(0.0, 0.5)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
225
        self.timestamp_label = gtk.Label()
226
        self.timestamp_label.set_selectable(True)
227
        align.add(self.timestamp_label)
43 by David Allouche
parent buttons look like buttons, some layout changes
228
        table.attach(align, 1, 2, 3, 4, gtk.EXPAND | gtk.FILL, gtk.FILL)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
229
        self.timestamp_label.show()
230
        align.show()
231
43 by David Allouche
parent buttons look like buttons, some layout changes
232
        self.parents_table = gtk.Table(rows=1, columns=2)
233
        self.parents_table.set_row_spacings(3)
234
        self.parents_table.set_col_spacings(6)
235
        self.parents_table.show()
236
        vbox.pack_start(self.parents_table, expand=False, fill=True)
237
        self.parents_widgets = []
238
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
239
        label = gtk.Label()
240
        label.set_markup("<b>Parents:</b>")
43 by David Allouche
parent buttons look like buttons, some layout changes
241
        align = gtk.Alignment(0.0, 0.5)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
242
        align.add(label)
43 by David Allouche
parent buttons look like buttons, some layout changes
243
        self.parents_table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
244
        label.show()
245
        align.show()
246
247
        self.message_buffer = gtk.TextBuffer()
248
        textview = gtk.TextView(self.message_buffer)
249
        textview.set_editable(False)
250
        textview.set_wrap_mode(gtk.WRAP_WORD)
251
        textview.modify_font(pango.FontDescription("Monospace"))
44 by David Allouche
reorganise branch window
252
        vbox.pack_start(textview, expand=True, fill=True)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
253
        textview.show()
254
44 by David Allouche
reorganise branch window
255
        return scrollwin
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
256
40 by David Allouche
remove --robust, pyflakes fixes, update README
257
    def set_branch(self, branch, start, maxnum):
1 by Scott James Remnant
Commit the first version of bzrk.
258
        """Set the branch and start position for this window.
259
260
        Creates a new TreeModel and populates it with information about
261
        the new branch before updating the window title and model of the
262
        treeview itself.
263
        """
10 by Scott James Remnant
Add an extra window type, clicking the little icons next to a parent
264
        self.branch = branch
265
1 by Scott James Remnant
Commit the first version of bzrk.
266
        # [ revision, node, last_lines, lines, message, committer, timestamp ]
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
267
        self.model = gtk.ListStore(gobject.TYPE_PYOBJECT,
268
                                   gobject.TYPE_PYOBJECT,
269
                                   gobject.TYPE_PYOBJECT,
270
                                   gobject.TYPE_PYOBJECT,
271
                                   str, str, str)
272
        self.index = {}
273
        index = 0
1 by Scott James Remnant
Commit the first version of bzrk.
274
275
        last_lines = []
40 by David Allouche
remove --robust, pyflakes fixes, update README
276
        (self.revisions, colours, self.children, self.parent_ids,
41 by David Allouche
restore --maxnum functionality, reflush some comments
277
         merge_sorted) = distances(branch, start)
278
        for (index, (revision, node, lines)) in enumerate(graph(
279
                self.revisions, colours, merge_sorted)):
280
            # FIXME: at this point we should be able to show the graph order
281
            # and lines with no message or commit data - and then incrementally
282
            # fill the timestamp, committer etc data as desired.
1 by Scott James Remnant
Commit the first version of bzrk.
283
            message = revision.message.split("\n")[0]
284
            if revision.committer is not None:
285
                timestamp = format_date(revision.timestamp, revision.timezone)
286
            else:
287
                timestamp = None
41 by David Allouche
restore --maxnum functionality, reflush some comments
288
            self.model.append([revision, node, last_lines, lines,
289
                               message, revision.committer, timestamp])
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
290
            self.index[revision] = index
1 by Scott James Remnant
Commit the first version of bzrk.
291
            last_lines = lines
41 by David Allouche
restore --maxnum functionality, reflush some comments
292
            if maxnum is not None and index > maxnum:
293
                break
1 by Scott James Remnant
Commit the first version of bzrk.
294
36.1.2 by Jamie Wilkinson
put the branch nick in the titlebar instead of the path basename (which didn't work anyway)
295
        self.set_title(branch.nick + " - bzrk")
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
296
        self.treeview.set_model(self.model)
297
298
    def _treeview_cursor_cb(self, *args):
299
        """Callback for when the treeview cursor changes."""
300
        (path, col) = self.treeview.get_cursor()
301
        revision = self.model[path][0]
302
20 by David Allouche
ignore redundent parents
303
        self.back_button.set_sensitive(len(self.parent_ids[revision]) > 0)
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
304
        self.fwd_button.set_sensitive(len(self.children[revision]) > 0)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
305
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
306
        if revision.committer is not None:
37.1.1 by Robert Collins
Retab branchwin.py
307
            branchnick = ""
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
308
            committer = revision.committer
309
            timestamp = format_date(revision.timestamp, revision.timezone)
310
            message = revision.message
37.1.1 by Robert Collins
Retab branchwin.py
311
            try:
312
                branchnick = revision.properties['branch-nick']
313
            except KeyError:
314
                pass
19.1.1 by Erik Bagfors
Support for showing the branch nick
315
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
316
        else:
317
            committer = ""
318
            timestamp = ""
319
            message = ""
37.1.1 by Robert Collins
Retab branchwin.py
320
            branchnick = ""
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
321
322
        self.revid_label.set_text(revision.revision_id)
37.1.1 by Robert Collins
Retab branchwin.py
323
        self.branchnick_label.set_text(branchnick)
19.1.1 by Erik Bagfors
Support for showing the branch nick
324
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
325
        self.committer_label.set_text(committer)
326
        self.timestamp_label.set_text(timestamp)
327
        self.message_buffer.set_text(message)
328
329
        for widget in self.parents_widgets:
43 by David Allouche
parent buttons look like buttons, some layout changes
330
            self.parents_table.remove(widget)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
331
332
        self.parents_widgets = []
43 by David Allouche
parent buttons look like buttons, some layout changes
333
        self.parents_table.resize(max(len(self.parent_ids[revision]), 1), 2)
334
        
20 by David Allouche
ignore redundent parents
335
        for idx, parent_id in enumerate(self.parent_ids[revision]):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
336
            align = gtk.Alignment(0.0, 0.0)
337
            self.parents_widgets.append(align)
43 by David Allouche
parent buttons look like buttons, some layout changes
338
            self.parents_table.attach(align, 1, 2, idx, idx + 1,
339
                                      gtk.EXPAND | gtk.FILL, gtk.FILL)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
340
            align.show()
341
43 by David Allouche
parent buttons look like buttons, some layout changes
342
            hbox = gtk.HBox(False, spacing=6)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
343
            align.add(hbox)
344
            hbox.show()
345
43 by David Allouche
parent buttons look like buttons, some layout changes
346
            image = gtk.Image()
347
            image.set_from_stock(
348
                gtk.STOCK_FIND, gtk.ICON_SIZE_SMALL_TOOLBAR)
349
            image.show()
350
351
            button = gtk.Button()
352
            button.add(image)
353
            button.set_sensitive(self.app is not None)
354
            button.connect("clicked", self._show_clicked_cb,
355
                           revision.revision_id, parent_id)
356
            hbox.pack_start(button, expand=False, fill=True)
357
            button.show()
358
45.1.1 by Michael Ellerman
Instead of having a "jump to revision" button with a dubious icon, make
359
            button = gtk.Button(parent_id)
70 by Jelmer Vernooij
Don't treat underscores in revision ids as special characters
360
            button.set_use_underline(False)
45.1.1 by Michael Ellerman
Instead of having a "jump to revision" button with a dubious icon, make
361
            button.connect("clicked", self._go_clicked_cb, parent_id)
362
            hbox.pack_start(button, expand=False, fill=True)
363
            button.show()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
364
365
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
366
    def _back_clicked_cb(self, *args):
367
        """Callback for when the back button is clicked."""
368
        (path, col) = self.treeview.get_cursor()
369
        revision = self.model[path][0]
20 by David Allouche
ignore redundent parents
370
        if not len(self.parent_ids[revision]):
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
371
            return
372
20 by David Allouche
ignore redundent parents
373
        for parent_id in self.parent_ids[revision]:
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
374
            parent = self.revisions[parent_id]
375
            if same_branch(revision, parent):
376
                self.treeview.set_cursor(self.index[parent])
377
                break
378
        else:
20 by David Allouche
ignore redundent parents
379
            next = self.revisions[self.parent_ids[revision][0]]
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
380
            self.treeview.set_cursor(self.index[next])
13 by Scott James Remnant
Keep the focus on the treeview
381
        self.treeview.grab_focus()
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
382
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
383
    def _fwd_clicked_cb(self, *args):
384
        """Callback for when the forward button is clicked."""
385
        (path, col) = self.treeview.get_cursor()
386
        revision = self.model[path][0]
387
        if not len(self.children[revision]):
388
            return
389
390
        for child in self.children[revision]:
391
            if same_branch(child, revision):
392
                self.treeview.set_cursor(self.index[child])
393
                break
394
        else:
395
            prev = list(self.children[revision])[0]
396
            self.treeview.set_cursor(self.index[prev])
13 by Scott James Remnant
Keep the focus on the treeview
397
        self.treeview.grab_focus()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
398
399
    def _go_clicked_cb(self, widget, revid):
400
        """Callback for when the go button for a parent is clicked."""
401
        self.treeview.set_cursor(self.index[self.revisions[revid]])
13 by Scott James Remnant
Keep the focus on the treeview
402
        self.treeview.grab_focus()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
403
10 by Scott James Remnant
Add an extra window type, clicking the little icons next to a parent
404
    def _show_clicked_cb(self, widget, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
405
        """Callback for when the show button for a parent is clicked."""
10 by Scott James Remnant
Add an extra window type, clicking the little icons next to a parent
406
        if self.app is not None:
407
            self.app.show_diff(self.branch, revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
408
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
409
47 by Wouter van Heyst
rename _treeview_clicked_cb to correcter _treeview_row_activated_cb
410
    def _treeview_row_activated_cb(self, widget, path, col):
46 by Wouter van Heyst
show diff on row activation, LP# 44591
411
        # TODO: more than one parent
47 by Wouter van Heyst
rename _treeview_clicked_cb to correcter _treeview_row_activated_cb
412
        """Callback for when a treeview row gets activated."""
46 by Wouter van Heyst
show diff on row activation, LP# 44591
413
        revision = self.model[path][0]
74 by Jelmer Vernooij
Fix exception when double-clicking revision without parents.
414
        if len(self.parent_ids[revision]) == 0:
415
            # Ignore revisions without parent
416
            return
46 by Wouter van Heyst
show diff on row activation, LP# 44591
417
        parent_id = self.parent_ids[revision][0]
418
        if self.app is not None:
419
            self.app.show_diff(self.branch, revision.revision_id, parent_id)
420
        self.treeview.grab_focus()