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)