/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: 2007-12-06 23:37:06 UTC
  • mto: This revision was merged to the branch mainline in revision 417.
  • Revision ID: daniel.schierbeck@gmail.com-20071206233706-eeinks66w86r3gfm
Fixed bug in gmissing.

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, treemodel
20
 
from bzrlib.revision import Revision, NULL_REVISION
 
19
from bzrlib.revision import Revision
21
20
from bzrlib.config import BranchConfig
22
21
from bzrlib.config import GlobalConfig
 
22
from treeview import TreeView
23
23
 
24
24
class BranchWindow(Window):
25
25
    """Branch window.
28
28
    for a particular branch.
29
29
    """
30
30
 
31
 
    def __init__(self, branch, start_revs, maxnum, parent=None):
 
31
    def __init__(self, branch, start, maxnum, parent=None):
32
32
        """Create a new BranchWindow.
33
33
 
34
34
        :param branch: Branch object for branch to show.
35
 
        :param start_revs: Revision ids of top revisions.
 
35
        :param start: Revision id of top revision.
36
36
        :param maxnum: Maximum number of revisions to display, 
37
37
                       None for no limit.
38
38
        """
41
41
        self.set_border_width(0)
42
42
 
43
43
        self.branch      = branch
44
 
        self.start_revs  = start_revs
 
44
        self.start       = start
45
45
        self.maxnum      = maxnum
46
46
        self.config      = GlobalConfig()
47
47
 
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)
103
104
        
104
105
        vbox.pack_start(self.paned, expand=True, fill=True)
105
106
        vbox.set_focus_child(self.paned)
155
156
        view_menu.add(view_menu_compact)
156
157
        view_menu.add(gtk.SeparatorMenuItem())
157
158
 
158
 
        self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
159
 
        self.mnu_show_date_column = gtk.CheckMenuItem("Show _Date Column")
160
 
 
161
 
        # Revision numbers are pointless if there are multiple branches
162
 
        if len(self.start_revs) > 1:
163
 
            self.mnu_show_revno_column.set_sensitive(False)
164
 
            self.treeview.set_property('revno-column-visible', False)
165
 
 
166
 
        for (col, name) in [(self.mnu_show_revno_column, "revno"), 
167
 
                            (self.mnu_show_date_column, "date")]:
 
159
        for (label, name) in [("Revision _Number", "revno"), ("_Date", "date")]:
 
160
            col = gtk.CheckMenuItem("Show " + label + " Column")
168
161
            col.set_active(self.treeview.get_property(name + "-column-visible"))
169
162
            col.connect('toggled', self._col_visibility_changed, name)
170
163
            view_menu.add(col)
177
170
        go_menu_next = self.next_rev_action.create_menu_item()
178
171
        go_menu_prev = self.prev_rev_action.create_menu_item()
179
172
 
180
 
        self.go_menu_tags = gtk.MenuItem("_Tags")
181
 
        self._update_tags()
 
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)
182
189
 
183
190
        go_menu.add(go_menu_next)
184
191
        go_menu.add(go_menu_prev)
185
192
        go_menu.add(gtk.SeparatorMenuItem())
186
 
        go_menu.add(self.go_menu_tags)
 
193
        go_menu.add(go_menu_tags)
187
194
 
188
195
        revision_menu = gtk.Menu()
189
196
        revision_menuitem = gtk.MenuItem("_Revision")
206
213
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
207
214
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
208
215
 
209
 
        help_menu = gtk.Menu()
210
 
        help_menuitem = gtk.MenuItem("_Help")
211
 
        help_menuitem.set_submenu(help_menu)
212
 
 
213
 
        help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
214
 
        help_about_menuitem.connect('activate', self._about_dialog_cb)
215
 
 
216
 
        help_menu.add(help_about_menuitem)
217
 
 
218
216
        menubar.add(file_menuitem)
219
217
        menubar.add(edit_menuitem)
220
218
        menubar.add(view_menuitem)
221
219
        menubar.add(go_menuitem)
222
220
        menubar.add(revision_menuitem)
223
221
        menubar.add(branch_menuitem)
224
 
        menubar.add(help_menuitem)
225
222
        menubar.show_all()
226
223
 
227
224
        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
228
243
 
229
244
    def construct_top(self):
230
245
        """Construct the top-half of the window."""
231
246
        # FIXME: Make broken_line_length configurable
232
247
 
233
 
        self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
 
248
        self.treeview = TreeView(self.branch, self.start, self.maxnum, self.compact_view)
234
249
 
235
250
        self.treeview.connect('revision-selected',
236
251
                self._treeselection_changed_cb)
237
 
        self.treeview.connect('revision-activated',
238
 
                self._tree_revision_activated)
239
252
 
240
 
        self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
 
253
        self.treeview.connect('revisions-loaded', 
 
254
                lambda x: self.loading_msg_box.hide())
241
255
 
242
256
        for col in ["revno", "date"]:
243
257
            option = self.config.get_user_option(col + '-column-visible')
