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

  • Committer: Jelmer Vernooij
  • Date: 2007-07-15 18:12:57 UTC
  • Revision ID: jelmer@samba.org-20070715181257-g264qus2zyi3v39z
Add RevisionSelectionBox widget, use in TagDialog.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/python
2
1
# -*- coding: UTF-8 -*-
3
2
"""Branch window.
4
3
 
27
26
    for a particular branch.
28
27
    """
29
28
 
30
 
    def __init__(self, app=None):
 
29
    def __init__(self):
31
30
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
32
31
        self.set_border_width(0)
33
32
        self.set_title("bzrk")
34
33
 
35
 
        self.app = app
36
 
 
37
34
        # Use three-quarters of the screen by default
38
35
        screen = self.get_screen()
39
36
        monitor = screen.get_monitor_geometry(0)
78
75
        self.treeview.set_search_column(4)
79
76
        self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
80
77
        self.treeview.connect("row-activated", self._treeview_row_activated_cb)
 
78
        self.treeview.connect("button-release-event", 
 
79
                self._treeview_row_mouseclick)
81
80
        scrollwin.add(self.treeview)
82
81
        self.treeview.show()
83
82
 
148
147
 
149
148
    def construct_bottom(self):
150
149
        """Construct the bottom half of the window."""
151
 
        scrollwin = gtk.ScrolledWindow()
152
 
        scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
153
 
        scrollwin.set_shadow_type(gtk.SHADOW_NONE)
 
150
        from bzrlib.plugins.gtk.logview import LogView
 
151
        self.logview = LogView()
154
152
        (width, height) = self.get_size()
155
 
        scrollwin.set_size_request(width, int(height / 2.5))
156
 
        scrollwin.show()
157
 
 
158
 
        vbox = gtk.VBox(False, spacing=6)
159
 
        vbox.set_border_width(6)
160
 
        scrollwin.add_with_viewport(vbox)
161
 
        vbox.show()
162
 
 
163
 
        table = gtk.Table(rows=4, columns=2)
164
 
        table.set_row_spacings(6)
165
 
        table.set_col_spacings(6)
166
 
        vbox.pack_start(table, expand=False, fill=True)
167
 
        table.show()
168
 
 
169
 
        align = gtk.Alignment(0.0, 0.5)
170
 
        label = gtk.Label()
171
 
        label.set_markup("<b>Revision:</b>")
172
 
        align.add(label)
173
 
        table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
174
 
        label.show()
175
 
        align.show()
176
 
 
177
 
        align = gtk.Alignment(0.0, 0.5)
178
 
        self.revid_label = gtk.Label()
179
 
        self.revid_label.set_selectable(True)
180
 
        align.add(self.revid_label)
