/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

Merged with mainline.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
from bzrlib.plugins.gtk.window import Window
17
17
from bzrlib.plugins.gtk.tags import AddTagDialog
18
18
from bzrlib.plugins.gtk.preferences import PreferencesWindow
19
 
from bzrlib.plugins.gtk.branchview import TreeView
20
 
from bzrlib.revision import Revision
 
19
from bzrlib.plugins.gtk.branchview import TreeView, treemodel
 
20
from bzrlib.revision import Revision, NULL_REVISION
21
21
from bzrlib.config import BranchConfig
22
22
from bzrlib.config import GlobalConfig
23
23
 
100
100
 
101
101
        vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
102
102
        vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
103
 
        vbox.pack_start(self.construct_loading_msg(), expand=False, fill=True)
104
103
        
105
104
        vbox.pack_start(self.paned, expand=True, fill=True)
106
105
        vbox.set_focus_child(self.paned)
170
169
        go_menu_next = self.next_rev_action.create_menu_item()
171
170
        go_menu_prev = self.prev_rev_action.create_menu_item()
172
171
 
173
 
        tags_menu = gtk.Menu()
174
 
        go_menu_tags = gtk.MenuItem("_Tags")
175
 
        go_menu_tags.set_submenu(tags_menu)
176
 
 
177
 
        if self.branch.supports_tags():
178
 
            tags = self.branch.tags.get_tag_dict().items()
179
 
            tags.sort()
180
 
            tags.reverse()
181
 
            for tag, revid in tags:
182
 
                tag_item = gtk.MenuItem(tag)
183
 
                tag_item.connect('activate', self._tag_selected_cb, revid)
184
 
                tags_menu.add(tag_item)
185
 
 
186
 
            go_menu_tags.set_sensitive(len(tags) != 0)
187
 
        else:
188
 
            go_menu_tags.set_sensitive(False)
 
172
        self.go_menu_tags = gtk.MenuItem("_Tags")
 
173
        self._update_tags()
189
174
 
190
175
        go_menu.add(go_menu_next)
191
176
        go_menu.add(go_menu_prev)
192
177
        go_menu.add(gtk.SeparatorMenuItem())
193
 
        go_menu.add(go_menu_tags)
 
178
        go_menu.add(self.go_menu_tags)
194
179
 
195
180
        revision_menu = gtk.Menu()
196
181
        revision_menuitem = gtk.MenuItem("_Revision")
213
198
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
214
199
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
215
200
 
 
201
        help_menu = gtk.Menu()
 
202
        help_menuitem = gtk.MenuItem("_Help")
 
203
        help_menuitem.set_submenu(help_menu)
 
204
 
 
205
        help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
 
206
        help_about_menuitem.connect('activate', self._about_dialog_cb)
 
207
 
 
208
        help_menu.add(help_about_menuitem)
 
209
 
216
210
        menubar.add(file_menuitem)
217
211
        menubar.add(edit_menuitem)
218
212
        menubar.add(view_menuitem)
219
213
        menubar.add(go_menuitem)
220
214
        menubar.add(revision_menuitem)
221
215
        menubar.add(branch_menuitem)
 
216
        menubar.add(help_menuitem)
222
217
        menubar.show_all()
223
218
 
224
219
        return menubar
225
 
    
226
 
    def construct_loading_msg(self):
227
 
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
228
 
                                                 gtk.ICON_SIZE_BUTTON)
229
 
        image_loading.show()
230
 
        
231
 
        label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
232
 
        label_loading.set_alignment(0.0, 0.5)
233
 
        label_loading.show()
234
 
        
235
 
        self.loading_msg_box = gtk.HBox()
236
 
        self.loading_msg_box.set_spacing(5)
237
 
        self.loading_msg_box.set_border_width(5)        
238
 
        self.loading_msg_box.pack_start(image_loading, False, False)
239
 
        self.loading_msg_box.pack_start(label_loading, True, True)
240
 
        self.loading_msg_box.show()
241
 
        
242
 
        return self.loading_msg_box
243
220
 
244
221
    def construct_top(self):
245
222
        """Construct the top-half of the window."""
249
226
 
250
227
        self.treeview.connect('revision-selected',
251
228
                self._treeselection_changed_cb)
 
229
        self.treeview.connect('revision-activated',
 
230
                self._tree_revision_activated)
252
231
 
253
 
        self.treeview.connect('revisions-loaded', 
254
 
                lambda x: self.loading_msg_box.hide())
 
232
        self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
255
233
 
256
234
        for col in ["revno", "date"]:
257
235
            option = self.config.get_user_option(col + '-column-visible')