244
258
            if option is not None:
245
259
                self.treeview.set_property(col + '-column-visible', option == 'True')
246
260
 
247
 
        self.treeview.set_property(col + '-column-visible', False)
248
261
        self.treeview.show()
249
262
 
250
263
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
284
297
        self.revisionview.show()
285
298
        self.revisionview.set_show_callback(self._show_clicked_cb)
286
299
        self.revisionview.connect('notify::revision', self._go_clicked_cb)
287
 
        self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
288
300
        return self.revisionview
289
301
 
290
302
    def _tag_selected_cb(self, menuitem, revid):
337
349
 
338
350
            self.next_button.set_menu(next_menu)
339
351
 
340
 
            self.revisionview.set_revision(revision)
341
 
            self.revisionview.set_children(children)
342
 
    
343
 
    def _tree_revision_activated(self, widget, path, col):
344
 
        # TODO: more than one parent
345
 
        """Callback for when a treeview row gets activated."""
346
 
        revision = self.treeview.get_revision()
347
 
        parents  = self.treeview.get_parents()
348
 
 
349
 
        if len(parents) == 0:
350
 
            parent_id = None
351
 
        else:
352
 
            parent_id = parents[0]
353
 
 
354
 
        self.show_diff(revision.revision_id, parent_id)
355
 
        self.treeview.grab_focus()
356
 
    
 
352
            self.revisionview.set_revision(revision, children)
357
353
 
358
354
    def _back_clicked_cb(self, *args):
359
355
        """Callback for when the back button is clicked."""
370
366
 
371
367
    def _show_clicked_cb(self, revid, parentid):
372
368
        """Callback for when the show button for a parent is clicked."""
373
 
        self.show_diff(revid, parentid)
 
369
        self.treeview.show_diff(revid, parentid)
374
370
        self.treeview.grab_focus()
375
371
 
376
372
    def _set_revision_cb(self, w, revision_id):
391
387
    def _tag_revision_cb(self, w):
392
388
        try:
393
389
            self.treeview.set_sensitive(False)
 
390
            self.branch.unlock()
394
391
            dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
395
392
            response = dialog.run()
396
393
            if response != gtk.RESPONSE_NONE:
397
394
                dialog.hide()
398
395
            
399
396
                if response == gtk.RESPONSE_OK:
400
 
                    self.treeview.add_tag(dialog.tagname, dialog._revid)
 
397
                    try:
 
398
                        self.branch.lock_write()
 
399
                        self.branch.tags.set_tag(dialog.tagname, dialog._revid)
 
400
                    finally:
 
401
                        self.branch.unlock()
401
402
                
402
403
                dialog.destroy()
403
404
 
404
405
        finally:
 
406
            self.branch.lock_read()
 
407
            self.treeview.emit("revision-selected")
405
408
            self.treeview.set_sensitive(True)
406
409
 
407
 
    def _about_dialog_cb(self, w):
408
 
        from bzrlib.plugins.gtk.about import AboutDialog
409
 
 
410
 
        AboutDialog().run()
411
 
 
412
410
    def _col_visibility_changed(self, col, property):
413
411
        self.config.set_user_option(property + '-column-visible', col.get_active())
414
412
        self.treeview.set_property(property + '-column-visible', col.get_active())
425
423
        dialog.run()
426
424
 
427
425
    def _refresh_clicked(self, w):
428
 
        self.treeview.refresh()
429
 
 
430
 
    def _update_tags(self):
431
 
        menu = gtk.Menu()
432
 
 
433
 
        if self.branch.supports_tags():
434
 
            tags = self.branch.tags.get_tag_dict().items()
435
 
            tags.sort()
436
 
            tags.reverse()
437
 
            for tag, revid in tags:
438
 
                tag_item = gtk.MenuItem(tag, use_underline=False)
439
 
                tag_item.connect('activate', self._tag_selected_cb, revid)
440
 
                menu.add(tag_item)
441
 
            self.go_menu_tags.set_submenu(menu)
442
 
 
443
 
            self.go_menu_tags.set_sensitive(len(tags) != 0)
444
 
        else:
445
 
            self.go_menu_tags.set_sensitive(False)
446
 
 
447
 
        self.go_menu_tags.show_all()
448
 
 
449
 
    def show_diff(self, revid=None, parentid=None):
450
 
        """Open a new window to show a diff between the given revisions."""
451
 
        from bzrlib.plugins.gtk.diff import DiffWindow
452
 
        window = DiffWindow(parent=self)
453
 
 
454
 
        if parentid is None:
455
 
            parentid = NULL_REVISION
456
 
 
457
 
        rev_tree    = self.branch.repository.revision_tree(revid)
458
 
        parent_tree = self.branch.repository.revision_tree(parentid)
459
 
 
460
 
        description = revid + " - " + self.branch.nick
461
 
        window.set_diff(description, rev_tree, parent_tree)
462
 
        window.show()
463
 
 
464
 
 
 
426
        self.treeview.update()