1
# -*- coding: UTF-8 -*-
4
This module contains the code to manage the branch information window,
5
which contains both the revision graph and details panes.
8
__copyright__ = "Copyright © 2005 Canonical Ltd."
9
__author__ = "Scott James Remnant <scott@ubuntu.com>"
17
from bzrlib.osutils import format_date
19
from linegraph import linegraph, same_branch
20
from graphcell import CellRendererGraph
21
from treemodel import TreeModel
22
from treeview import TreeView
24
class BranchWindow(gtk.Window):
27
This object represents and manages a single window containing information
28
for a particular branch.
31
def __init__(self, branch, start, maxnum, parent=None):
32
gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
33
self.set_border_width(0)
39
self.set_title(branch.nick + " - revision history")
43
self.connect('key-press-event', self._on_key_pressed)
45
# Use three-quarters of the screen by default
46
screen = self.get_screen()
47
monitor = screen.get_monitor_geometry(0)
48
width = int(monitor.width * 0.75)
49
height = int(monitor.height * 0.75)
50
self.set_default_size(width, height)
53
icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
56
self.accel_group = gtk.AccelGroup()
57
self.add_accel_group(self.accel_group)
62
"""Construct the window contents."""
63
vbox = gtk.VBox(spacing=0)
66
vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
67
vbox.pack_start(self.construct_loading_msg(), expand=False, fill=True)
70
paned.pack1(self.construct_top(), resize=True, shrink=False)
71
paned.pack2(self.construct_bottom(), resize=False, shrink=True)
73
vbox.pack_start(paned, expand=True, fill=True)
74
vbox.set_focus_child(paned)
78
def construct_loading_msg(self):
79
image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
83
label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
84
label_loading.set_alignment(0.0, 0.5)
87
self.loading_msg_box = gtk.HBox()
88
self.loading_msg_box.set_spacing(5)
89
self.loading_msg_box.set_border_width(5)
90
self.loading_msg_box.pack_start(image_loading, False, False)
91
self.loading_msg_box.pack_start(label_loading, True, True)
92
self.loading_msg_box.show()
94
return self.loading_msg_box
96
def construct_top(self):
97
"""Construct the top-half of the window."""
98
self.treeview = TreeView()
100
self.treeview.set_branch(self.branch, self.start, self.maxnum)
102
self.treeview.connect("revision-selected",
103
self._treeselection_changed_cb)
105
self.treeview.connect('revisions-loaded',
106
lambda x: self.loading_msg_box.hide())
112
def construct_navigation(self):
113
"""Construct the navigation buttons."""
115
frame.set_shadow_type(gtk.SHADOW_OUT)
118
hbox = gtk.HBox(spacing=12)
122
self.back_button = gtk.Button(stock=gtk.STOCK_GO_BACK)
123
self.back_button.set_relief(gtk.RELIEF_NONE)
124
self.back_button.add_accelerator("clicked", self.accel_group, ord('['),
126
self.back_button.connect("clicked", self._back_clicked_cb)
127
hbox.pack_start(self.back_button, expand=False, fill=True)
128
self.back_button.show()
130
self.fwd_button = gtk.Button(stock=gtk.STOCK_GO_FORWARD)
131
self.fwd_button.set_relief(gtk.RELIEF_NONE)
132
self.fwd_button.add_accelerator("clicked", self.accel_group, ord(']'),
134
self.fwd_button.connect("clicked", self._fwd_clicked_cb)
135
hbox.pack_start(self.fwd_button, expand=False, fill=True)
136
self.fwd_button.show()
140
def construct_bottom(self):
141
"""Construct the bottom half of the window."""
142
from bzrlib.plugins.gtk.logview import LogView
143
self.logview = LogView(None, True, [], True)
144
(width, height) = self.get_size()
145
self.logview.set_size_request(width, int(height / 2.5))
147
self.logview.set_show_callback(self._show_clicked_cb)
148
self.logview.set_go_callback(self._go_clicked_cb)
151
def _on_key_pressed(self, widget, event):
152
""" Key press event handler. """
153
keyname = gtk.gdk.keyval_name(event.keyval)
154
func = getattr(self, '_on_key_press_' + keyname, None)
158
def _on_key_press_w(self, event):
159
if event.state & gtk.gdk.CONTROL_MASK:
161
if self._parent is None:
164
def _on_key_press_q(self, event):
165
if event.state & gtk.gdk.CONTROL_MASK:
168
def _treeselection_changed_cb(self, selection, *args):
169
"""callback for when the treeview changes."""
170
revision = self.treeview.get_revision()
171
parents = self.treeview.get_parents()
172
children = self.treeview.get_children()
174
if revision is not None:
175
self.back_button.set_sensitive(len(parents) > 0)
176
self.fwd_button.set_sensitive(len(children) > 0)
178
if self.branch.supports_tags():
179
tagdict = self.branch.tags.get_reverse_tag_dict()
180
if tagdict.has_key(revision.revision_id):
181
tags = tagdict[revision.revision_id]
182
self.logview.set_revision(revision, tags, children)
184
def _back_clicked_cb(self, *args):
185
"""Callback for when the back button is clicked."""
188
def _fwd_clicked_cb(self, *args):
189
"""Callback for when the forward button is clicked."""
190
self.treeview.forward()
192
def _go_clicked_cb(self, revid):
193
"""Callback for when the go button for a parent is clicked."""
194
self.treeview.set_revision(revid)
196
def _show_clicked_cb(self, revid, parentid):
197
"""Callback for when the show button for a parent is clicked."""
198
self.treeview.show_diff(self.branch, revid, parentid)
199
self.treeview.grab_focus()