1
# -*- coding: UTF-8 -*-
2
"""Revision history view.
6
__copyright__ = "Copyright � 2005 Canonical Ltd."
7
__author__ = "Daniel Schierbeck <daniel.schierbeck@gmail.com>"
14
from linegraph import linegraph, same_branch
15
from graphcell import CellRendererGraph
16
from treemodel import TreeModel
18
class RevisionHistoryView(gtk.ScrolledWindow):
21
gtk.ScrolledWindow.__init__(self)
23
self.set_olicy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
24
self.set_shadow_type(gtk.SHADOW_IN)
26
self.contruct_treeview()
28
def construct_treeview(self):
29
self.treeview = gtk.TreeView()
31
self.treeview.set_rules_hint(True)
32
self.treeview.set_search_column(4)
34
self.treeview.get_selection().connect("changed",
35
self._on_selection_changed)
37
self.treeview.connect("row-activated",
38
self._on_revision_activated)
40
self.treeview.connect("button-release-event",
41
self._on_revision_selected)
43
self.treeview.set_property('fixed-height-mode', True)
45
self.add(self.treeview)
48
cell = gtk.CellRendererText()
49
cell.set_property("width-chars", 15)
50
cell.set_property("ellipsize", pango.ELLIPSIZE_END)
51
column = gtk.TreeViewColumn("Revision No")
52
column.set_resizable(True)
53
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
54
column.set_fixed_width(cell.get_size(self.treeview)[2])
55
column.pack_start(cell, expand=True)
56
column.add_attribute(cell, "text", treemodel.REVNO)
57
self.treeview.append_column(column)
59
self.graph_cell = CellRendererGraph()
60
self.graph_column = gtk.TreeViewColumn()
61
self.graph_column.set_resizable(True)
62
self.graph_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
63
self.graph_column.pack_start(self.graph_cell, expand=False)
64
self.graph_column.add_attribute(self.graph_cell, "node", treemodel.NODE)
65
self.graph_column.add_attribute(self.graph_cell, "in-lines", treemodel.LAST_LINES)
66
self.graph_column.add_attribute(self.graph_cell, "out-lines", treemodel.LINES)
67
self.treeview.append_column(self.graph_column)
69
cell = gtk.CellRendererText()
70
cell.set_property("width-chars", 65)
71
cell.set_property("ellipsize", pango.ELLIPSIZE_END)
72
column = gtk.TreeViewColumn("Message")
73
column.set_resizable(True)
74
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
75
column.set_fixed_width(cell.get_size(self.treeview)[2])
76
column.pack_start(cell, expand=True)
77
column.add_attribute(cell, "text", treemodel.MESSAGE)
78
self.treeview.append_column(column)
80
cell = gtk.CellRendererText()
81
cell.set_property("width-chars", 15)
82
cell.set_property("ellipsize", pango.ELLIPSIZE_END)
83
column = gtk.TreeViewColumn("Committer")
84
column.set_resizable(True)
85
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
86
column.set_fixed_width(cell.get_size(self.treeview)[2])
87
column.pack_start(cell, expand=True)
88
column.add_attribute(cell, "text", treemodel.COMMITER)
89
self.treeview.append_column(column)
91
def set_branch(self, branch, start, maxnum):
94
gobject.idle_add(self.populate, start, maxnum)
96
def populate(self, start, maxnum):
97
self.branch.lock_read()
99
(linegraphdata, index, columns_len) = linegraph(self.branch,
103
self.model = TreeModel(self.branch, linegraphdata)
104
self.graph_cell.columns_len = columns_len
105
width = self.graph_cell.get_size(self.treeview)[2]
106
self.graph_column.set_fixed_width(width)
107
self.graph_column.set_max_width(width)
109
self.treeview.set_model(self.model)
110
self.treeview.get_selection().select_path(0)
114
def _on_selection_changed(self, selection, *args):
115
"""Callback for when the treeview changes."""
116
(model, selected_rows) = selection.get_selected_rows()
117
if len(selected_rows) > 0:
118
iter = self.model.get_iter(selected_rows[0])
119
revision = self.model.get_value(iter, treemodel.REVISION)
120
parents = self.model.get_value(iter, treemodel.PARENTS)
121
children = self.model.get_value(iter, treemodel.CHILDREN)
123
self.back_button.set_sensitive(len(parents) > 0)
124
self.fwd_button.set_sensitive(len(children) > 0)
126
if self.branch.supports_tags():
127
tagdict = self.branch.tags.get_reverse_tag_dict()
128
if tagdict.has_key(revision.revision_id):
129
tags = tagdict[revision.revision_id]
130
self.logview.set_revision(revision, tags, children)
132
def _on_revision_selected(self, widget, event):
133
from bzrlib.plugins.gtk.revisionmenu import RevisionPopupMenu
134
if event.button == 3:
135
menu = RevisionPopupMenu(self.branch.repository,
136
[x.revision_id for x in self.selected_revisions()],
138
menu.popup(None, None, None, event.button, event.get_time())
140
def _on_revision_activated(self, widget, path, col):
141
# TODO: more than one parent
142
"""Callback for when a treeview row gets activated."""
143
revision_id = self.model[path][treemodel.REVID]
144
parents = self.model[path][treemodel.PARENTS]
145
if len(parents) == 0:
146
# Ignore revisions without parent
148
parent_id = parents[0]
149
self.show_diff(self.branch, revision_id, parent_id)
150
self.treeview.grab_focus()