/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
1
# -*- coding: UTF-8 -*-
2
"""Revision history view.
3
4
"""
5
6
__copyright__ = "Copyright © 2005 Canonical Ltd."
7
__author__    = "Daniel Schierbeck <daniel.schierbeck@gmail.com>"
8
314 by Daniel Schierbeck
Moved branch locking into treeview.
9
import sys
10
import string
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
11
import gtk
12
import gobject
13
import pango
14
import re
303 by Daniel Schierbeck
Made basic signaling work.
15
import treemodel
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
16
17
from linegraph import linegraph, same_branch
18
from graphcell import CellRendererGraph
19
from treemodel import TreeModel
20
303 by Daniel Schierbeck
Made basic signaling work.
21
class TreeView(gtk.ScrolledWindow):
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
22
307 by Daniel Schierbeck
Made load notification work again.
23
    __gsignals__ = {
24
            'revisions-loaded': (gobject.SIGNAL_RUN_FIRST, 
25
                                 gobject.TYPE_NONE,
308 by Daniel Schierbeck
Made Show Diff work again.
26
                                 ()),
27
            'revision-selected': (gobject.SIGNAL_RUN_FIRST,
28
                                  gobject.TYPE_NONE,
29
                                  ())
307 by Daniel Schierbeck
Made load notification work again.
30
    }
31
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
32
    def __init__(self, branch, start, maxnum):
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
33
        gtk.ScrolledWindow.__init__(self)
34
303 by Daniel Schierbeck
Made basic signaling work.
35
        self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
36
        self.set_shadow_type(gtk.SHADOW_IN)
37
303 by Daniel Schierbeck
Made basic signaling work.
38
        self.construct_treeview()
39
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
40
        self.branch = branch
41
        self.branch.lock_read()
42
43
        gobject.idle_add(self.populate, start, maxnum)
44
303 by Daniel Schierbeck
Made basic signaling work.
45
        self.revision = None
46
        self.children = None
47
        self.parents  = None
48
314 by Daniel Schierbeck
Moved branch locking into treeview.
49
        self.connect('destroy', lambda w: self.branch.unlock())
50
303 by Daniel Schierbeck
Made basic signaling work.
51
    def get_revision(self):
52
        return self.revision
53
305 by Daniel Schierbeck
Moved revision selection to the new view.
54
    def set_revision(self, revid):
55
        self.treeview.set_cursor(self.index[revid])
56
        self.treeview.grab_focus()
57
303 by Daniel Schierbeck
Made basic signaling work.
58
    def get_children(self):
59
        return self.children
60
61
    def get_parents(self):
62
        return self.parents
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
63
        
304 by Daniel Schierbeck
Made forward/back buttons work again.
64
    def back(self):
65
        (path, col) = self.treeview.get_cursor()
66
        revision = self.model[path][treemodel.REVISION]
67
        parents = self.model[path][treemodel.PARENTS]
68
        if not len(parents):
69
            return
70
71
        for parent_id in parents:
72
            parent_index = self.index[parent_id]
73
            parent = self.model[parent_index][treemodel.REVISION]
74
            if same_branch(revision, parent):
75
                self.treeview.set_cursor(parent_index)
76
                break
77
        else:
78
            self.treeview.set_cursor(self.index[parents[0]])
79
        self.treeview.grab_focus()
80
81
    def forward(self):
82
        (path, col) = self.treeview.get_cursor()
83
        revision = self.model[path][treemodel.REVISION]
84
        children = self.model[path][treemodel.CHILDREN]
85
        if not len(children):
86
            return
87
88
        for child_id in children:
89
            child_index = self.index[child_id]
90
            child = self.model[child_index][treemodel.REVISION]
91
            if same_branch(child, revision):
92
                self.treeview.set_cursor(child_index)
93
                break
94
        else:
95
            self.treeview.set_cursor(self.index[children[0]])
96
        self.treeview.grab_focus()
97
98
    def populate(self, start, maxnum):
99
        (linegraphdata, index, columns_len) = linegraph(self.branch,
100
                                                        start,
101
                                                        maxnum)
102
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)
108
        self.index = index
109
        self.treeview.set_model(self.model)
110
        self.treeview.set_cursor(0)
307 by Daniel Schierbeck
Made load notification work again.
111
        self.emit('revisions-loaded')
304 by Daniel Schierbeck
Made forward/back buttons work again.
112
113
        return False
114
306 by Daniel Schierbeck
Made clicking a row work again.
115
    def show_diff(self, branch, revid, parentid):
116
        """Open a new window to show a diff between the given revisions."""