181
 
        table.attach(align, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
182
 
        self.revid_label.show()
183
 
        align.show()
184
 
 
185
 
        align = gtk.Alignment(0.0, 0.5)
186
 
        label = gtk.Label()
187
 
        label.set_markup("<b>Committer:</b>")
188
 
        align.add(label)
189
 
        table.attach(align, 0, 1, 1, 2, gtk.FILL, gtk.FILL)
190
 
        label.show()
191
 
        align.show()
192
 
 
193
 
        align = gtk.Alignment(0.0, 0.5)
194
 
        self.committer_label = gtk.Label()
195
 
        self.committer_label.set_selectable(True)
196
 
        align.add(self.committer_label)
197
 
        table.attach(align, 1, 2, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
198
 
        self.committer_label.show()
199
 
        align.show()
200
 
 
201
 
        align = gtk.Alignment(0.0, 0.5)
202
 
        label = gtk.Label()
203
 
        label.set_markup("<b>Branch nick:</b>")
204
 
        align.add(label)
205
 
        table.attach(align, 0, 1, 2, 3, gtk.FILL, gtk.FILL)
206
 
        label.show()
207
 
        align.show()
208
 
 
209
 
        align = gtk.Alignment(0.0, 0.5)
210
 
        self.branchnick_label = gtk.Label()
211
 
        self.branchnick_label.set_selectable(True)
212
 
        align.add(self.branchnick_label)
213
 
        table.attach(align, 1, 2, 2, 3, gtk.EXPAND | gtk.FILL, gtk.FILL)
214
 
        self.branchnick_label.show()
215
 
        align.show()
216
 
 
217
 
        align = gtk.Alignment(0.0, 0.5)
218
 
        label = gtk.Label()
219
 
        label.set_markup("<b>Timestamp:</b>")
220
 
        align.add(label)
221
 
        table.attach(align, 0, 1, 3, 4, gtk.FILL, gtk.FILL)
222
 
        label.show()
223
 
        align.show()
224
 
 
225
 
        align = gtk.Alignment(0.0, 0.5)
226
 
        self.timestamp_label = gtk.Label()
227
 
        self.timestamp_label.set_selectable(True)
228
 
        align.add(self.timestamp_label)
229
 
        table.attach(align, 1, 2, 3, 4, gtk.EXPAND | gtk.FILL, gtk.FILL)
230
 
        self.timestamp_label.show()
231
 
        align.show()
232
 
 
233
 
        self.parents_table = gtk.Table(rows=1, columns=2)
234
 
        self.parents_table.set_row_spacings(3)
235
 
        self.parents_table.set_col_spacings(6)
236
 
        self.parents_table.show()
237
 
        vbox.pack_start(self.parents_table, expand=False, fill=True)
238
 
        self.parents_widgets = []
239
 
 
240
 
        label = gtk.Label()
241
 
        label.set_markup("<b>Parents:</b>")
242
 
        align = gtk.Alignment(0.0, 0.5)
243
 
        align.add(label)
244
 
        self.parents_table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
245
 
        label.show()
246
 
        align.show()
247
 
 
248
 
        self.message_buffer = gtk.TextBuffer()
249
 
        textview = gtk.TextView(self.message_buffer)
250
 
        textview.set_editable(False)
251
 
        textview.set_wrap_mode(gtk.WRAP_WORD)
252
 
        textview.modify_font(pango.FontDescription("Monospace"))
253
 
        vbox.pack_start(textview, expand=True, fill=True)
254
 
        textview.show()
255
 
 
256
 
        return scrollwin
 
153
        self.logview.set_size_request(width, int(height / 2.5))
 
154
        self.logview.show()
 
155
        self.logview.set_show_callback(self._show_clicked_cb)
 
156
        self.logview.set_go_callback(self._go_clicked_cb)
 
157
        return self.logview
257
158
 
258
159
    def set_branch(self, branch, start, maxnum):
259
160
        """Set the branch and start position for this window.
275
176
 
276
177
        last_lines = []
277
178
        (self.revisions, colours, self.children, self.parent_ids,
278
 
         merge_sorted) = distances(branch, start)
 
179
            merge_sorted) = distances(branch, start)
279
180
        for (index, (revision, node, lines)) in enumerate(graph(
280
181
                self.revisions, colours, merge_sorted)):
281
182
            # FIXME: at this point we should be able to show the graph order
303
204
 
304
205
        self.back_button.set_sensitive(len(self.parent_ids[revision]) > 0)
305
206
        self.fwd_button.set_sensitive(len(self.children[revision]) > 0)
306
 
 
307
 
        if revision.committer is not None:
308
 
            branchnick = ""
309
 
            committer = revision.committer
310
 
            timestamp = format_date(revision.timestamp, revision.timezone)
311
 
            message = revision.message
312
 
            try:
313
 
                branchnick = revision.properties['branch-nick']
314
 
            except KeyError:
315
 
                pass
316
 
 
317
 
        else:
318
 
            committer = ""
319
 
            timestamp = ""
320
 
            message = ""
321
 
            branchnick = ""
322
 
 
323
 
        self.revid_label.set_text(revision.revision_id)
324
 
        self.branchnick_label.set_text(branchnick)
325
 
 
326
 
        self.committer_label.set_text(committer)
327
 
        self.timestamp_label.set_text(timestamp)
328
 
        self.message_buffer.set_text(message)
329
 
 
330
 
        for widget in self.parents_widgets:
331
 
            self.parents_table.remove(widget)
332
 
 
333
 
        self.parents_widgets = []
334
 
        self.parents_table.resize(max(len(self.parent_ids[revision]), 1), 2)
335
 
        
336
 
        for idx, parent_id in enumerate(self.parent_ids[revision]):
337
 
            align = gtk.Alignment(0.0, 0.0)
338
 
            self.parents_widgets.append(align)
339
 
            self.parents_table.attach(align, 1, 2, idx, idx + 1,
340
 
                                      gtk.EXPAND | gtk.FILL, gtk.FILL)
341
 
            align.show()
342
 
 
343
 
            hbox = gtk.HBox(False, spacing=6)
344
 
            align.add(hbox)
345
 
            hbox.show()
346
 
 
347
 
            image = gtk.Image()
348
 
            image.set_from_stock(
349
 
                gtk.STOCK_FIND, gtk.ICON_SIZE_SMALL_TOOLBAR)
350
 
            image.show()
351
 
 
352
 
            button = gtk.Button()
353
 
            button.add(image)
354
 
            button.set_sensitive(self.app is not None)
355
 
            button.connect("clicked", self._show_clicked_cb,
356
 
                           revision.revision_id, parent_id)
357
 
            hbox.pack_start(button, expand=False, fill=True)
358
 
            button.show()
359
 
 
360
 
            button = gtk.Button(parent_id)
361
 
            button.set_use_underline(False)
362
 
            button.connect("clicked", self._go_clicked_cb, parent_id)
363
 
            hbox.pack_start(button, expand=False, fill=True)
364
 
            button.show()
365
 
 
 
207
        self.logview.set_revision(revision)
366
208
 
367
209
    def _back_clicked_cb(self, *args):
368
210
        """Callback for when the back button is clicked."""
397
239
            self.treeview.set_cursor(self.index[prev])
398
240
        self.treeview.grab_focus()
399
241
 
400
 
    def _go_clicked_cb(self, widget, revid):
 
242
    def _go_clicked_cb(self, revid):
401
243
        """Callback for when the go button for a parent is clicked."""
402
244
        self.treeview.set_cursor(self.index[self.revisions[revid]])
403
245
        self.treeview.grab_focus()
404
246
 
405
 
    def _show_clicked_cb(self, widget, revid, parentid):
 
247
    def show_diff(self, branch, revid, parentid):
 
248
        """Open a new window to show a diff between the given revisions."""
 
249
        from bzrlib.plugins.gtk.diff import DiffWindow
 
250
        window = DiffWindow()
 
251
        (parent_tree, rev_tree) = branch.repository.revision_trees([parentid, 
 
252
                                                                   revid])
 
253
        description = revid + " - " + branch.nick
 
254
        window.set_diff(description, rev_tree, parent_tree)
 
255
        window.show()
 
256
 
 
257
    def _show_clicked_cb(self, revid, parentid):
406
258
        """Callback for when the show button for a parent is clicked."""
407
 
        if self.app is not None:
408
 
            self.app.show_diff(self.branch, revid, parentid)
 
259
        self.show_diff(self.branch, revid, parentid)
409
260
        self.treeview.grab_focus()
410
261
 
 
262
    def _treeview_row_mouseclick(self, widget, event):
 
263
        from bzrlib.plugins.gtk.revisionmenu import RevisionPopupMenu
 
264
        if event.button == 3:
 
265
            menu = RevisionPopupMenu(self.branch.repository, 
 
266
                [x.revision_id for x in self.selected_revisions()],
 
267
                self.branch)
 
268
            menu.popup(None, None, None, event.button, event.get_time())
 
269
 
 
270
    def selected_revision(self, path):
 
271
        return self.model[path][0]
 
272
 
 
273
    def selected_revisions(self):
 
274
        return [self.selected_revision(path) for path in \
 
275
                self.treeview.get_selection().get_selected_rows()[1]]
 
276
 
411
277
    def _treeview_row_activated_cb(self, widget, path, col):
412
278
        # TODO: more than one parent
413
279
        """Callback for when a treeview row gets activated."""
414
 
        revision = self.model[path][0]
 
280
        revision = self.selected_revision(path)
 
281
        if len(self.parent_ids[revision]) == 0:
 
282
            # Ignore revisions without parent
 
283
            return
415
284
        parent_id = self.parent_ids[revision][0]
416
 
        if self.app is not None:
417
 
            self.app.show_diff(self.branch, revision.revision_id, parent_id)
 
285
        self.show_diff(self.branch, revision.revision_id, parent_id)
418
286
        self.treeview.grab_focus()