/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: Daniel Schierbeck
  • Date: 2008-01-23 16:36:21 UTC
  • mto: (423.1.8 trunk)
  • mto: This revision was merged to the branch mainline in revision 429.
  • Revision ID: daniel.schierbeck@gmail.com-20080123163621-x8kublc38ojipnly
Made the revision popup menu correctly add tags.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
import pango
15
15
 
16
16
from bzrlib.plugins.gtk.window import Window
17
 
from bzrlib.plugins.gtk import icon_path
18
17
from bzrlib.plugins.gtk.tags import AddTagDialog
19
18
from bzrlib.plugins.gtk.preferences import PreferencesWindow
20
 
from bzrlib.plugins.gtk.branchview import TreeView, treemodel
21
 
from bzrlib.revision import Revision, NULL_REVISION
 
19
from bzrlib.plugins.gtk.branchview import TreeView
 
20
from bzrlib.revision import Revision
22
21
from bzrlib.config import BranchConfig
23
22
from bzrlib.config import GlobalConfig
24
23
 
29
28
    for a particular branch.
30
29
    """
31
30
 
32
 
    def __init__(self, branch, start_revs, maxnum, parent=None):
 
31
    def __init__(self, branch, start, maxnum, parent=None):
33
32
        """Create a new BranchWindow.
34
33
 
35
34
        :param branch: Branch object for branch to show.
36
 
        :param start_revs: Revision ids of top revisions.
 
35
        :param start: Revision id of top revision.
37
36
        :param maxnum: Maximum number of revisions to display, 
38
37
                       None for no limit.
