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