297
275
        self.revisionview.show()
298
276
        self.revisionview.set_show_callback(self._show_clicked_cb)
299
277
        self.revisionview.connect('notify::revision', self._go_clicked_cb)
 
278
        self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
300
279
        return self.revisionview
301
280
 
302
281
    def _tag_selected_cb(self, menuitem, revid):
351
330
 
352
331
            self.revisionview.set_revision(revision)
353
332
            self.revisionview.set_children(children)
 
333
    
 
334
    def _tree_revision_activated(self, widget, path, col):
 
335
        # TODO: more than one parent
 
336
        """Callback for when a treeview row gets activated."""
 
337
        revision = self.treeview.get_revision()
 
338
        parents  = self.treeview.get_parents()
 
339
 
 
340
        if len(parents) == 0:
 
341
            parent_id = None
 
342
        else:
 
343
            parent_id = parents[0]
 
344
 
 
345
        self.show_diff(revision.revision_id, parent_id)
 
346
        self.treeview.grab_focus()
 
347
    
354
348
 
355
349
    def _back_clicked_cb(self, *args):
356
350
        """Callback for when the back button is clicked."""
367
361
 
368
362
    def _show_clicked_cb(self, revid, parentid):
369
363
        """Callback for when the show button for a parent is clicked."""
370
 
        self.treeview.show_diff(revid, parentid)
 
364
        self.show_diff(revid, parentid)
371
365
        self.treeview.grab_focus()
372
366
 
373
367
    def _set_revision_cb(self, w, revision_id):
388
382
    def _tag_revision_cb(self, w):
389
383
        try:
390
384
            self.treeview.set_sensitive(False)
391
 
            self.branch.unlock()
392
385
            dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
393
386
            response = dialog.run()
394
387
            if response != gtk.RESPONSE_NONE:
395
388
                dialog.hide()
396
389
            
397
390
                if response == gtk.RESPONSE_OK:
398
 
                    try:
399
 
                        self.branch.lock_write()
400
 
                        self.branch.tags.set_tag(dialog.tagname, dialog._revid)
401
 
                    finally:
402
 
                        self.branch.unlock()
 
391
                    self.treeview.add_tag(dialog.tagname, dialog._revid)
403
392
                
404
393
                dialog.destroy()
405
394
 
406
395
        finally:
407
 
            self.branch.lock_read()
408
 
            self.treeview.emit("revision-selected")
409
396
            self.treeview.set_sensitive(True)
410
397
 
 
398
    def _about_dialog_cb(self, w):
 
399
        from bzrlib.plugins.gtk.about import AboutDialog
 
400
 
 
401
        AboutDialog().run()
 
402
 
411
403
    def _col_visibility_changed(self, col, property):
412
404
        self.config.set_user_option(property + '-column-visible', col.get_active())
413
405
        self.treeview.set_property(property + '-column-visible', col.get_active())
424
416
        dialog.run()
425
417
 
426
418
    def _refresh_clicked(self, w):
427
 
        self.treeview.update()
 
419
        self.treeview.refresh()
 
420
 
 
421
    def _update_tags(self):
 
422
        menu = gtk.Menu()
 
423
 
 
424
        if self.branch.supports_tags():
 
425
            tags = self.branch.tags.get_tag_dict().items()
 
426
            tags.sort()
 
427
            tags.reverse()
 
428
            for tag, revid in tags:
 
429
                tag_item = gtk.MenuItem(tag, use_underline=False)
 
430
                tag_item.connect('activate', self._tag_selected_cb, revid)
 
431
                menu.add(tag_item)
 
432
            self.go_menu_tags.set_submenu(menu)
 
433
 
 
434
            self.go_menu_tags.set_sensitive(len(tags) != 0)
 
435
        else:
 
436
            self.go_menu_tags.set_sensitive(False)
 
437
 
 
438
        self.go_menu_tags.show_all()
 
439
 
 
440
    def show_diff(self, revid=None, parentid=None):
 
441
        """Open a new window to show a diff between the given revisions."""
 
442
        from bzrlib.plugins.gtk.diff import DiffWindow
 
443
        window = DiffWindow(parent=self)
 
444
 
 
445
        if parentid is None:
 
446
            parentid = NULL_REVISION
 
447
 
 
448
        rev_tree    = self.branch.repository.revision_tree(revid)
 
449
        parent_tree = self.branch.repository.revision_tree(parentid)
 
450
 
 
451
        description = revid + " - " + self.branch.nick
 
452
        window.set_diff(description, rev_tree, parent_tree)
 
453
        window.show()
 
454
 
 
455