39
38
        """
42
41
        self.set_border_width(0)
43
42
 
44
43
        self.branch      = branch
45
 
        self.start_revs  = start_revs
 
44
        self.start       = start
46
45
        self.maxnum      = maxnum
47
46
        self.config      = GlobalConfig()
48
47
 
101
100
 
102
101
        vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
103
102
        vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
 
103
        vbox.pack_start(self.construct_loading_msg(), expand=False, fill=True)
104
104
        
105
105
        vbox.pack_start(self.paned, expand=True, fill=True)
106
106
        vbox.set_focus_child(self.paned)
156
156
        view_menu.add(view_menu_compact)
157
157
        view_menu.add(gtk.SeparatorMenuItem())
158
158
 
159
 
        self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
160
 
        self.mnu_show_date_column = gtk.CheckMenuItem("Show _Date Column")
161
 
 
162
 
        # Revision numbers are pointless if there are multiple branches
163
 
        if len(self.start_revs) > 1:
164
 
            self.mnu_show_revno_column.set_sensitive(False)
165
 
            self.treeview.set_property('revno-column-visible', False)
166
 
 
167
 
        for (col, name) in [(self.mnu_show_revno_column, "revno"), 
168
 
                            (self.mnu_show_date_column, "date")]:
 
159
        for (label, name) in [("Revision _Number", "revno"), ("_Date", "date")]:
 
160
            col = gtk.CheckMenuItem("Show " + label + " Column")
169
161
            col.set_active(self.treeview.get_property(name + "-column-visible"))
170
162
            col.connect('toggled', self._col_visibility_changed, name)
171
163
            view_menu.add(col)
178
170
        go_menu_next = self.next_rev_action.create_menu_item()
179
171
        go_menu_prev = self.prev_rev_action.create_menu_item()
180
172
 
181
 
        tag_image = gtk.Image()
182
 
        tag_image.set_from_file(icon_path("tag-16.png"))
183
 
        self.go_menu_tags = gtk.ImageMenuItem("_Tags")
184
 
        self.go_menu_tags.set_image(tag_image)
 
173
        self.go_menu_tags = gtk.MenuItem("_Tags")
185
174
        self._update_tags()
186
175
 
187
176
        go_menu.add(go_menu_next)
195
184
 
196
185
        revision_menu_diff = gtk.MenuItem("View Changes")
197
186
        revision_menu_diff.connect('activate', 
198
 
                self._menu_diff_cb)
199
 
        
200
 
        revision_menu_compare = gtk.MenuItem("Compare with...")
201
 
        revision_menu_compare.connect('activate',
202
 
                self._compare_with_cb)
 
187
                lambda w: self.treeview.show_diff())
203
188
 
204
189
        revision_menu_tag = gtk.MenuItem("Tag Revision")
205
190
        revision_menu_tag.connect('activate', self._tag_revision_cb)
206
191
 
207
192
        revision_menu.add(revision_menu_tag)
208
193
        revision_menu.add(revision_menu_diff)
209
 
        revision_menu.add(revision_menu_compare)
210
194
 
211
195
        branch_menu = gtk.Menu()
212
196
        branch_menuitem = gtk.MenuItem("_Branch")
215
199
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
216
200
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
217
201
 
218
 
        help_menu = gtk.Menu()
219
 
        help_menuitem = gtk.MenuItem("_Help")
220
 
        help_menuitem.set_submenu(help_menu)
221
 
 
222
 
        help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
223
 
        help_about_menuitem.connect('activate', self._about_dialog_cb)
224
 
 
225
 
        help_menu.add(help_about_menuitem)
226
 
 
227
202
        menubar.add(file_menuitem)
228
203
        menubar.add(edit_menuitem)
229
204
        menubar.add(view_menuitem)
230
205
        menubar.add(go_menuitem)
231
206
        menubar.add(revision_menuitem)
232
207
        menubar.add(branch_menuitem)
233
 
        menubar.add(help_menuitem)
234
208
        menubar.show_all()
235
209
 
236
210
        return menubar
 
211
    
 
212
    def construct_loading_msg(self):
 
213
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
 
214
                                                 gtk.ICON_SIZE_BUTTON)
 
215
        image_loading.show()
 
216
        
 
217
        label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
 
218
        label_loading.set_alignment(0.0, 0.5)
 
219
        label_loading.show()
 
220
        
 
221
        self.loading_msg_box = gtk.HBox()
 
222
        self.loading_msg_box.set_spacing(5)
 
223
        self.loading_msg_box.set_border_width(5)        
 
224
        self.loading_msg_box.pack_start(image_loading, False, False)
 
225
        self.loading_msg_box.pack_start(label_loading, True, True)
 
226
        self.loading_msg_box.show()
 
227
        
 
228
        return self.loading_msg_box
237
229
 
238
230
    def construct_top(self):
239
231
        """Construct the top-half of the window."""
240
232
        # FIXME: Make broken_line_length configurable
241
233
 
242
 
        self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
 
234
        self.treeview = TreeView(self.branch, self.start, self.maxnum, self.compact_view)
243
235
 
244
236
        self.treeview.connect('revision-selected',
245
237
                self._treeselection_changed_cb)
246
 
        self.treeview.connect('revision-activated',
247
 
                self._tree_revision_activated)
 
238
 
 
239
        self.treeview.connect('revisions-loaded', 
 
240
                lambda x: self.loading_msg_box.hide())
248
241
 
249
242
        self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
250
243
 
252
245
            option = self.config.get_user_option(col + '-column-visible')
253
246
            if option is not None:
254
247
                self.treeview.set_property(col + '-column-visible', option == 'True')
255
 
            else:
256
 
                self.treeview.set_property(col + '-column-visible', False)
257
248
 
258
249
        self.treeview.show()
259
250
 
306
297
        parents  = self.treeview.get_parents()
307
298
        children = self.treeview.get_children()
308
299
 
309
 
        if revision and revision != NULL_REVISION:
 
300
        if revision is not None:
310
301
            prev_menu = gtk.Menu()
311
302
            if len(parents) > 0:
312
303
                self.prev_rev_action.set_sensitive(True)
313
304
                for parent_id in parents:
314
 
                    if parent_id and parent_id != NULL_REVISION:
315
 
                        parent = self.branch.repository.get_revision(parent_id)
316
 
                        try:
317
 
                            str = ' (' + parent.properties['branch-nick'] + ')'
318
 
                        except KeyError:
319
 
                            str = ""
 
305
                    parent = self.branch.repository.get_revision(parent_id)
 
306
                    try:
 
307
                        str = ' (' + parent.properties['branch-nick'] + ')'
 
308
                    except KeyError:
 
309
                        str = ""
320
310
 
321
 
                        item = gtk.MenuItem(parent.message.split("\n")[0] + str)
322
 
                        item.connect('activate', self._set_revision_cb, parent_id)
323
 
                        prev_menu.add(item)
 
311
                    item = gtk.MenuItem(parent.message.split("\n")[0] + str)
 
312
                    item.connect('activate', self._set_revision_cb, parent_id)
 
313
                    prev_menu.add(item)
324
314
                prev_menu.show_all()
325
315
            else:
326
316
                self.prev_rev_action.set_sensitive(False)
350
340
 
351
341
            self.revisionview.set_revision(revision)
352
342
            self.revisionview.set_children(children)
353
 
    
354
 
    def _tree_revision_activated(self, widget, path, col):
355
 
        # TODO: more than one parent
356
 
        """Callback for when a treeview row gets activated."""
357
 
        revision = self.treeview.get_revision()
358
 
        parents  = self.treeview.get_parents()
359
 
 
360
 
        if len(parents) == 0:
361
 
            parent_id = None
362
 
        else:
363
 
            parent_id = parents[0]
364
 
 
365
 
        self.show_diff(revision.revision_id, parent_id)
366
 
        self.treeview.grab_focus()
367
 
        
368
 
    def _menu_diff_cb(self,w):
369
 
        (path, focus) = self.treeview.treeview.get_cursor()
370
 
        revid = self.treeview.model[path][treemodel.REVID]
371
 
        
372
 
        parentids = self.branch.repository.revision_parents(revid)
373
 
 
374
 
        if len(parentids) == 0:
375
 
            parentid = NULL_REVISION
376
 
        else:
377
 
            parentid = parentids[0]
378
 
        
379
 
        self.show_diff(revid,parentid)    
380
343
 
381
344
    def _back_clicked_cb(self, *args):
382
345
        """Callback for when the back button is clicked."""
393
356
 
394
357
    def _show_clicked_cb(self, revid, parentid):
395
358
        """Callback for when the show button for a parent is clicked."""
396
 
        self.show_diff(revid, parentid)
 
359
        self.treeview.show_diff(revid, parentid)
397
360
        self.treeview.grab_focus()
398
361
 
399
 
    def _compare_with_cb(self,w):
400
 
        """Callback for revision 'compare with' menu. Will show a small