117
        from bzrlib.plugins.gtk.diff import DiffWindow
118
        window = DiffWindow(parent=self)
119
        (parent_tree, rev_tree) = branch.repository.revision_trees([parentid, 
120
                                                                   revid])
121
        description = revid + " - " + branch.nick
122
        window.set_diff(description, rev_tree, parent_tree)
123
        window.show()
124
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
125
    def construct_treeview(self):
126
        self.treeview = gtk.TreeView()
127
128
        self.treeview.set_rules_hint(True)
129
        self.treeview.set_search_column(4)
130
303 by Daniel Schierbeck
Made basic signaling work.
131
        self.treeview.get_selection().connect("changed",
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
132
                self._on_selection_changed)
133
134
        self.treeview.connect("row-activated", 
135
                self._on_revision_activated)
136
137
        self.treeview.connect("button-release-event", 
138
                self._on_revision_selected)
139
140
        self.treeview.set_property('fixed-height-mode', True)
141
142
        self.add(self.treeview)
143
        self.treeview.show()
144
145
        cell = gtk.CellRendererText()
146
        cell.set_property("width-chars", 15)
147
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
148
        column = gtk.TreeViewColumn("Revision No")
149
        column.set_resizable(True)
150
        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
151
        column.set_fixed_width(cell.get_size(self.treeview)[2])
152
        column.pack_start(cell, expand=True)
153
        column.add_attribute(cell, "text", treemodel.REVNO)
154
        self.treeview.append_column(column)
155
156
        self.graph_cell = CellRendererGraph()
157
        self.graph_column = gtk.TreeViewColumn()
158
        self.graph_column.set_resizable(True)
159
        self.graph_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
160
        self.graph_column.pack_start(self.graph_cell, expand=False)
161
        self.graph_column.add_attribute(self.graph_cell, "node", treemodel.NODE)
162
        self.graph_column.add_attribute(self.graph_cell, "in-lines", treemodel.LAST_LINES)
163
        self.graph_column.add_attribute(self.graph_cell, "out-lines", treemodel.LINES)
164
        self.treeview.append_column(self.graph_column)
165
166
        cell = gtk.CellRendererText()
167
        cell.set_property("width-chars", 65)
168
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
169
        column = gtk.TreeViewColumn("Message")
170
        column.set_resizable(True)
171
        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
172
        column.set_fixed_width(cell.get_size(self.treeview)[2])
173
        column.pack_start(cell, expand=True)
174
        column.add_attribute(cell, "text", treemodel.MESSAGE)
175
        self.treeview.append_column(column)
176
177
        cell = gtk.CellRendererText()
178
        cell.set_property("width-chars", 15)
179
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
180
        column = gtk.TreeViewColumn("Committer")
181
        column.set_resizable(True)
182
        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
183
        column.set_fixed_width(cell.get_size(self.treeview)[2])
184
        column.pack_start(cell, expand=True)
185
        column.add_attribute(cell, "text", treemodel.COMMITER)
186
        self.treeview.append_column(column)
187
188
    def _on_selection_changed(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
189
        """callback for when the treeview changes."""
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
190
        (model, selected_rows) = selection.get_selected_rows()
191
        if len(selected_rows) > 0:
192
            iter = self.model.get_iter(selected_rows[0])
303 by Daniel Schierbeck
Made basic signaling work.
193
            self.revision = self.model.get_value(iter, treemodel.REVISION)
194
            self.parents = self.model.get_value(iter, treemodel.PARENTS)
195
            self.children = self.model.get_value(iter, treemodel.CHILDREN)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
196
310 by Daniel Schierbeck
Moved to using custom signal for handling revision selections.
197
            self.emit('revision-selected')
198
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
199
    def _on_revision_selected(self, widget, event):
200
        from bzrlib.plugins.gtk.revisionmenu import RevisionPopupMenu
201
        if event.button == 3:
202
            menu = RevisionPopupMenu(self.branch.repository, 
312 by Daniel Schierbeck
Made right-clicking work again.
203
                [self.get_revision().revision_id],
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
204
                self.branch)
205
            menu.popup(None, None, None, event.button, event.get_time())
206
207
    def _on_revision_activated(self, widget, path, col):
208
        # TODO: more than one parent
209
        """Callback for when a treeview row gets activated."""
210
        revision_id = self.model[path][treemodel.REVID]
211
        parents = self.model[path][treemodel.PARENTS]
212
        if len(parents) == 0:
213
            # Ignore revisions without parent
214
            return
215
        parent_id = parents[0]
216
        self.show_diff(self.branch, revision_id, parent_id)
217
        self.treeview.grab_focus()