From: paulm bookmark: added button to move bookmarks to add/remove bookmarks The menu option is now called 'Add/Move/Remove Bookmark'; depending on whether the bookmark name is set to an already existing bookmark, the add and move buttons will be enabled / disabled (so that only one of the two is enabled at any given time). diff -r bf49ab4a328e tortoisehg/hgtk/bookmark.py --- a/tortoisehg/hgtk/bookmark.py Wed Dec 16 03:38:10 2009 +0900 +++ b/tortoisehg/hgtk/bookmark.py Wed Dec 16 17:43:40 2009 -0800 @@ -26,6 +26,7 @@ RESPONSE_REMOVE = 2 RESPONSE_RENAME = 3 RESPONSE_CURRENT = 4 +RESPONSE_MOVE = 5 class BookmarkDialog(gtk.Dialog): """ Dialog to add bookmark to Mercurial repo """ @@ -41,7 +42,8 @@ # add buttons if type == TYPE_ADDREMOVE: - self.add_button(_('Add'), RESPONSE_ADD) + self._button_add = self.add_button(_('Add'), RESPONSE_ADD) + self._button_move = self.add_button(_('Move'), RESPONSE_MOVE) self.add_button(_('Remove'), RESPONSE_REMOVE) elif type == TYPE_RENAME: self.add_button(_('Rename'), RESPONSE_RENAME) @@ -82,8 +84,12 @@ self.connect('response', self.dialog_response) self._bookmark_input.connect('activate', self.entry_activated, type) entry.connect('activate', self.entry_activated, type) + if type == TYPE_ADDREMOVE: + self._bookmark_input.connect('changed', self.bookmark_changed) # prepare to show + if type == TYPE_ADDREMOVE: + self.set_add_move_button_sensitivity() self._refresh(clear=False) if type == TYPE_RENAME: self._name_input.grab_focus() @@ -110,6 +116,9 @@ # Add button if response_id == RESPONSE_ADD: self._do_add_bookmark() + # Move button + elif response_id == RESPONSE_MOVE: + self._do_move_bookmark() # Remove button elif response_id == RESPONSE_REMOVE: self._do_remove_bookmark() @@ -130,7 +139,10 @@ def entry_activated(self, entry, type): if type == TYPE_ADDREMOVE: - self.response(RESPONSE_ADD) + if self._button_add.get_property('sensitive'): + self.response(RESPONSE_ADD) + else: + self.response(RESPONSE_MOVE) elif type == TYPE_RENAME: self.response(RESPONSE_RENAME) elif type == TYPE_CURRENT: @@ -138,6 +150,19 @@ else: raise _('unexpected type: %s') % type + def bookmark_changed(self, bookmark_widget): + self.set_add_move_button_sensitivity() + + def set_add_move_button_sensitivity(self): + mark = self._bookmark_input.get_text() + if mark in hglib.get_repo_bookmarks(self.repo): + self._button_add.set_sensitive(False) + self._button_move.set_sensitive(True) + else: + self._button_add.set_sensitive(True) + self._button_move.set_sensitive(False) + + def _do_add_bookmark(self): # gather input data name = self._bookmark_input.get_text() @@ -164,6 +189,32 @@ traceback.format_exc()) return False + def _do_move_bookmark(self): + # gather input data + name = self._bookmark_input.get_text() + rev = self._rev_input.get_text() + + # verify input + if name == '': + dialog.error_dialog(self, _('Bookmark input is empty'), + _('Please enter bookmark name')) + self._bookmark_input.grab_focus() + return False + + # move bookmark + try: + self._move_hg_bookmark(name, rev) + dialog.info_dialog(self, _('Bookmarking completed'), + _('Bookmark "%s" has been moved') % name) + self._refresh() + except util.Abort, inst: + dialog.error_dialog(self, _('Error in bookmarking'), str(inst)) + return False + except: + dialog.error_dialog(self, _('Error in bookmarking'), + traceback.format_exc()) + return False + def _do_remove_bookmark(self): # gather input data name = self._bookmark_input.get_text() @@ -256,6 +307,16 @@ rev=revision, mark=name) + def _move_hg_bookmark(self, name, revision): + if name not in hglib.get_repo_bookmarks(self.repo): + raise util.Abort(_('No bookmark named "%s" exists') % name) + + bookmarks.bookmark(ui=ui.ui(), + repo=self.repo, + rev=revision, + mark=name, + force=True) + def _remove_hg_bookmark(self, name): if not name in hglib.get_repo_bookmarks(self.repo): raise util.Abort(_("Bookmark '%s' does not exist") % name) diff -r bf49ab4a328e tortoisehg/hgtk/history.py --- a/tortoisehg/hgtk/history.py Wed Dec 16 03:38:10 2009 +0900 +++ b/tortoisehg/hgtk/history.py Wed Dec 16 17:43:40 2009 -0800 @@ -875,7 +875,7 @@ m = gtklib.MenuItems() m.append(create_menu(_('Add/Remove _Tag...'), self.add_tag)) if 'bookmarks' in self.exs: - m.append(create_menu(_('Add/Remove B_ookmark...'), + m.append(create_menu(_('Add/Move/Remove B_ookmark...'), self.add_bookmark)) m.append(create_menu(_('Rename Bookmark...'), self.rename_bookmark)) @@ -1213,6 +1213,9 @@ return self.stbar def refresh_on_marker_change(self, oldlen, oldmarkers, newmarkers): + # Note that oldmarkers/newmarkers may be either dicts + # (for add/remove bookmarks, which can also 'move' + # bookmarks), or lists (everything else) self.repo.invalidate() self.changeview.clear_cache() if len(self.repo) != oldlen: @@ -1906,14 +1909,17 @@ def add_bookmark(self, menuitem): # save bookmark info for detecting new bookmarks added - oldbookmarks = hglib.get_repo_bookmarks(self.repo) + # since we can now move bookmarks, need to store + # the associated changesets as well + oldbookmarks = hglib.get_repo_bookmarks(self.repo, values=True) oldlen = len(self.repo) rev = str(self.currevid) bmark = self.get_rev_tag(rev, include=oldbookmarks) def refresh(*args): self.refresh_on_marker_change(oldlen, oldbookmarks, - hglib.get_repo_bookmarks(self.repo)) + hglib.get_repo_bookmarks(self.repo, + values=True)) dialog = bookmark.BookmarkDialog(self.repo, bookmark.TYPE_ADDREMOVE, bmark, rev) diff -r bf49ab4a328e tortoisehg/util/hglib.py --- a/tortoisehg/util/hglib.py Wed Dec 16 03:38:10 2009 +0900 +++ b/tortoisehg/util/hglib.py Wed Dec 16 17:43:40 2009 -0800 @@ -235,5 +235,8 @@ return_path = path_aux return return_path -def get_repo_bookmarks(repo): - return repo._bookmarks.keys() +def get_repo_bookmarks(repo, values=False): + if values: + return dict(repo._bookmarks) + else: + return repo._bookmarks.keys()