--- a/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py Wed Feb 25 19:15:33 2015 +0100 +++ b/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py Wed Feb 25 19:21:32 2015 +0100 @@ -17,6 +17,7 @@ import os from PyQt5.QtCore import pyqtSlot, Qt, QProcess, QTimer +from PyQt5.QtGui import QTextCursor from PyQt5.QtWidgets import QWidget, QDialogButtonBox, QMenu, QHeaderView, \ QTreeWidgetItem, QLineEdit @@ -25,6 +26,9 @@ from .Ui_HgStatusDialog import Ui_HgStatusDialog +from .HgDiffHighlighter import HgDiffHighlighter +from .HgDiffGenerator import HgDiffGenerator + import Preferences @@ -70,10 +74,22 @@ self.process.readyReadStandardOutput.connect(self.__readStdout) self.process.readyReadStandardError.connect(self.__readStderr) + self.__hDiffSplitterState = None + self.statusList.headerItem().setText(self.__lastColumn, "") self.statusList.header().setSortIndicator( self.__pathColumn, Qt.AscendingOrder) + font = Preferences.getEditorOtherFonts("MonospacedFont") + self.diffEdit.setFontFamily(font.family()) + self.diffEdit.setFontPointSize(font.pointSize()) + + self.diffHighlighter = HgDiffHighlighter(self.diffEdit.document()) + self.__diffGenerator = HgDiffGenerator(vcs, self) + self.__diffGenerator.finished.connect(self.__generatorFinished) + + self.__selectedName = "" + if mq: self.buttonsLine.setVisible(False) self.addButton.setVisible(False) @@ -82,6 +98,8 @@ self.revertButton.setVisible(False) self.forgetButton.setVisible(False) self.restoreButton.setVisible(False) + + self.diffEdit.setVisible(False) self.menuactions = [] self.lfActions = [] @@ -170,6 +188,15 @@ '!': self.tr('missing'), } + def show(self): + """ + Public slot to show the dialog. + """ + super(HgStatusDialog, self).show() + + if not self.__mq and self.__hDiffSplitterState: + self.diffSplitter.restoreState(self.__hDiffSplitterState) + def __resort(self): """ Private method to resort the tree. @@ -227,6 +254,9 @@ QTimer.singleShot(2000, self.process.kill) self.process.waitForFinished(3000) + if not self.__mq: + self.__hDiffSplitterState = self.diffSplitter.saveState() + e.accept() def start(self, fn): @@ -362,6 +392,8 @@ self.__updateButtons() self.__updateCommitButton() + + self.__refreshDiff() def on_buttonBox_clicked(self, button): """ @@ -490,6 +522,12 @@ """ Private slot to refresh the status display. """ + selectedItems = self.statusList.selectedItems() + if len(selectedItems) == 1: + self.__selectedName = selectedItems[0].text(self.__pathColumn) + else: + self.__selectedName = "" + self.start(self.args) def __updateButtons(self): @@ -547,6 +585,7 @@ Private slot to act upon changes of selected items. """ self.__updateButtons() + self.__generateDiffs() @pyqtSlot() def on_commitButton_clicked(self): @@ -891,3 +930,52 @@ itm.setCheckState(self.__toBeCommittedColumn, Qt.Checked) else: itm.setCheckState(self.__toBeCommittedColumn, Qt.Unchecked) + + ########################################################################### + ## Diff handling methods below + ########################################################################### + + def __generateDiffs(self): + """ + Private slot to generate diff outputs for the selected item. + """ + self.diffEdit.clear() + + if not self.__mq: + selectedItems = self.statusList.selectedItems() + if len(selectedItems) == 1: + fn = os.path.join(self.dname, + selectedItems[0].text(self.__pathColumn)) + self.__diffGenerator.start(fn) + + def __generatorFinished(self): + """ + Private slot connected to the finished signal of the diff generator. + """ + diff = self.__diffGenerator.getResult()[0] + + if diff: + for line in diff[:]: + if line.startswith("@@ "): + break + else: + diff.pop(0) + self.diffEdit.setPlainText("".join(diff)) + + tc = self.diffEdit.textCursor() + tc.movePosition(QTextCursor.Start) + self.diffEdit.setTextCursor(tc) + self.diffEdit.ensureCursorVisible() + + def __refreshDiff(self): + """ + Private method to refresh the diff output after a refresh. + """ + if self.__selectedName and not self.__mq: + for index in range(self.statusList.topLevelItemCount()): + itm = self.statusList.topLevelItem(index) + if itm.text(self.__pathColumn) == self.__selectedName: + itm.setSelected(True) + break + + self.__selectedName = ""