Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 1.9, 1.9.1, and 1.9.2

sync: implement context menus for URL lists

Changeset 4e8dc1546750

Parent 66b276b91894

by Steve Borho

Changes to one file · Browse files at 4e8dc1546750 Showing diff from parent 66b276b91894 Diff from another changeset...

 
49
50
51
 
52
53
54
 
163
164
165
 
166
167
168
 
175
176
177
 
178
179
180
 
365
366
367
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
368
369
370
 
691
692
693
694
 
 
695
696
697
 
813
814
815
816
 
 
817
818
819
 
937
938
939
 
940
941
942
943
944
945
946
947
 
 
 
 
 
 
 
948
949
950
 
960
961
962
 
 
 
 
963
964
965
966
 
967
968
969
 
989
990
991
992
993
994
995
996
997
998
 
49
50
51
52
53
54
55
 
164
165
166
167
168
169
170
 
177
178
179
180
181
182
183
 
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
 
747
748
749
 
750
751
752
753
754
 
870
871
872
 
873
874
875
876
877
 
995
996
997
998
999
1000
1001
1002
 
 
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
 
1024
1025
1026
1027
1028
1029
1030
1031
1032
 
 
1033
1034
1035
1036
 
1056
1057
1058
 
 
 
 
1059
1060
1061
@@ -49,6 +49,7 @@
  self.curpw = None   self.updateInProgress = False   self.opts = {} + self.cmenu = None     self.repo.configChanged.connect(self.configChanged)   @@ -163,6 +164,7 @@
  self.hgrctv = PathsTree(self, True)   self.hgrctv.clicked.connect(self.pathSelected)   self.hgrctv.removeAlias.connect(self.removeAlias) + self.hgrctv.menuRequest.connect(self.menuRequest)   pathsframe = QFrame()   pathsframe.setFrameStyle(QFrame.StyledPanel|QFrame.Raised)   pathsbox = QVBoxLayout() @@ -175,6 +177,7 @@
    self.reltv = PathsTree(self, False)   self.reltv.clicked.connect(self.pathSelected) + self.reltv.menuRequest.connect(self.menuRequest)   pathsframe = QFrame()   pathsframe.setFrameStyle(QFrame.StyledPanel|QFrame.Raised)   pathsbox = QVBoxLayout() @@ -365,6 +368,59 @@
  def canExit(self):   return not self.cmd.core.is_running()   + @pyqtSlot(QPoint, QString, QString, bool) + def menuRequest(self, point, url, alias, editable): + 'menu event emitted by one of the two URL lists' + if not self.cmenu: + acts = [] + menu = QMenu(self) + for text, cb in ((_('Explore'), self.exploreurl), + (_('Terminal'), self.terminalurl), + (_('Remove'), self.removeurl)): + act = QAction(text, self) + act.triggered.connect(cb) + acts.append(act) + menu.addAction(act) + self.cmenu = menu + self.acts = acts + + self.menuurl = url + self.menualias = alias + self.acts[-1].setEnabled(editable) + self.cmenu.exec_(point) + + def exploreurl(self): + url = hglib.fromunicode(self.menuurl) + u, h, p, folder, pw, scheme = self.urlparse(url) + if scheme == 'local': + QDesktopServices.openUrl(QUrl.fromLocalFile(folder)) + else: + QDesktopServices.openUrl(QUrl(url)) + + def terminalurl(self): + url = hglib.fromunicode(self.menuurl) + u, h, p, folder, pw, scheme = self.urlparse(url) + if scheme != 'local': + qtlib.InfoMsgBox(_('Repository not local'), + _('A terminal shell cannot be opened for remote')) + return + shell = self.repo.shell() + if shell: + cwd = os.getcwd() + try: + os.chdir(folder) + QProcess.startDetached(shell) + finally: + os.chdir(cwd) + else: + qtlib.InfoMsgBox(_('No shell configured'), + _('A terminal shell must be configured')) + def removeurl(self): + if qtlib.QuestionMsgBox(_('Confirm path delete'), + _('Delete %s from your repo configuration file?') % self.menualias, + parent=self): + self.removeAlias(self.menualias) +   def keyPressEvent(self, event):   if event.matches(QKeySequence.Refresh):   self.reload() @@ -691,7 +747,8 @@
  layout = QVBoxLayout()   self.setLayout(layout)   self.setWindowTitle(_('Post Pull Behavior')) - self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) + self.setWindowFlags(self.windowFlags() & + ~Qt.WindowContextHelpButtonHint)     lbl = QLabel(_('Select post-pull operation for this repository'))   layout.addWidget(lbl) @@ -813,7 +870,8 @@
  layout.addWidget(bb)   self.aliasentry.selectAll()   self.setWindowTitle(_('Save Peer Path')) - self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) + self.setWindowFlags(self.windowFlags() & + ~Qt.WindowContextHelpButtonHint)   QTimer.singleShot(0, lambda:self.aliasentry.setFocus())     def accept(self): @@ -937,14 +995,20 @@
   class PathsTree(QTreeView):   removeAlias = pyqtSignal(QString) + menuRequest = pyqtSignal(QPoint, QString, QString, bool)     def __init__(self, parent, editable):   QTreeView.__init__(self, parent)   self.setSelectionMode(QTreeView.SingleSelection) - self.setContextMenuPolicy(Qt.CustomContextMenu) - self.customContextMenuRequested.connect(self.menuRequest)   self.editable = editable   + def contextMenuEvent(self, event): + for index in self.selectedRows(): + alias = index.data(Qt.DisplayRole).toString() + url = index.sibling(index.row(), 1).data(Qt.DisplayRole).toString() + self.menuRequest.emit(event.globalPos(), url, alias, self.editable) + return +   def keyPressEvent(self, event):   if self.editable and event.matches(QKeySequence.Delete):   self.deleteSelected() @@ -960,10 +1024,13 @@
  if r:   self.removeAlias.emit(alias)   + def selectedUrls(self): + for index in self.selectedRows(): + yield index.sibling(index.row(), 1).data(Qt.DisplayRole).toString() +   def dragObject(self):   urls = [] - for index in self.selectedRows(): - url = index.sibling(index.row(), 1).data(Qt.DisplayRole).toString() + for url in self.selectedUrls():   u = QUrl()   u.setPath(url)   urls.append(u) @@ -989,10 +1056,6 @@
  self.dragObject()   return super(PathsTree, self).mouseMoveEvent(event)   - def menuRequest(self, point): - point = self.mapToGlobal(point) - pass -   def selectedRows(self):   return self.selectionModel().selectedRows()