98
93
rev_hist = branch.revision_history()
99
94
rev_tree = branch.revision_tree(branch.last_revision())
100
95
rev_id = rev_tree.inventory[file_id].revision
101
weave = branch.weave_store.get_weave(file_id, branch.get_transaction())
96
weave = branch.weave_store.get_weave(file_id,
97
branch.get_transaction())
103
99
for origin, text in weave.annotate_iter(rev_id):
104
100
rev_id = weave.idx_to_name(origin)
115
111
yield revision, revno, text
117
def _set_default_span(self):
113
def _set_oldest_newest(self):
118
114
rev_dates = map(lambda i: self.revisions[i].timestamp, self.revisions)
119
115
oldest = min(rev_dates)
120
116
newest = max(rev_dates)
122
span = ((newest - oldest) / (24 * 60 * 60))
123
self.span_model.set_value(self.newest_iter, SPAN_DAYS_COL, span)
125
span = ((time.time() - oldest) / (24 * 60 * 60))
126
self.span_model.set_value(self.oldest_iter, SPAN_DAYS_COL, span)
128
index = int(self.span_model.get_string_from_iter(self.oldest_iter))
129
self.span_combo.set_active(index)
118
span = self._span_from_seconds(time.time() - oldest)
119
self.span_selector.set_to_oldest_span(span)
121
span = self._span_from_seconds(newest - oldest)
122
self.span_selector.set_newest_to_oldest_span(span)
124
def _span_from_seconds(self, seconds):
125
return (seconds / (24 * 60 * 60))
132
def _set_span_cb(self, w):
133
model = w.get_model()
134
iter = w.get_active_iter()
136
if model.get_value(iter, SPAN_IS_CUSTOM_COL):
137
self._request_custom_span()
139
span = model.get_value(iter, SPAN_DAYS_COL)
142
def _request_custom_span(self):
143
self.span_combo.hide()
144
self.span_entry.show_all()
146
def _set_custom_span_cb(self, w):
147
days = float(w.get_text())
148
self.span_entry.hide_all()
149
self.span_combo.show()
151
if self.num_custom_spans == 0:
152
self.custom_iter = self.span_model.insert_after(self.custom_iter,
154
self.citer_top = self.custom_iter.copy()
156
if self.num_custom_spans == 4:
157
self.num_custom_spans -= 1
158
self.span_model.remove(self.span_model.iter_next(self.citer_top))
160
self.num_custom_spans += 1
161
self.custom_iter = self.span_model.insert_after(
162
self.custom_iter, [days, "%.2f Days" % days, False, False])
164
index = int(self.span_model.get_string_from_iter(self.custom_iter))
165
self.span_combo.set_active(index)
168
def set_span(self, span):
127
def _span_changed_cb(self, w, span):
169
128
self.color_map.set_span(span)
170
129
now = time.time()
171
130
self.model.foreach(self._highlight_annotation, now)
173
132
def _highlight_annotation(self, model, path, iter, now):
174
133
revision_id, = model.get(iter, REVISION_ID_COL)
175
134
revision = self.revisions[revision_id]
176
days = ((now - revision.timestamp) / (24 * 60 * 60))
135
days = self._span_from_seconds(now - revision.timestamp)
177
136
model.set(iter, HIGHLIGHT_COLOR_COL, self.color_map.get_color(days))
179
138
def _show_log(self, w):
193
152
vbox.pack_start(pane, expand=True, fill=True)
195
154
hbox = gtk.HBox(True, 6)
196
hbox.pack_start(self._create_toolbar(), expand=False, fill=True)
155
hbox.pack_start(self._create_span_selector(), expand=False, fill=True)
197
156
hbox.pack_start(self._create_button_box(), expand=False, fill=True)
199
158
vbox.pack_start(hbox, expand=False, fill=True)
266
def _create_toolbar(self):
267
toolbar = gtk.HBox(False, 6)
270
label = gtk.Label("Highlighting spans:")
272
toolbar.pack_start(label, expand=False, fill=True)
274
# [span in days, span as string, row is seperator?, row is select
276
self.span_model = gtk.ListStore(gobject.TYPE_FLOAT,
278
gobject.TYPE_BOOLEAN,
279
gobject.TYPE_BOOLEAN)
281
self.separator = [0., "", True, False]
284
self.span_model.append([0., "to Oldest Revision", False, False])
286
self.span_model.append([0., "Newest to Oldest",
288
self.span_model.append(self.separator)
289
self.span_model.append([1., "1 Day", False, False])
290
self.span_model.append([7., "1 Week", False, False])
291
self.span_model.append([30., "1 Month", False, False])
293
self.span_model.append([365., "1 Year", False, False])
294
self.span_model.append(self.separator)
295
self.span_model.append([0., "Custom...", False, True])
297
self.span_combo = gtk.ComboBox(self.span_model)
298
self.span_combo.set_row_separator_func(
299
lambda m, i: m.get_value(i, SPAN_IS_SEPARATOR_COL))
300
cell = gtk.CellRendererText()
301
self.span_combo.pack_start(cell, False)
302
self.span_combo.add_attribute(cell, "text", 1)
303
self.span_combo.connect("changed", self._set_span_cb)
304
self.span_combo.show()
305
toolbar.pack_start(self.span_combo, expand=False, fill=False)
307
self.span_entry = gtk.HBox(False, 6)
308
spin = gtk.SpinButton(digits=2)
309
spin.set_numeric(True)
310
spin.set_increments(1.0, 10.0)
311
spin.set_range(0.0, 100 * 365)
312
spin.connect('activate', self._set_custom_span_cb)
313
spin.connect('show', lambda w: w.grab_focus())
314
self.span_entry.pack_start(spin, expand=False, fill=False)
315
self.span_entry.pack_start(gtk.Label("Days"),
316
expand=False, fill=False)
318
toolbar.pack_start(self.span_entry, expand=False, fill=False)
225
def _create_span_selector(self):
226
self.span_selector = SpanSelector()
227
self.span_selector.connect("span-changed", self._span_changed_cb)
228
self.span_selector.show()
230
return self.span_selector
322
232
def _create_log_view(self):
323
233
self.logview = LogView()