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