eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py

branch
maintenance
changeset 8176
31965986ecd1
parent 8043
0acf98cd089a
parent 8151
8c1445825e7b
child 8273
698ae46f40a4
equal deleted inserted replaced
8153:e01ae92db699 8176:31965986ecd1
77 """ 77 """
78 super(HgLogBrowserDialog, self).__init__(parent) 78 super(HgLogBrowserDialog, self).__init__(parent)
79 self.setupUi(self) 79 self.setupUi(self)
80 80
81 windowFlags = self.windowFlags() 81 windowFlags = self.windowFlags()
82 windowFlags |= Qt.WindowContextHelpButtonHint 82 windowFlags |= Qt.WindowType.WindowContextHelpButtonHint
83 self.setWindowFlags(windowFlags) 83 self.setWindowFlags(windowFlags)
84 84
85 self.mainSplitter.setSizes([300, 400]) 85 self.mainSplitter.setSizes([300, 400])
86 self.mainSplitter.setStretchFactor(0, 1) 86 self.mainSplitter.setStretchFactor(0, 1)
87 self.mainSplitter.setStretchFactor(1, 2) 87 self.mainSplitter.setStretchFactor(1, 2)
101 elif mode == "outgoing": 101 elif mode == "outgoing":
102 self.setWindowTitle(self.tr("Mercurial Log (Outgoing)")) 102 self.setWindowTitle(self.tr("Mercurial Log (Outgoing)"))
103 elif mode == "full_log": 103 elif mode == "full_log":
104 self.setWindowTitle(self.tr("Mercurial Full Log")) 104 self.setWindowTitle(self.tr("Mercurial Full Log"))
105 105
106 self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) 106 self.buttonBox.button(
107 self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) 107 QDialogButtonBox.StandardButton.Close).setEnabled(False)
108 self.buttonBox.button(
109 QDialogButtonBox.StandardButton.Cancel).setDefault(True)
108 110
109 self.filesTree.headerItem().setText(self.filesTree.columnCount(), "") 111 self.filesTree.headerItem().setText(self.filesTree.columnCount(), "")
110 self.filesTree.header().setSortIndicator(0, Qt.AscendingOrder) 112 self.filesTree.header().setSortIndicator(
113 0, Qt.SortOrder.AscendingOrder)
111 114
112 self.upButton.setIcon(UI.PixmapCache.getIcon("1uparrow")) 115 self.upButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
113 self.downButton.setIcon(UI.PixmapCache.getIcon("1downarrow")) 116 self.downButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
114 117
115 self.refreshButton = self.buttonBox.addButton( 118 self.refreshButton = self.buttonBox.addButton(
116 self.tr("&Refresh"), QDialogButtonBox.ActionRole) 119 self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
117 self.refreshButton.setToolTip( 120 self.refreshButton.setToolTip(
118 self.tr("Press to refresh the list of changesets")) 121 self.tr("Press to refresh the list of changesets"))
119 self.refreshButton.setEnabled(False) 122 self.refreshButton.setEnabled(False)
120 123
121 self.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow")) 124 self.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow"))
189 self.fromDate.setDisplayFormat("yyyy-MM-dd") 192 self.fromDate.setDisplayFormat("yyyy-MM-dd")
190 self.toDate.setDisplayFormat("yyyy-MM-dd") 193 self.toDate.setDisplayFormat("yyyy-MM-dd")
191 self.__resetUI() 194 self.__resetUI()
192 195
193 # roles used in the log tree 196 # roles used in the log tree
194 self.__messageRole = Qt.UserRole 197 self.__messageRole = Qt.ItemDataRole.UserRole
195 self.__changesRole = Qt.UserRole + 1 198 self.__changesRole = Qt.ItemDataRole.UserRole + 1
196 self.__edgesRole = Qt.UserRole + 2 199 self.__edgesRole = Qt.ItemDataRole.UserRole + 2
197 self.__parentsRole = Qt.UserRole + 3 200 self.__parentsRole = Qt.ItemDataRole.UserRole + 3
198 self.__latestTagRole = Qt.UserRole + 4 201 self.__latestTagRole = Qt.ItemDataRole.UserRole + 4
199 self.__incomingRole = Qt.UserRole + 5 202 self.__incomingRole = Qt.ItemDataRole.UserRole + 5
200 203
201 # roles used in the file tree 204 # roles used in the file tree
202 self.__diffFileLineRole = Qt.UserRole 205 self.__diffFileLineRole = Qt.ItemDataRole.UserRole
203 206
204 self.flags = { 207 self.flags = {
205 'A': self.tr('Added'), 208 'A': self.tr('Added'),
206 'D': self.tr('Deleted'), 209 'D': self.tr('Deleted'),
207 'M': self.tr('Modified'), 210 'M': self.tr('Modified'),
497 500
498 def __resizeColumnsLog(self): 501 def __resizeColumnsLog(self):
499 """ 502 """
500 Private method to resize the log tree columns. 503 Private method to resize the log tree columns.
501 """ 504 """
502 self.logTree.header().resizeSections(QHeaderView.ResizeToContents) 505 self.logTree.header().resizeSections(
506 QHeaderView.ResizeMode.ResizeToContents)
503 self.logTree.header().setStretchLastSection(True) 507 self.logTree.header().setStretchLastSection(True)
504 508
505 def __resizeColumnsFiles(self): 509 def __resizeColumnsFiles(self):
506 """ 510 """
507 Private method to resize the changed files tree columns. 511 Private method to resize the changed files tree columns.
508 """ 512 """
509 self.filesTree.header().resizeSections(QHeaderView.ResizeToContents) 513 self.filesTree.header().resizeSections(
514 QHeaderView.ResizeMode.ResizeToContents)
510 self.filesTree.header().setStretchLastSection(True) 515 self.filesTree.header().setStretchLastSection(True)
511 516
512 def __resortFiles(self): 517 def __resortFiles(self):
513 """ 518 """
514 Private method to resort the changed files tree. 519 Private method to resort the changed files tree.
628 @param col column number (integer) 633 @param col column number (integer)
629 @param radius radius of the indicator circle (integer) 634 @param radius radius of the indicator circle (integer)
630 """ 635 """
631 return int(1.2 * radius) * col + radius // 2 + 3 636 return int(1.2 * radius) * col + radius // 2 + 3
632 637
633 textColor = self.logTree.palette().color(QPalette.Text) 638 textColor = self.logTree.palette().color(QPalette.ColorRole.Text)
634 639
635 radius = self.__dotRadius 640 radius = self.__dotRadius
636 w = len(bottomedges) * radius + 20 641 w = len(bottomedges) * radius + 20
637 h = self.__rowHeight 642 h = self.__rowHeight
638 643
640 dot_y = h // 2 645 dot_y = h // 2
641 646
642 pix = QPixmap(w, h) 647 pix = QPixmap(w, h)
643 pix.fill(QColor(0, 0, 0, 0)) # draw transparent background 648 pix.fill(QColor(0, 0, 0, 0)) # draw transparent background
644 painter = QPainter(pix) 649 painter = QPainter(pix)
645 painter.setRenderHint(QPainter.Antialiasing) 650 painter.setRenderHint(QPainter.RenderHint.Antialiasing)
646 651
647 # draw the revision history lines 652 # draw the revision history lines
648 for y1, y2, lines in ((0, h, bottomedges), 653 for y1, y2, lines in ((0, h, bottomedges),
649 (-h, 0, topedges)): 654 (-h, 0, topedges)):
650 if lines: 655 if lines:
975 Private method to retrieve log entries from the repository. 980 Private method to retrieve log entries from the repository.
976 981
977 @param startRev revision number to start from (integer, string) 982 @param startRev revision number to start from (integer, string)
978 @param noEntries number of entries to get (0 = default) (int) 983 @param noEntries number of entries to get (0 = default) (int)
979 """ 984 """
980 self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) 985 self.buttonBox.button(
981 self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True) 986 QDialogButtonBox.StandardButton.Close).setEnabled(False)
982 self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) 987 self.buttonBox.button(
988 QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
989 self.buttonBox.button(
990 QDialogButtonBox.StandardButton.Cancel).setDefault(True)
983 QApplication.processEvents() 991 QApplication.processEvents()
984 992
985 with E5OverrideCursor(): 993 with E5OverrideCursor():
986 self.buf = [] 994 self.buf = []
987 self.cancelled = False 995 self.cancelled = False
1113 def __finish(self): 1121 def __finish(self):
1114 """ 1122 """
1115 Private slot called when the process finished or the user pressed 1123 Private slot called when the process finished or the user pressed
1116 the button. 1124 the button.
1117 """ 1125 """
1118 self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True) 1126 self.buttonBox.button(
1119 self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False) 1127 QDialogButtonBox.StandardButton.Close).setEnabled(True)
1120 self.buttonBox.button(QDialogButtonBox.Close).setDefault(True) 1128 self.buttonBox.button(
1129 QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
1130 self.buttonBox.button(
1131 QDialogButtonBox.StandardButton.Close).setDefault(True)
1121 1132
1122 self.refreshButton.setEnabled(True) 1133 self.refreshButton.setEnabled(True)
1123 1134
1124 while self.__finishCallbacks: 1135 while self.__finishCallbacks:
1125 self.__finishCallbacks.pop(0)() 1136 self.__finishCallbacks.pop(0)()
1236 log["author"], log["date"], 1247 log["author"], log["date"],
1237 log["message"], log["revision"], changedPaths, 1248 log["message"], log["revision"], changedPaths,
1238 log["parents"], log["branches"], log["tags"], 1249 log["parents"], log["branches"], log["tags"],
1239 log["phase"], log["bookmarks"], log["latesttag"], 1250 log["phase"], log["bookmarks"], log["latesttag"],
1240 canPush=canPush) 1251 canPush=canPush)
1241 dt = QDate.fromString(log["date"], Qt.ISODate) 1252 dt = QDate.fromString(log["date"], Qt.DateFormat.ISODate)
1242 if ( 1253 if (
1243 not self.__maxDate.isValid() and 1254 not self.__maxDate.isValid() and
1244 not self.__minDate.isValid() 1255 not self.__minDate.isValid()
1245 ): 1256 ):
1246 self.__maxDate = dt 1257 self.__maxDate = dt
1260 if self.__started: 1271 if self.__started:
1261 if not self.__finishCallbacks: 1272 if not self.__finishCallbacks:
1262 # we are really done 1273 # we are really done
1263 if self.__selectedRevisions: 1274 if self.__selectedRevisions:
1264 foundItems = self.logTree.findItems( 1275 foundItems = self.logTree.findItems(
1265 self.__selectedRevisions[0], Qt.MatchExactly, 1276 self.__selectedRevisions[0], Qt.MatchFlag.MatchExactly,
1266 self.RevisionColumn) 1277 self.RevisionColumn)
1267 if foundItems: 1278 if foundItems:
1268 self.logTree.setCurrentItem(foundItems[0]) 1279 self.logTree.setCurrentItem(foundItems[0])
1269 else: 1280 else:
1270 self.logTree.setCurrentItem( 1281 self.logTree.setCurrentItem(
1272 elif self.__projectWorkingDirParents: 1283 elif self.__projectWorkingDirParents:
1273 for rev in self.__projectWorkingDirParents: 1284 for rev in self.__projectWorkingDirParents:
1274 # rev string format must match with the format of the 1285 # rev string format must match with the format of the
1275 # __generateLogItem() method 1286 # __generateLogItem() method
1276 items = self.logTree.findItems( 1287 items = self.logTree.findItems(
1277 "{0:>7}:".format(rev), Qt.MatchStartsWith, 1288 "{0:>7}:".format(rev),
1289 Qt.MatchFlag.MatchStartsWith,
1278 self.RevisionColumn) 1290 self.RevisionColumn)
1279 if items: 1291 if items:
1280 self.logTree.setCurrentItem(items[0]) 1292 self.logTree.setCurrentItem(items[0])
1281 break 1293 break
1282 else: 1294 else:
1322 # restore selected item 1334 # restore selected item
1323 if self.__selectedRevisions and not self.__finishCallbacks: 1335 if self.__selectedRevisions and not self.__finishCallbacks:
1324 # we are really done 1336 # we are really done
1325 for revision in self.__selectedRevisions: 1337 for revision in self.__selectedRevisions:
1326 items = self.logTree.findItems( 1338 items = self.logTree.findItems(
1327 revision, Qt.MatchExactly, self.RevisionColumn) 1339 revision, Qt.MatchFlag.MatchExactly, self.RevisionColumn)
1328 if items: 1340 if items:
1329 items[0].setSelected(True) 1341 items[0].setSelected(True)
1330 self.__selectedRevisions = [] 1342 self.__selectedRevisions = []
1331 1343
1332 def __showError(self, out): 1344 def __showError(self, out):
1343 """ 1355 """
1344 Private slot called by a button of the button box clicked. 1356 Private slot called by a button of the button box clicked.
1345 1357
1346 @param button button that was clicked (QAbstractButton) 1358 @param button button that was clicked (QAbstractButton)
1347 """ 1359 """
1348 if button == self.buttonBox.button(QDialogButtonBox.Close): 1360 if button == self.buttonBox.button(
1361 QDialogButtonBox.StandardButton.Close
1362 ):
1349 self.close() 1363 self.close()
1350 elif button == self.buttonBox.button(QDialogButtonBox.Cancel): 1364 elif button == self.buttonBox.button(
1365 QDialogButtonBox.StandardButton.Cancel
1366 ):
1351 self.cancelled = True 1367 self.cancelled = True
1352 self.__hgClient.cancel() 1368 self.__hgClient.cancel()
1353 elif button == self.refreshButton: 1369 elif button == self.refreshButton:
1354 self.on_refreshButton_clicked() 1370 self.on_refreshButton_clicked()
1355 1371
1776 @param date new date (QDate) 1792 @param date new date (QDate)
1777 """ 1793 """
1778 if self.__actionMode() == "filter": 1794 if self.__actionMode() == "filter":
1779 self.__filterLogs() 1795 self.__filterLogs()
1780 1796
1781 @pyqtSlot(str) 1797 @pyqtSlot(int)
1782 def on_branchCombo_activated(self, txt): 1798 def on_branchCombo_activated(self, index):
1783 """ 1799 """
1784 Private slot called, when a new branch is selected. 1800 Private slot called, when a new branch is selected.
1785 1801
1786 @param txt text of the selected branch (string) 1802 @param index index of the selected entry
1803 @type int
1787 """ 1804 """
1788 if self.__actionMode() == "filter": 1805 if self.__actionMode() == "filter":
1789 self.__filterLogs() 1806 self.__filterLogs()
1790 1807
1791 @pyqtSlot(str) 1808 @pyqtSlot(int)
1792 def on_fieldCombo_activated(self, txt): 1809 def on_fieldCombo_activated(self, index):
1793 """ 1810 """
1794 Private slot called, when a new filter field is selected. 1811 Private slot called, when a new filter field is selected.
1795 1812
1796 @param txt text of the selected field (string) 1813 @param index index of the selected entry
1814 @type int
1797 """ 1815 """
1798 if self.__actionMode() == "filter": 1816 if self.__actionMode() == "filter":
1799 self.__filterLogs() 1817 self.__filterLogs()
1800 1818
1801 @pyqtSlot(str) 1819 @pyqtSlot(str)
1918 1936
1919 @param addNext flag indicating to get a second batch of log entries as 1937 @param addNext flag indicating to get a second batch of log entries as
1920 well 1938 well
1921 @type bool 1939 @type bool
1922 """ 1940 """
1923 self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) 1941 self.buttonBox.button(
1924 self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True) 1942 QDialogButtonBox.StandardButton.Close).setEnabled(False)
1925 self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) 1943 self.buttonBox.button(
1944 QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
1945 self.buttonBox.button(
1946 QDialogButtonBox.StandardButton.Cancel).setDefault(True)
1926 1947
1927 self.refreshButton.setEnabled(False) 1948 self.refreshButton.setEnabled(False)
1928 1949
1929 # save the selected items commit IDs 1950 # save the selected items commit IDs
1930 self.__selectedRevisions = [] 1951 self.__selectedRevisions = []
2091 bookmark, ok = QInputDialog.getText( 2112 bookmark, ok = QInputDialog.getText(
2092 self, 2113 self,
2093 self.tr("Define Bookmark"), 2114 self.tr("Define Bookmark"),
2094 self.tr('Enter bookmark name for changeset "{0}":').format( 2115 self.tr('Enter bookmark name for changeset "{0}":').format(
2095 changeset), 2116 changeset),
2096 QLineEdit.Normal) 2117 QLineEdit.EchoMode.Normal)
2097 if ok and bool(bookmark): 2118 if ok and bool(bookmark):
2098 self.vcs.hgBookmarkDefine( 2119 self.vcs.hgBookmarkDefine(
2099 revision="rev({0})".format(rev), 2120 revision="rev({0})".format(rev),
2100 bookmark=bookmark) 2121 bookmark=bookmark)
2101 self.on_refreshButton_clicked() 2122 self.on_refreshButton_clicked()
2456 if url.scheme() == "rev": 2477 if url.scheme() == "rev":
2457 # a parent or child revision was clicked, show the respective item 2478 # a parent or child revision was clicked, show the respective item
2458 rev = url.path() 2479 rev = url.path()
2459 searchStr = "{0:>7}:".format(rev) 2480 searchStr = "{0:>7}:".format(rev)
2460 # format must be in sync with item generation format 2481 # format must be in sync with item generation format
2461 items = self.logTree.findItems(searchStr, Qt.MatchStartsWith, 2482 items = self.logTree.findItems(
2462 self.RevisionColumn) 2483 searchStr, Qt.MatchFlag.MatchStartsWith, self.RevisionColumn)
2463 if items: 2484 if items:
2464 itm = items[0] 2485 itm = items[0]
2465 if itm.isHidden(): 2486 if itm.isHidden():
2466 itm.setHidden(False) 2487 itm.setHidden(False)
2467 self.logTree.setCurrentItem(itm) 2488 self.logTree.setCurrentItem(itm)
2554 else: 2575 else:
2555 for oldFileName, newFileName, lineNumber in fileSeparators: 2576 for oldFileName, newFileName, lineNumber in fileSeparators:
2556 for fileName in (oldFileName, newFileName): 2577 for fileName in (oldFileName, newFileName):
2557 if fileName != "__NULL__": 2578 if fileName != "__NULL__":
2558 items = self.filesTree.findItems( 2579 items = self.filesTree.findItems(
2559 fileName, Qt.MatchExactly, 1) 2580 fileName, Qt.MatchFlag.MatchExactly, 1)
2560 for item in items: 2581 for item in items:
2561 item.setData(0, self.__diffFileLineRole, 2582 item.setData(0, self.__diffFileLineRole,
2562 lineNumber) 2583 lineNumber)
2563 2584
2564 tc = self.diffEdit.textCursor() 2585 tc = self.diffEdit.textCursor()
2565 tc.movePosition(QTextCursor.Start) 2586 tc.movePosition(QTextCursor.MoveOperation.Start)
2566 self.diffEdit.setTextCursor(tc) 2587 self.diffEdit.setTextCursor(tc)
2567 self.diffEdit.ensureCursorVisible() 2588 self.diffEdit.ensureCursorVisible()
2568 2589
2569 @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem) 2590 @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
2570 def on_filesTree_currentItemChanged(self, current, previous): 2591 def on_filesTree_currentItemChanged(self, current, previous):
2577 if current: 2598 if current:
2578 para = current.data(0, self.__diffFileLineRole) 2599 para = current.data(0, self.__diffFileLineRole)
2579 if para is not None: 2600 if para is not None:
2580 if para == 0: 2601 if para == 0:
2581 tc = self.diffEdit.textCursor() 2602 tc = self.diffEdit.textCursor()
2582 tc.movePosition(QTextCursor.Start) 2603 tc.movePosition(QTextCursor.MoveOperation.Start)
2583 self.diffEdit.setTextCursor(tc) 2604 self.diffEdit.setTextCursor(tc)
2584 self.diffEdit.ensureCursorVisible() 2605 self.diffEdit.ensureCursorVisible()
2585 elif para == -1: 2606 elif para == -1:
2586 tc = self.diffEdit.textCursor() 2607 tc = self.diffEdit.textCursor()
2587 tc.movePosition(QTextCursor.End) 2608 tc.movePosition(QTextCursor.MoveOperation.End)
2588 self.diffEdit.setTextCursor(tc) 2609 self.diffEdit.setTextCursor(tc)
2589 self.diffEdit.ensureCursorVisible() 2610 self.diffEdit.ensureCursorVisible()
2590 else: 2611 else:
2591 # step 1: move cursor to end 2612 # step 1: move cursor to end
2592 tc = self.diffEdit.textCursor() 2613 tc = self.diffEdit.textCursor()
2593 tc.movePosition(QTextCursor.End) 2614 tc.movePosition(QTextCursor.MoveOperation.End)
2594 self.diffEdit.setTextCursor(tc) 2615 self.diffEdit.setTextCursor(tc)
2595 self.diffEdit.ensureCursorVisible() 2616 self.diffEdit.ensureCursorVisible()
2596 2617
2597 # step 2: move cursor to desired line 2618 # step 2: move cursor to desired line
2598 tc = self.diffEdit.textCursor() 2619 tc = self.diffEdit.textCursor()
2599 delta = tc.blockNumber() - para 2620 delta = tc.blockNumber() - para
2600 tc.movePosition(QTextCursor.PreviousBlock, 2621 tc.movePosition(QTextCursor.MoveOperation.PreviousBlock,
2601 QTextCursor.MoveAnchor, delta) 2622 QTextCursor.MoveMode.MoveAnchor, delta)
2602 self.diffEdit.setTextCursor(tc) 2623 self.diffEdit.setTextCursor(tc)
2603 self.diffEdit.ensureCursorVisible() 2624 self.diffEdit.ensureCursorVisible()
2604 2625
2605 @pyqtSlot(str) 2626 @pyqtSlot(str)
2606 def on_diffSelectLabel_linkActivated(self, link): 2627 def on_diffSelectLabel_linkActivated(self, link):

eric ide

mercurial