401
 
            dialog with branch revisions to compare with selected revision in TreeView"""
402
 
        
403
 
        from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
404
 
        
405
 
        rb = RevisionBrowser(self.branch,self)
406
 
        ret = rb.run()
407
 
        
408
 
        if ret == gtk.RESPONSE_OK:          
409
 
            (path, focus) = self.treeview.treeview.get_cursor()
410
 
            revid = self.treeview.model[path][treemodel.REVID]
411
 
            self.show_diff(revid, rb.selected_revid)
412
 
            
413
 
        rb.destroy()
414
 
            
415
362
    def _set_revision_cb(self, w, revision_id):
416
363
        self.treeview.set_revision_id(revision_id)
417
364
 
443
390
        finally:
444
391
            self.treeview.set_sensitive(True)
445
392
 
446
 
    def _about_dialog_cb(self, w):
447
 
        from bzrlib.plugins.gtk.about import AboutDialog
448
 
 
449
 
        AboutDialog().run()
450
 
 
451
393
    def _col_visibility_changed(self, col, property):
452
394
        self.config.set_user_option(property + '-column-visible', col.get_active())
453
395
        self.treeview.set_property(property + '-column-visible', col.get_active())
464
406
        dialog.run()
465
407
 
466
408
    def _refresh_clicked(self, w):
467
 
        self.treeview.refresh()
 
409
        self.treeview.update()
468
410
 
469
411
    def _update_tags(self):
470
412
        menu = gtk.Menu()
474
416
            tags.sort()
475
417
            tags.reverse()
476
418
            for tag, revid in tags:
477
 
                tag_image = gtk.Image()
478
 
                tag_image.set_from_file(icon_path('tag-16.png'))
479
 
                tag_item = gtk.ImageMenuItem(tag.replace('_', '__'))
480
 
                tag_item.set_image(tag_image)
 
419
                tag_item = gtk.MenuItem(tag)
481
420
                tag_item.connect('activate', self._tag_selected_cb, revid)
482
421
                menu.add(tag_item)
483
422
            self.go_menu_tags.set_submenu(menu)
488
427
 
489
428
        self.go_menu_tags.show_all()
490
429
 
491
 
    def show_diff(self, revid=None, parentid=None):
492
 
        """Open a new window to show a diff between the given revisions."""
493
 
        from bzrlib.plugins.gtk.diff import DiffWindow
494
 
        window = DiffWindow(parent=self)
495
 
 
496
 
        if parentid is None:
497
 
            parentid = NULL_REVISION
498
 
 
499
 
        rev_tree    = self.branch.repository.revision_tree(revid)
500
 
        parent_tree = self.branch.repository.revision_tree(parentid)
501
 
 
502
 
        description = revid + " - " + self.branch.nick
503
 
        window.set_diff(description, rev_tree, parent_tree)
504
 
        window.show()
505
 
 
506
430