/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to viz/treeview.py

  • Committer: Daniel Schierbeck
  • Date: 2007-10-20 20:47:07 UTC
  • Revision ID: daniel.schierbeck@gmail.com-20071020204707-jduymx0vl20r0ztf
Initial work on extracting the TreeView from the branch window.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
13
 
 
14
from linegraph import linegraph, same_branch
 
15
from graphcell import CellRendererGraph
 
16
from treemodel import TreeModel
 
17
 
 
18
class RevisionHistoryView(gtk.ScrolledWindow):
 
19
 
 
20
    def __init__(self):
 
21
        gtk.ScrolledWindow.__init__(self)
 
22
 
 
23
        self.set_olicy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
 
24
        self.set_shadow_type(gtk.SHADOW_IN)
 
25
 
 
26
        self.contruct_treeview()
 
27
 
 
28
    def construct_treeview(self):
 
29
        self.treeview = gtk.TreeView()
 
30
 
 
31
        self.treeview.set_rules_hint(True)
 
32
        self.treeview.set_search_column(4)
 
33
 
 
34
        self.treeview.get_selection().connect("changed", 
 
35
                self._on_selection_changed)
 
36
 
 
37
        self.treeview.connect("row-activated", 
 
38
                self._on_revision_activated)
 
39
 
 
40
        self.treeview.connect("button-release-event", 
 
41
                self._on_revision_selected)
 
42
 
 
43
        self.treeview.set_property('fixed-height-mode', True)
 
44
 
 
45
        self.add(self.treeview)
 
46
        self.treeview.show()
 
47
 
 
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)
 
58
 
 
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)
 
68
 
 
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)
 
79
 
 
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)
 
90
 
 
91
    def set_branch(self, branch, start, maxnum):
 
92
        self.branch = branch
 
93
 
 
94
        gobject.idle_add(self.populate, start, maxnum)
 
95
 
 
96
    def populate(self, start, maxnum):
 
97
        self.branch.lock_read()
 
98
 
 
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.get_selection().select_path(0)
 
111
 
 
112
        return False
 
113
    
 
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)
 
122
            
 
123
            self.back_button.set_sensitive(len(parents) > 0)
 
124
            self.fwd_button.set_sensitive(len(children) > 0)
 
125
            tags = []
 
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)
 
131
 
 
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()],
 
137
                self.branch)
 
138
            menu.popup(None, None, None, event.button, event.get_time())
 
139
 
 
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
 
147
            return
 
148
        parent_id = parents[0]
 
149
        self.show_diff(self.branch, revision_id, parent_id)
 
150
        self.treeview.grab_focus()