Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 1.0, 1.0.1, and 1.0.2

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).

Changeset e319b7311c28

Parent c4375a6a7b9f

by paulm

Changes to 3 files · Browse files at e319b7311c28 Showing diff from parent c4375a6a7b9f Diff from another changeset...

 
26
27
28
 
29
30
31
 
41
42
43
44
 
 
45
46
47
 
82
83
84
 
 
85
86
 
 
87
88
89
 
110
111
112
 
 
 
113
114
115
 
130
131
132
133
 
 
 
 
134
135
136
 
138
139
140
 
 
 
 
 
 
 
 
 
 
 
 
 
141
142
143
 
164
165
166
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
168
169
 
256
257
258
 
 
 
 
 
 
 
 
 
 
259
260
261
 
26
27
28
29
30
31
32
 
42
43
44
 
45
46
47
48
49
 
84
85
86
87
88
89
90
91
92
93
94
95
 
116
117
118
119
120
121
122
123
124
 
139
140
141
 
142
143
144
145
146
147
148
 
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
 
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
 
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
@@ -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)
 
875
876
877
878
 
879
880
881
 
1213
1214
1215
 
 
 
1216
1217
1218
 
1906
1907
1908
1909
 
 
 
1910
1911
1912
1913
1914
1915
1916
 
 
1917
1918
1919
 
875
876
877
 
878
879
880
881
 
1213
1214
1215
1216
1217
1218
1219
1220
1221
 
1909
1910
1911
 
1912
1913
1914
1915
1916
1917
1918
1919
1920
 
1921
1922
1923
1924
1925
@@ -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)
 
235
236
237
238
239
 
 
 
 
 
 
235
236
237
 
 
238
239
240
241
242
@@ -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()