Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py

changeset 5506
9482a0ded319
parent 5503
20dd5c1e43ec
child 5512
f148796813d4
diff -r ba1134308a7b -r 9482a0ded319 Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py
--- a/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Sat Feb 11 10:57:25 2017 +0100
+++ b/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Sat Feb 11 15:35:07 2017 +0100
@@ -17,12 +17,12 @@
 import re
 import collections
 
-from PyQt5.QtCore import pyqtSlot, Qt, QDate, QProcess, QTimer, QRegExp, \
-    QSize, QPoint, QFileInfo
+from PyQt5.QtCore import pyqtSlot, qVersion, Qt, QDate, QProcess, QTimer, \
+    QRegExp, QSize, QPoint, QFileInfo
 from PyQt5.QtGui import QCursor, QColor, QPixmap, QPainter, QPen, QBrush, \
     QIcon, QTextCursor
 from PyQt5.QtWidgets import QWidget, QDialogButtonBox, QHeaderView, \
-    QTreeWidgetItem, QApplication, QLineEdit, QMenu, QInputDialog
+    QTreeWidgetItem, QApplication, QLineEdit, QMenu, QInputDialog, QToolTip
 
 from E5Gui.E5Application import e5App
 from E5Gui import E5MessageBox, E5FileDialog
@@ -73,6 +73,10 @@
         super(HgLogBrowserDialog, self).__init__(parent)
         self.setupUi(self)
         
+        windowFlags = self.windowFlags()
+        windowFlags |= Qt.WindowContextHelpButtonHint
+        self.setWindowFlags(windowFlags)
+        
         self.mainSplitter.setSizes([300, 400])
         self.mainSplitter.setStretchFactor(0, 1)
         self.mainSplitter.setStretchFactor(1, 2)
@@ -238,6 +242,11 @@
         Private method to initialize the actions menu.
         """
         self.__actionsMenu = QMenu()
+        self.__actionsMenu.setTearOffEnabled(True)
+        if qVersion() >= "5.1.0":
+            self.__actionsMenu.setToolTipsVisible(True)
+        else:
+            self.__actionsMenu.hovered.connect(self.__actionsMenuHovered)
         
         self.__graftAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("vcsGraft.png"),
@@ -333,6 +342,19 @@
         
         self.__actionsMenu.addSeparator()
         
+        self.__gpgSignAct = self.__actionsMenu.addAction(
+            UI.PixmapCache.getIcon("changesetSign.png"),
+            self.tr("Sign Revisions"), self.__gpgSignActTriggered)
+        self.__gpgSignAct.setToolTip(self.tr(
+            "Add a signature for the selected revisions"))
+        self.__gpgVerifyAct = self.__actionsMenu.addAction(
+            UI.PixmapCache.getIcon("changesetSignVerify.png"),
+            self.tr("Verify Signatures"), self.__gpgVerifyActTriggered)
+        self.__gpgVerifyAct.setToolTip(self.tr(
+            "Verify all signatures there may be for the selected revision"))
+        
+        self.__actionsMenu.addSeparator()
+        
         self.__stripAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("fileDelete.png"),
             self.tr("Strip Changesets"), self.__stripActTriggered)
@@ -351,8 +373,16 @@
             UI.PixmapCache.getIcon("actionsToolButton.png"))
         self.actionsButton.setMenu(self.__actionsMenu)
     
-    # TODO: add action "Sign Revision" (>= 1 revs) (GPG extension)
-    # TODO: add action "Verify Signature" (1 rev) (GPG extension)
+    def __actionsMenuHovered(self, action):
+        """
+        Private slot to show the tooltip for an action menu entry.
+        
+        @param action action to show tooltip for
+        @type QAction
+        """
+        QToolTip.showText(
+            QCursor.pos(), action.toolTip(),
+            self.__actionsMenu, self.__actionsMenu.actionGeometry(action))
     
     def __initData(self):
         """
@@ -1447,19 +1477,18 @@
                 # step 2: set the status of the graft action
                 self.__graftAct.setEnabled(otherBranches > 0)
             
-            self.__mergeAct.setEnabled(len(self.logTree.selectedItems()) == 1)
-            self.__tagAct.setEnabled(len(self.logTree.selectedItems()) == 1)
-            self.__switchAct.setEnabled(len(self.logTree.selectedItems()) == 1)
-            self.__bookmarkAct.setEnabled(
-                len(self.logTree.selectedItems()) == 1)
-            self.__bookmarkMoveAct.setEnabled(
-                len(self.logTree.selectedItems()) == 1)
+            selectedItemsCount = len(self.logTree.selectedItems())
+            self.__mergeAct.setEnabled(selectedItemsCount == 1)
+            self.__tagAct.setEnabled(selectedItemsCount == 1)
+            self.__switchAct.setEnabled(selectedItemsCount == 1)
+            self.__bookmarkAct.setEnabled(selectedItemsCount == 1)
+            self.__bookmarkMoveAct.setEnabled(selectedItemsCount == 1)
             
             if self.vcs.canPull():
                 self.__pullAct.setEnabled(True)
                 self.__lfPullAct.setEnabled(
                     self.vcs.isExtensionActive("largefiles") and
-                    bool(self.logTree.selectedItems()))
+                    selectedItemsCount > 0)
                 self.__fetchAct.setEnabled(
                     self.vcs.isExtensionActive("fetch"))
             else:
@@ -1469,7 +1498,7 @@
             
             if self.vcs.canPush():
                 self.__pushAct.setEnabled(
-                    len(self.logTree.selectedItems()) == 1 and
+                    selectedItemsCount == 1 and
                     self.logTree.selectedItems()[0].text(self.PhaseColumn) ==
                     self.phases["draft"])
                 self.__pushAllAct.setEnabled(True)
@@ -1479,10 +1508,17 @@
             
             self.__stripAct.setEnabled(
                 self.vcs.isExtensionActive("strip") and
-                len(self.logTree.selectedItems()) == 1)
+                selectedItemsCount == 1)
             
             self.__bundleAct.setEnabled(self.logTree.topLevelItemCount() > 0)
             
+            self.__gpgSignAct.setEnabled(
+                self.vcs.isExtensionActive("gpg") and
+                selectedItemsCount > 0)
+            self.__gpgVerifyAct.setEnabled(
+                self.vcs.isExtensionActive("gpg") and
+                selectedItemsCount == 1)
+            
             self.actionsButton.setEnabled(True)
         else:
             self.actionsButton.setEnabled(False)
@@ -2209,6 +2245,32 @@
         
         self.vcs.hgBundle(self.repodir, bundleData=bundleData)
     
+    @pyqtSlot()
+    def __gpgSignActTriggered(self):
+        """
+        Private slot to sign the selected revisions.
+        """
+        revs = []
+        for itm in self.logTree.selectedItems():
+            rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip()
+            if rev:
+                revs.append(rev)
+        
+        if revs:
+            self.vcs.getExtensionObject("gpg").hgGpgSign(
+                self.repodir, revisions=revs)
+    
+    @pyqtSlot()
+    def __gpgVerifyActTriggered(self):
+        """
+        Private slot to verify the signatures of a selected revisions.
+        """
+        rev = self.logTree.selectedItems()[0].text(self.RevisionColumn)\
+            .split(":", 1)[0].strip()
+        if rev:
+            self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures(
+                self.repodir, rev=rev)
+    
     def __selectAllActTriggered(self, select=True):
         """
         Private method to select or unselect all log entries.

eric ide

mercurial