Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 2.1, 2.1.1, and 2.1.2

filedialogs: wire up context menu for repoview instance (closes #260)

Added four menu items

* visual diff changeset
* visual diff to local
* visual diff file
* visual diff file to local

Cleaned up some imports, renamed some slot methods for clarity

Changeset 9522e8dbf701

Parent 6735fe45fb44

by Steve Borho

Changes to one file · Browse files at 9522e8dbf701 Showing diff from parent 6735fe45fb44 Diff from another changeset...

 
19
20
21
22
23
24
 
25
26
27
28
29
 
30
31
32
33
34
35
 
 
 
 
 
36
37
38
 
82
83
84
85
 
86
87
88
 
103
104
105
 
106
107
108
 
150
151
152
153
 
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
 
179
180
181
182
183
 
 
 
184
185
186
 
213
214
215
216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
218
219
 
346
347
348
349
350
 
 
351
352
353
 
399
400
401
402
 
403
404
405
 
19
20
21
 
 
 
22
23
 
24
25
 
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
84
85
86
 
87
88
89
90
 
105
106
107
108
109
110
111
 
153
154
155
 
156
157
158
159
160
161
162
 
 
 
 
 
 
 
 
 
 
163
164
165
 
172
173
174
 
 
175
176
177
178
179
180
 
207
208
209
 
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
 
405
406
407
 
 
408
409
410
411
412
 
458
459
460
 
461
462
463
464
@@ -19,20 +19,22 @@
   import difflib   -from PyQt4.QtCore import * -from PyQt4.QtGui import * -from PyQt4.Qsci import QsciScintilla +from mercurial import hg   -from mercurial import hg  from tortoisehg.util import hglib  from tortoisehg.hgqt.i18n import _ -from tortoisehg.hgqt.qtlib import geticon, getfont +from tortoisehg.hgqt.qtlib import geticon, getfont, getmenuicon  from tortoisehg.hgqt.filerevmodel import FileRevModel  from tortoisehg.hgqt.blockmatcher import BlockList, BlockMatch  from tortoisehg.hgqt.lexers import get_lexer  from tortoisehg.hgqt.fileview import HgFileView  from tortoisehg.hgqt.repoview import HgRepoView  from tortoisehg.hgqt.revpanel import RevPanelWidget +from tortoisehg.hgqt import visdiff + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +from PyQt4.Qsci import QsciScintilla    sides = ('left', 'right')  otherside = {'left': 'right', 'right': 'left'} @@ -82,7 +84,7 @@
  lexer.setFont(self._font)   self.lexer = lexer   - def revisionActivated(self, rev): + def onRevisionActivated(self, rev):   """   Callback called when a revision is double-clicked in the revisions table   """ @@ -103,6 +105,7 @@
  def __init__(self, repo, filename, repoviewer=None):   super(FileLogDialog, self).__init__(repo, filename, repoviewer)   self._readSettings() + self.menu = None     def closeEvent(self, event):   self._writeSettings() @@ -150,23 +153,13 @@
  self.contentframe.setLayout(vbox)     self.revpanel = RevPanelWidget(self.repo) - self.revpanel.linkActivated.connect(self.linkActivated) + self.revpanel.linkActivated.connect(self.onLinkActivated)   vbox.addWidget(self.revpanel, 0)     self.textView = HgFileView(self.repo, self)   self.textView.revisionSelected.connect(self.goto)   vbox.addWidget(self.textView, 1)   - @pyqtSlot(unicode) - def linkActivated(self, link): - link = unicode(link) - if ':' in link: - scheme, param = link.split(':', 1) - if scheme == 'cset': - rev = self.repo[param].rev() - return self.goto(rev) - QDesktopServices.openUrl(QUrl(link)) -   def setupViews(self):   self.textView.setFont(self._font)   self.textView.showMessage.connect(self.statusBar().showMessage) @@ -179,8 +172,9 @@
  def setupModels(self):   self.filerevmodel = FileRevModel(self.repo, parent=self)   self.repoview.setModel(self.filerevmodel) - self.repoview.revisionSelected.connect(self.revisionSelected) - self.repoview.revisionActivated.connect(self.revisionActivated) + self.repoview.revisionSelected.connect(self.onRevisionSelected) + self.repoview.revisionActivated.connect(self.onRevisionActivated) + self.repoview.menuRequested.connect(self.viewMenuRequest)   self.filerevmodel.showMessage.connect(self.statusBar().showMessage)   self.filerevmodel.filled.connect(self.modelFilled)   self.filerevmodel.setFilename(self.filename) @@ -213,7 +207,72 @@
  if index is not None:   self.repoview.setCurrentIndex(index)   - def revisionSelected(self, rev): + @pyqtSlot(QPoint, object) + def viewMenuRequest(self, point, selection): + 'User requested a context menu in repo view widget' + if not selection: + return + if self.menu is None: + self.menu = menu = QMenu(self) + a = menu.addAction(_('Visual diff...')) + a.setIcon(getmenuicon('visualdiff')) + a.triggered.connect(self.onVisualDiff) + a = menu.addAction(_('Diff to local...')) + a.setIcon(getmenuicon('ldiff')) + a.triggered.connect(self.onVisualDiffToLocal) + menu.addSeparator() + a = menu.addAction(_('Visual diff file...')) + a.setIcon(getmenuicon('visualdiff')) + a.triggered.connect(self.onVisualDiffFile) + a = menu.addAction(_('Diff file to local...')) + a.setIcon(getmenuicon('ldiff')) + a.triggered.connect(self.onVisualDiffFileToLocal) + self.selection = selection + self.menu.exec_(point) + + def onVisualDiff(self): + opts = dict(change=self.selection[0]) + dlg = visdiff.visualdiff(self.repo.ui, self.repo, [], opts) + if dlg: + dlg.exec_() + dlg.deleteLater() + + def onVisualDiffToLocal(self): + opts = dict(rev=['rev(%d)' % self.selection[0]]) + dlg = visdiff.visualdiff(self.repo.ui, self.repo, [], opts) + if dlg: + dlg.exec_() + dlg.deleteLater() + + def onVisualDiffFile(self): + rev = self.selection[0] + paths = [self.filerevmodel.graph.filename(rev)] + opts = dict(change=self.selection[0]) + dlg = visdiff.visualdiff(self.repo.ui, self.repo, paths, opts) + if dlg: + dlg.exec_() + dlg.deleteLater() + + def onVisualDiffFileToLocal(self): + rev = self.selection[0] + paths = [self.filerevmodel.graph.filename(rev)] + opts = dict(rev=['rev(%d)' % rev]) + dlg = visdiff.visualdiff(self.repo.ui, self.repo, paths, opts) + if dlg: + dlg.exec_() + dlg.deleteLater() + + @pyqtSlot(QString) + def onLinkActivated(self, link): + link = unicode(link) + if ':' in link: + scheme, param = link.split(':', 1) + if scheme == 'cset': + rev = self.repo[param].rev() + return self.goto(rev) + QDesktopServices.openUrl(QUrl(link)) + + def onRevisionSelected(self, rev):   pos = self.textView.verticalScrollBar().value()   ctx = self.filerevmodel.repo.changectx(rev)   self.textView.setContext(ctx) @@ -346,8 +405,8 @@
  table = getattr(self, 'tableView_revisions_%s' % side)   table.setTabKeyNavigation(False)   #table.installEventFilter(self) - table.revisionSelected.connect(self.revisionSelected) - table.revisionActivated.connect(self.revisionActivated) + table.revisionSelected.connect(self.onRevisionSelected) + table.revisionActivated.connect(self.onRevisionActivated)     self.viewers[side].verticalScrollBar().valueChanged.connect(   lambda value, side=side: self.vbar_changed(value, side)) @@ -399,7 +458,7 @@
  rev = self.filerevmodel.graph[0].rev   self.goto(rev)   - def revisionSelected(self, rev): + def onRevisionSelected(self, rev):   if rev is None or rev not in self.filerevmodel.graph.nodesdict:   return   if self.sender() is self.tableView_revisions_right: