Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py

changeset 5445
b24720037f1f
parent 5444
4799e2cf8401
child 5448
1a86766ed19a
diff -r 4799e2cf8401 -r b24720037f1f Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py
--- a/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Wed Jan 25 19:39:09 2017 +0100
+++ b/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Thu Jan 26 20:17:07 2017 +0100
@@ -15,9 +15,10 @@
 
 import os
 import re
+import collections
 
 from PyQt5.QtCore import pyqtSlot, Qt, QDate, QProcess, QTimer, QRegExp, \
-    QSize, QPoint
+    QSize, QPoint, QUrl
 from PyQt5.QtGui import QCursor, QColor, QPixmap, QPainter, QPen, QBrush, QIcon
 from PyQt5.QtWidgets import QWidget, QDialogButtonBox, QHeaderView, \
     QTreeWidgetItem, QApplication, QLineEdit, QMenu, QInputDialog
@@ -115,7 +116,8 @@
             "<tr><td><b>Author</b></td><td>{2}</td></tr>"
             "<tr><td><b>Branch</b></td><td>{3}</td></tr>"
             "<tr><td><b>Parents</b></td><td>{4}</td></tr>"
-            "{5}"
+            "<tr><td><b>Children</b></td><td>{5}</td></tr>"
+            "{6}"
             "</table>"
         )
         self.__tagsTemplate = self.tr(
@@ -173,6 +175,8 @@
         self.logTree.headerItem().setText(
             self.BookmarksColumn, self.tr("Bookmarks"))
         
+        self.detailsEdit.anchorClicked.connect(self.__revisionClicked)
+        
         self.__initActionsMenu()
     
     def __initActionsMenu(self):
@@ -284,6 +288,8 @@
         
         self.__projectRevision = -1
         self.__projectBranch = ""
+        
+        self.__childrenInfo = collections.defaultdict(list)
     
     def closeEvent(self, e):
         """
@@ -735,6 +741,8 @@
             itm.setData(0, self.__parentsRole, [])
         else:
             itm.setData(0, self.__parentsRole, parents)
+            for parent in parents:
+                self.__childrenInfo[parent].append(int(rev))
         
         if self.logTree.topLevelItemCount() > 1:
             topedges = \
@@ -1325,15 +1333,32 @@
                     itm.text(self.BookmarksColumn))
             else:
                 bookmarksStr = ""
+            rev = int(itm.text(self.RevisionColumn).split(":", 1)[0])
+            
+            parentLinks = []
+            for parent in [str(x) for x in itm.data(0, self.__parentsRole)]:
+                url = QUrl()
+                url.setScheme("rev")
+                url.setPath(parent)
+                parentLinks.append('<a href="{0}">{1}</a>'.format(
+                    url.toString(), parent))
+            
+            childLinks = []
+            for child in [str(x) for x in self.__childrenInfo[rev]]:
+                url = QUrl()
+                url.setScheme("rev")
+                url.setPath(child)
+                childLinks.append('<a href="{0}">{1}</a>'.format(
+                    url.toString(), child))
+            
             self.detailsEdit.setHtml(self.__detailsTemplate.format(
                 itm.text(self.RevisionColumn),
                 itm.text(self.DateColumn),
                 itm.text(self.AuthorColumn),
                 itm.text(self.BranchColumn).replace(
                     self.ClosedIndicator, ""),
-                ", ".join(
-                    [str(x) for x in itm.data(0, self.__parentsRole)]
-                ),
+                ", ".join(parentLinks),
+                ", ".join(childLinks),
                 tagsStr + bookmarksStr,
             ))
             
@@ -2004,3 +2029,28 @@
                 self,
                 self.tr("Find Commit"),
                 self.tr("""'{0}' was not found.""").format(self.rxEdit.text()))
+    
+    def __revisionClicked(self, url):
+        """
+        Private slot to handle the anchorClicked signal of the changeset
+        details pane.
+        
+        @param url URL that was clicked
+        @type QUrl
+        """
+        if url.scheme() == "rev":
+            # a parent or child revision was clicked, show the respective item
+            rev = url.path()
+            searchStr = "{0:>7}:".format(rev)
+            # format must be in sync with item generation format
+            items = self.logTree.findItems(searchStr, Qt.MatchStartsWith,
+                                           self.RevisionColumn)
+            if items:
+                itm = items[0]
+                if itm.isHidden():
+                    itm.setHidden(False)
+                self.logTree.setCurrentItem(itm)
+            else:
+                # load the next batch and try again
+                self.on_nextButton_clicked()
+                self.__revisionClicked(url)

eric ide

mercurial