/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 gannotate.py

  • Committer: Dan Loda
  • Date: 2005-10-28 05:36:49 UTC
  • mto: (0.1.4)
  • mto: This revision was merged to the branch mainline in revision 49.
  • Revision ID: danloda@gmail.com-20051028053649-71f3f4791e86a6ca
Extract class SpanSelector out of GAnnotateWindow.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
import gtk
23
23
import pango
24
24
 
25
 
from bzrlib.branch import Branch
26
25
from bzrlib.errors import NoSuchRevision
27
26
 
28
27
from colormap import ColorMap, GrannyColorMap
29
28
from logview import LogView
 
29
from spanselector import SpanSelector
30
30
 
31
31
 
32
32
(
38
38
    TEXT_LINE_COL
39
39
) = range(6)
40
40
 
41
 
(
42
 
    SPAN_DAYS_COL,
43
 
    SPAN_STR_COL,
44
 
    SPAN_IS_SEPARATOR_COL,
45
 
    SPAN_IS_CUSTOM_COL
46
 
) = range(4)
47
 
 
48
41
 
49
42
class GAnnotateWindow(gtk.Window):
50
43
    """Annotate window."""
54
47
        self.set_default_size(640, 480)
55
48
        self.set_icon(self.render_icon(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON))
56
49
        self.color_map = GrannyColorMap()
57
 
        self.num_custom_spans = 0
58
50
 
59
51
        self._create()
60
52
 
89
81
                               line.rstrip("\r\n")
90
82
                              ])
91
83
 
92
 
        self._set_default_span()
 
84
        self._set_oldest_newest()
 
85
        # Recall that calling activate_default will emit "span-changed",
 
86
        # so self._span_changed_cb will take care of initial highlighting
 
87
        self.span_selector.activate_default()
93
88
        self.treeview.set_model(self.model)
94
89
        self.treeview.set_cursor(0)
95
90
        self.treeview.grab_focus()
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())
102
98
        
103
99
        for origin, text in weave.annotate_iter(rev_id):
104
100
            rev_id = weave.idx_to_name(origin)
114
110
 
115
111
            yield revision, revno, text
116
112
 
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)
121
117
 
122
 
        span = ((newest - oldest) / (24 * 60 * 60))
123
 
        self.span_model.set_value(self.newest_iter, SPAN_DAYS_COL, span)
124
 
        
125
 
        span = ((time.time() - oldest) / (24 * 60 * 60))
126
 
        self.span_model.set_value(self.oldest_iter, SPAN_DAYS_COL, span)
127
 
        
128
 
        index = int(self.span_model.get_string_from_iter(self.oldest_iter))
129
 
        self.span_combo.set_active(index)
130
 
        self.set_span(span)
 
118
        span = self._span_from_seconds(time.time() - oldest)
 
119
        self.span_selector.set_to_oldest_span(span)
 
120
        
 
121
        span = self._span_from_seconds(newest - oldest)
 
122
        self.span_selector.set_newest_to_oldest_span(span)
 
123
 
 
124
    def _span_from_seconds(self, seconds):
 
125
        return (seconds / (24 * 60 * 60))
131
126
    
132
 
    def _set_span_cb(self, w):
133
 
        model = w.get_model()
134
 
        iter = w.get_active_iter()
135
 
 
136
 
        if model.get_value(iter, SPAN_IS_CUSTOM_COL):
137
 
            self._request_custom_span()
138
 
        else:
139
 
            span = model.get_value(iter, SPAN_DAYS_COL)
140
 
            self.set_span(span)
141
 
 
142
 
    def _request_custom_span(self):
143
 
        self.span_combo.hide()
144
 
        self.span_entry.show_all()
145
 
 
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()
150
 
 
151
 
        if self.num_custom_spans == 0:
152
 
            self.custom_iter = self.span_model.insert_after(self.custom_iter,
153
 
                                                            self.separator)
154
 
            self.citer_top = self.custom_iter.copy()
155
 
 
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))
159
 
            
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])
163
 
        
164
 
        index = int(self.span_model.get_string_from_iter(self.custom_iter))
165
 
        self.span_combo.set_active(index)
166
 
        self.set_span(days)
167
 
        
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))
178
137
 
179
138
    def _show_log(self, w):
193
152
        vbox.pack_start(pane, expand=True, fill=True)
194
153
        
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)
198
157
        hbox.show()
199
158
        vbox.pack_start(hbox, expand=False, fill=True)
263
222
        
264
223
        return sw
265
224
 
266
 
    def _create_toolbar(self):
267
 
        toolbar = gtk.HBox(False, 6)
268
 
        toolbar.show()
269
 
 
270
 
        label = gtk.Label("Highlighting spans:")
271
 
        label.show()
272
 
        toolbar.pack_start(label, expand=False, fill=True)
273
 
 
274
 
        # [span in days, span as string, row is seperator?, row is select
275
 
        # default?]
276
 
        self.span_model = gtk.ListStore(gobject.TYPE_FLOAT,
277
 
                                        gobject.TYPE_STRING,
278
 
                                        gobject.TYPE_BOOLEAN,
279
 
                                        gobject.TYPE_BOOLEAN)
280
 
 
281
 
        self.separator = [0., "", True, False]
282
 
        
283
 
        self.oldest_iter =\
284
 
                self.span_model.append([0., "to Oldest Revision", False, False])
285
 
        self.newest_iter =\
286
 
                self.span_model.append([0., "Newest to Oldest",
287
 
                                        False, False])
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])
292
 
        self.custom_iter =\
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])
296
 
        
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)
306
 
 
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)
317
 
 
318
 
        toolbar.pack_start(self.span_entry, expand=False, fill=False)
319
 
 
320
 
        return toolbar
 
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()
 
229
 
 
230
        return self.span_selector
321
231
 
322
232
    def _create_log_view(self):
323
233
        self.logview = LogView()
336
246
        button.show()
337
247
        
338
248
        box.pack_start(button, expand=False, fill=False)
 
249
 
339
250
        return box
340
251
 
341
252