13 except NameError: |
13 except NameError: |
14 pass |
14 pass |
15 |
15 |
16 import os |
16 import os |
17 import re |
17 import re |
|
18 import collections |
18 |
19 |
19 from PyQt5.QtCore import pyqtSlot, Qt, QDate, QProcess, QTimer, QRegExp, \ |
20 from PyQt5.QtCore import pyqtSlot, Qt, QDate, QProcess, QTimer, QRegExp, \ |
20 QSize, QPoint |
21 QSize, QPoint, QUrl |
21 from PyQt5.QtGui import QCursor, QColor, QPixmap, QPainter, QPen, QBrush, QIcon |
22 from PyQt5.QtGui import QCursor, QColor, QPixmap, QPainter, QPen, QBrush, QIcon |
22 from PyQt5.QtWidgets import QWidget, QDialogButtonBox, QHeaderView, \ |
23 from PyQt5.QtWidgets import QWidget, QDialogButtonBox, QHeaderView, \ |
23 QTreeWidgetItem, QApplication, QLineEdit, QMenu, QInputDialog |
24 QTreeWidgetItem, QApplication, QLineEdit, QMenu, QInputDialog |
24 |
25 |
25 from E5Gui.E5Application import e5App |
26 from E5Gui.E5Application import e5App |
113 "<tr><td><b>Revision</b></td><td>{0}</td></tr>" |
114 "<tr><td><b>Revision</b></td><td>{0}</td></tr>" |
114 "<tr><td><b>Date</b></td><td>{1}</td></tr>" |
115 "<tr><td><b>Date</b></td><td>{1}</td></tr>" |
115 "<tr><td><b>Author</b></td><td>{2}</td></tr>" |
116 "<tr><td><b>Author</b></td><td>{2}</td></tr>" |
116 "<tr><td><b>Branch</b></td><td>{3}</td></tr>" |
117 "<tr><td><b>Branch</b></td><td>{3}</td></tr>" |
117 "<tr><td><b>Parents</b></td><td>{4}</td></tr>" |
118 "<tr><td><b>Parents</b></td><td>{4}</td></tr>" |
118 "{5}" |
119 "<tr><td><b>Children</b></td><td>{5}</td></tr>" |
|
120 "{6}" |
119 "</table>" |
121 "</table>" |
120 ) |
122 ) |
121 self.__tagsTemplate = self.tr( |
123 self.__tagsTemplate = self.tr( |
122 "<tr><td><b>Tags</b></td><td>{0}</td></tr>" |
124 "<tr><td><b>Tags</b></td><td>{0}</td></tr>" |
123 ) |
125 ) |
170 self.logTree.setIconSize( |
172 self.logTree.setIconSize( |
171 QSize(100 * self.__rowHeight, self.__rowHeight)) |
173 QSize(100 * self.__rowHeight, self.__rowHeight)) |
172 self.BookmarksColumn = self.logTree.columnCount() |
174 self.BookmarksColumn = self.logTree.columnCount() |
173 self.logTree.headerItem().setText( |
175 self.logTree.headerItem().setText( |
174 self.BookmarksColumn, self.tr("Bookmarks")) |
176 self.BookmarksColumn, self.tr("Bookmarks")) |
|
177 |
|
178 self.detailsEdit.anchorClicked.connect(self.__revisionClicked) |
175 |
179 |
176 self.__initActionsMenu() |
180 self.__initActionsMenu() |
177 |
181 |
178 def __initActionsMenu(self): |
182 def __initActionsMenu(self): |
179 """ |
183 """ |
282 |
286 |
283 self.__branchColors = {} |
287 self.__branchColors = {} |
284 |
288 |
285 self.__projectRevision = -1 |
289 self.__projectRevision = -1 |
286 self.__projectBranch = "" |
290 self.__projectBranch = "" |
|
291 |
|
292 self.__childrenInfo = collections.defaultdict(list) |
287 |
293 |
288 def closeEvent(self, e): |
294 def closeEvent(self, e): |
289 """ |
295 """ |
290 Protected slot implementing a close event handler. |
296 Protected slot implementing a close event handler. |
291 |
297 |
733 itm.setData(0, self.__edgesRole, edges) |
739 itm.setData(0, self.__edgesRole, edges) |
734 if parents == [-1]: |
740 if parents == [-1]: |
735 itm.setData(0, self.__parentsRole, []) |
741 itm.setData(0, self.__parentsRole, []) |
736 else: |
742 else: |
737 itm.setData(0, self.__parentsRole, parents) |
743 itm.setData(0, self.__parentsRole, parents) |
|
744 for parent in parents: |
|
745 self.__childrenInfo[parent].append(int(rev)) |
738 |
746 |
739 if self.logTree.topLevelItemCount() > 1: |
747 if self.logTree.topLevelItemCount() > 1: |
740 topedges = \ |
748 topedges = \ |
741 self.logTree.topLevelItem( |
749 self.logTree.topLevelItem( |
742 self.logTree.indexOfTopLevelItem(itm) - 1)\ |
750 self.logTree.indexOfTopLevelItem(itm) - 1)\ |
1323 if itm.text(self.BookmarksColumn): |
1331 if itm.text(self.BookmarksColumn): |
1324 bookmarksStr = self.__bookmarksTemplate.format( |
1332 bookmarksStr = self.__bookmarksTemplate.format( |
1325 itm.text(self.BookmarksColumn)) |
1333 itm.text(self.BookmarksColumn)) |
1326 else: |
1334 else: |
1327 bookmarksStr = "" |
1335 bookmarksStr = "" |
|
1336 rev = int(itm.text(self.RevisionColumn).split(":", 1)[0]) |
|
1337 |
|
1338 parentLinks = [] |
|
1339 for parent in [str(x) for x in itm.data(0, self.__parentsRole)]: |
|
1340 url = QUrl() |
|
1341 url.setScheme("rev") |
|
1342 url.setPath(parent) |
|
1343 parentLinks.append('<a href="{0}">{1}</a>'.format( |
|
1344 url.toString(), parent)) |
|
1345 |
|
1346 childLinks = [] |
|
1347 for child in [str(x) for x in self.__childrenInfo[rev]]: |
|
1348 url = QUrl() |
|
1349 url.setScheme("rev") |
|
1350 url.setPath(child) |
|
1351 childLinks.append('<a href="{0}">{1}</a>'.format( |
|
1352 url.toString(), child)) |
|
1353 |
1328 self.detailsEdit.setHtml(self.__detailsTemplate.format( |
1354 self.detailsEdit.setHtml(self.__detailsTemplate.format( |
1329 itm.text(self.RevisionColumn), |
1355 itm.text(self.RevisionColumn), |
1330 itm.text(self.DateColumn), |
1356 itm.text(self.DateColumn), |
1331 itm.text(self.AuthorColumn), |
1357 itm.text(self.AuthorColumn), |
1332 itm.text(self.BranchColumn).replace( |
1358 itm.text(self.BranchColumn).replace( |
1333 self.ClosedIndicator, ""), |
1359 self.ClosedIndicator, ""), |
1334 ", ".join( |
1360 ", ".join(parentLinks), |
1335 [str(x) for x in itm.data(0, self.__parentsRole)] |
1361 ", ".join(childLinks), |
1336 ), |
|
1337 tagsStr + bookmarksStr, |
1362 tagsStr + bookmarksStr, |
1338 )) |
1363 )) |
1339 |
1364 |
1340 for line in itm.data(0, self.__messageRole): |
1365 for line in itm.data(0, self.__messageRole): |
1341 self.messageEdit.append(line.strip()) |
1366 self.messageEdit.append(line.strip()) |
2002 else: |
2027 else: |
2003 E5MessageBox.information( |
2028 E5MessageBox.information( |
2004 self, |
2029 self, |
2005 self.tr("Find Commit"), |
2030 self.tr("Find Commit"), |
2006 self.tr("""'{0}' was not found.""").format(self.rxEdit.text())) |
2031 self.tr("""'{0}' was not found.""").format(self.rxEdit.text())) |
|
2032 |
|
2033 def __revisionClicked(self, url): |
|
2034 """ |
|
2035 Private slot to handle the anchorClicked signal of the changeset |
|
2036 details pane. |
|
2037 |
|
2038 @param url URL that was clicked |
|
2039 @type QUrl |
|
2040 """ |
|
2041 if url.scheme() == "rev": |
|
2042 # a parent or child revision was clicked, show the respective item |
|
2043 rev = url.path() |
|
2044 searchStr = "{0:>7}:".format(rev) |
|
2045 # format must be in sync with item generation format |
|
2046 items = self.logTree.findItems(searchStr, Qt.MatchStartsWith, |
|
2047 self.RevisionColumn) |
|
2048 if items: |
|
2049 itm = items[0] |
|
2050 if itm.isHidden(): |
|
2051 itm.setHidden(False) |
|
2052 self.logTree.setCurrentItem(itm) |
|
2053 else: |
|
2054 # load the next batch and try again |
|
2055 self.on_nextButton_clicked() |
|
2056 self.__revisionClicked(url) |