eric7/Plugins/VcsPlugins/vcsGit/GitPatchFilesDialog.py

branch
eric7
changeset 8312
800c432b34c8
parent 8218
7c09585bd960
child 8318
962bce857696
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/Plugins/VcsPlugins/vcsGit/GitPatchFilesDialog.py	Sat May 15 18:45:04 2021 +0200
@@ -0,0 +1,154 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to select a list of patch files.
+"""
+
+from PyQt5.QtCore import pyqtSlot
+from PyQt5.QtWidgets import QDialog, QDialogButtonBox
+
+from E5Gui import E5FileDialog
+
+from .Ui_GitPatchFilesDialog import Ui_GitPatchFilesDialog
+
+import UI.PixmapCache
+import Utilities
+
+
+class GitPatchFilesDialog(QDialog, Ui_GitPatchFilesDialog):
+    """
+    Class implementing a dialog to select a list of patch files.
+    """
+    def __init__(self, rootDir, patchCheckData, parent=None):
+        """
+        Constructor
+        
+        @param rootDir root of the directory tree (string)
+        @param patchCheckData tuple of data as returned by the
+            getData() method
+        @param parent reference to the parent widget (QWidget)
+        """
+        super().__init__(parent)
+        self.setupUi(self)
+        
+        self.__rootDir = rootDir
+        if patchCheckData is not None:
+            self.patchFilesList.addItems(patchCheckData[0])
+            self.stripSpinBox.setValue(patchCheckData[1])
+            self.eofCheckBox.setChecked(patchCheckData[2])
+            self.lineCountsCheckBox.setChecked(patchCheckData[3])
+        
+        self.addButton.setIcon(UI.PixmapCache.getIcon("plus"))
+        self.deleteButton.setIcon(UI.PixmapCache.getIcon("minus"))
+        self.upButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
+        self.downButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
+        
+        self.__okButton = self.buttonBox.button(
+            QDialogButtonBox.StandardButton.Ok)
+        self.__okButton.setEnabled(len(self.__getPatchFilesList()) > 0)
+    
+        self.deleteButton.setEnabled(False)
+        self.upButton.setEnabled(False)
+        self.downButton.setEnabled(False)
+    
+    @pyqtSlot()
+    def on_patchFilesList_itemSelectionChanged(self):
+        """
+        Private slot to enable button states depending on selection.
+        """
+        selectedItems = self.patchFilesList.selectedItems()
+        count = len(selectedItems)
+        isFirst = (
+            count == 1 and
+            self.patchFilesList.row(selectedItems[0]) == 0
+        )
+        isLast = (
+            count == 1 and
+            self.patchFilesList.row(selectedItems[0]) ==
+            self.patchFilesList.count() - 1
+        )
+        self.deleteButton.setEnabled(count > 0)
+        self.upButton.setEnabled(count == 1 and not isFirst)
+        self.downButton.setEnabled(count == 1 and not isLast)
+    
+    @pyqtSlot()
+    def on_addButton_clicked(self):
+        """
+        Private slot to add patch files to the list.
+        """
+        patchFiles = E5FileDialog.getOpenFileNames(
+            self,
+            self.tr("Patch Files"),
+            self.__rootDir,
+            self.tr("Patch Files (*.diff *.patch);;All Files (*)"))
+        if patchFiles:
+            currentPatchFiles = self.__getPatchFilesList()
+            for patchFile in patchFiles:
+                patchFile = Utilities.toNativeSeparators(patchFile)
+                if patchFile not in currentPatchFiles:
+                    self.patchFilesList.addItem(patchFile)
+        
+        self.__okButton.setEnabled(len(self.__getPatchFilesList()) > 0)
+        self.on_patchFilesList_itemSelectionChanged()
+    
+    @pyqtSlot()
+    def on_deleteButton_clicked(self):
+        """
+        Private slot to delete the selected patch files.
+        """
+        for itm in self.patchFilesList.selectedItems():
+            row = self.patchFilesList.row(itm)
+            self.patchFilesList.takeItem(row)
+            del itm
+        
+        self.__okButton.setEnabled(len(self.__getPatchFilesList()) > 0)
+        self.on_patchFilesList_itemSelectionChanged()
+    
+    @pyqtSlot()
+    def on_upButton_clicked(self):
+        """
+        Private slot to move an entry up in the list.
+        """
+        row = self.patchFilesList.row(self.patchFilesList.selectedItems()[0])
+        itm = self.patchFilesList.takeItem(row)
+        self.patchFilesList.insertItem(row - 1, itm)
+        itm.setSelected(True)
+    
+    @pyqtSlot()
+    def on_downButton_clicked(self):
+        """
+        Private slot to move an entry down in the list.
+        """
+        row = self.patchFilesList.row(self.patchFilesList.selectedItems()[0])
+        itm = self.patchFilesList.takeItem(row)
+        self.patchFilesList.insertItem(row + 1, itm)
+        itm.setSelected(True)
+    
+    def __getPatchFilesList(self):
+        """
+        Private method to get the list of patch files.
+        
+        @return list of patch files (list of string)
+        """
+        patchFiles = []
+        for row in range(self.patchFilesList.count()):
+            itm = self.patchFilesList.item(row)
+            patchFiles.append(itm.text())
+        
+        return patchFiles
+    
+    def getData(self):
+        """
+        Public slot to get the entered data.
+        
+        @return tuple of list of patch files, strip count, flag indicating
+            that the patch has inaccurate end-of-file marker and a flag
+            indicating to not trust the line count information
+            (list of string, integer, boolean, boolean)
+        """
+        return (self.__getPatchFilesList(), self.stripSpinBox.value(),
+                self.eofCheckBox.isChecked(),
+                self.lineCountsCheckBox.isChecked())

eric ide

mercurial