--- a/eric7/PipInterface/PipLicensesDialog.py Mon May 02 15:53:05 2022 +0200 +++ b/eric7/PipInterface/PipLicensesDialog.py Wed Jun 01 13:48:49 2022 +0200 @@ -8,6 +8,7 @@ """ import os +import re from PyQt6.QtCore import pyqtSlot, Qt from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem @@ -53,6 +54,8 @@ self.__pip = pip self.__environment = environment + self.__allFilter = self.tr("<All>") + self.__saveCSVButton = self.buttonBox.addButton( self.tr("Save as CSV..."), QDialogButtonBox.ButtonRole.ActionRole) self.__saveCSVButton.clicked.connect(self.__saveAsCSV) @@ -74,6 +77,9 @@ # That should never happen; play it safe. self.environmentLabel.setText(self.tr("No environment specified.")) + self.licenseFilterComboBox.currentTextChanged.connect( + self.__filterPackagesByLicense) + self.__refreshLicenses() @pyqtSlot() @@ -84,6 +90,9 @@ with EricOverrideCursor(): self.licensesList.clear() self.summaryList.clear() + self.licenseFilterComboBox.clear() + + licensesForFilter = set() # step 1: show the licenses per package self.licensesList.setUpdatesEnabled(False) @@ -118,6 +127,7 @@ "{0:4d}".format(lic["Count"]), lic["License"].replace("; ", "\n"), ]) + licensesForFilter |= set(lic["License"].split("; ")) self.summaryList.sortItems( PipLicensesDialog.SummaryLicenseColumn, @@ -125,10 +135,36 @@ for col in range(self.summaryList.columnCount()): self.summaryList.resizeColumnToContents(col) self.summaryList.setUpdatesEnabled(True) + + self.licenseFilterComboBox.addItems( + [self.__allFilter] + sorted(licensesForFilter)) enable = bool(self.licensesList.topLevelItemCount()) self.__saveCSVButton.setEnabled(enable) + @pyqtSlot(str) + def __filterPackagesByLicense(self, licenseName): + """ + Private slot to filter the list of packages by license. + + @param licenseName license name + @type str + """ + pattern = r"\b{0}".format(re.escape(licenseName)) + if not licenseName.endswith((")", "]", "}")): + pattern += r"\b" + regexp = re.compile(pattern) + for row in range(self.licensesList.topLevelItemCount()): + itm = self.licensesList.topLevelItem(row) + if licenseName == self.__allFilter: + itm.setHidden(False) + else: + itm.setHidden( + regexp.search( + itm.text(PipLicensesDialog.LicensesLicenseColumn) + ) is None + ) + @pyqtSlot() def __saveAsCSV(self): """