221 self.dependenciesList.header().setSortIndicator( |
222 self.dependenciesList.header().setSortIndicator( |
222 PipPackagesWidget.DepPackageColumn, Qt.SortOrder.AscendingOrder |
223 PipPackagesWidget.DepPackageColumn, Qt.SortOrder.AscendingOrder |
223 ) |
224 ) |
224 |
225 |
225 self.__infoLabels = { |
226 self.__infoLabels = { |
226 "name": self.tr("Name:"), |
|
227 "version": self.tr("Version:"), |
|
228 "location": self.tr("Location:"), |
|
229 "requires": self.tr("Requires:"), |
|
230 "summary": self.tr("Summary:"), |
|
231 "home-page": self.tr("Homepage:"), |
|
232 "author": self.tr("Author:"), |
227 "author": self.tr("Author:"), |
233 "author-email": self.tr("Author Email:"), |
228 "author-email": self.tr("Author Email:"), |
234 "license": self.tr("License:"), |
|
235 "metadata-version": self.tr("Metadata Version:"), |
|
236 "installer": self.tr("Installer:"), |
|
237 "classifiers": self.tr("Classifiers:"), |
229 "classifiers": self.tr("Classifiers:"), |
238 "entry-points": self.tr("Entry Points:"), |
230 "entry-points": self.tr("Entry Points:"), |
239 "files": self.tr("Files:"), |
231 "files": self.tr("Files:"), |
|
232 "home-page": self.tr("Homepage:"), |
|
233 "installer": self.tr("Installer:"), |
|
234 "license": self.tr("License:"), |
|
235 "location": self.tr("Location:"), |
|
236 "metadata-version": self.tr("Metadata Version:"), |
|
237 "name": self.tr("Name:"), |
|
238 "project-urls": self.tr("Project URLs:"), |
|
239 "requires": self.tr("Requires:"), |
|
240 "required-by": self.tr("Required By:"), |
|
241 "summary": self.tr("Summary:"), |
|
242 "version": self.tr("Version:"), |
240 } |
243 } |
241 self.infoWidget.setHeaderLabels(["Key", "Value"]) |
244 self.packageInfoWidget.setHeaderLabels(["Key", "Value"]) |
242 self.dependencyInfoWidget.setHeaderLabels(["Key", "Value"]) |
245 self.dependencyInfoWidget.setHeaderLabels(["Key", "Value"]) |
243 |
246 |
244 venvManager = ericApp().getObject("VirtualEnvManager") |
247 venvManager = ericApp().getObject("VirtualEnvManager") |
245 venvManager.virtualEnvironmentAdded.connect(self.on_refreshButton_clicked) |
248 venvManager.virtualEnvironmentAdded.connect(self.on_refreshButton_clicked) |
246 venvManager.virtualEnvironmentRemoved.connect(self.on_refreshButton_clicked) |
249 venvManager.virtualEnvironmentRemoved.connect(self.on_refreshButton_clicked) |
583 mode = self.ShowProcessFilesListMode |
587 mode = self.ShowProcessFilesListMode |
584 elif label == "classifiers": |
588 elif label == "classifiers": |
585 mode = self.ShowProcessClassifiersMode |
589 mode = self.ShowProcessClassifiersMode |
586 elif label == "entry-points": |
590 elif label == "entry-points": |
587 mode = self.ShowProcessEntryPointsMode |
591 mode = self.ShowProcessEntryPointsMode |
|
592 elif label == "project-urls": |
|
593 mode = self.ShowProcessUrlsListMode |
588 infoWidget.scrollToTop() |
594 infoWidget.scrollToTop() |
589 |
595 |
590 header = infoWidget.header() |
596 header = infoWidget.header() |
591 header.setStretchLastSection(False) |
597 header.setStretchLastSection(False) |
592 header.resizeSections(QHeaderView.ResizeMode.ResizeToContents) |
598 header.resizeSections(QHeaderView.ResizeMode.ResizeToContents) |
597 def on_packagesList_itemSelectionChanged(self): |
603 def on_packagesList_itemSelectionChanged(self): |
598 """ |
604 """ |
599 Private slot reacting on a change of selected items. |
605 Private slot reacting on a change of selected items. |
600 """ |
606 """ |
601 if len(self.packagesList.selectedItems()) == 0: |
607 if len(self.packagesList.selectedItems()) == 0: |
602 self.infoWidget.clear() |
608 self.packageInfoWidget.clear() |
603 |
609 self.vulnerabilitiesInfoWidget.clear() |
604 @pyqtSlot(QTreeWidgetItem, int) |
610 self.infoWidget.tabBar().hide() |
605 def on_packagesList_itemPressed(self, item, column): |
611 |
606 """ |
612 @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem) |
607 Private slot reacting on a package item being pressed. |
613 def on_packagesList_currentItemChanged(self, curr, prev): |
608 |
614 """ |
609 @param item reference to the pressed item |
615 Private slot to handle a change of the current item. |
|
616 |
|
617 @param curr new current item |
610 @type QTreeWidgetItem |
618 @type QTreeWidgetItem |
611 @param column pressed column |
619 @param prev previous current item |
612 @type int |
620 @type QTreeWidgetItem |
613 """ |
621 """ |
614 self.infoWidget.clear() |
622 self.packageInfoWidget.clear() |
615 |
623 self.vulnerabilitiesInfoWidget.clear() |
616 if item is not None: |
624 |
617 if column == PipPackagesWidget.VulnerabilityColumn and bool( |
625 if curr is None: |
618 item.text(PipPackagesWidget.VulnerabilityColumn) |
626 self.infoWidget.tabBar().hide() |
619 ): |
627 else: |
|
628 self.__showPackageInformation( |
|
629 curr.text(PipPackagesWidget.PackageColumn), self.packageInfoWidget |
|
630 ) |
|
631 if bool(curr.text(PipPackagesWidget.VulnerabilityColumn)): |
620 self.__showVulnerabilityInformation( |
632 self.__showVulnerabilityInformation( |
621 item.text(PipPackagesWidget.PackageColumn), |
633 curr.text(PipPackagesWidget.PackageColumn), |
622 item.text(PipPackagesWidget.InstalledVersionColumn), |
634 curr.text(PipPackagesWidget.InstalledVersionColumn), |
623 item.data( |
635 curr.data( |
624 PipPackagesWidget.VulnerabilityColumn, |
636 PipPackagesWidget.VulnerabilityColumn, |
625 PipPackagesWidget.VulnerabilityRole, |
637 PipPackagesWidget.VulnerabilityRole, |
626 ), |
638 ), |
627 ) |
639 ) |
|
640 self.infoWidget.tabBar().show() |
628 else: |
641 else: |
629 self.__showPackageInformation( |
642 self.infoWidget.tabBar().hide() |
630 item.text(PipPackagesWidget.PackageColumn), self.infoWidget |
643 self.infoWidget.setCurrentIndex(0) |
631 ) |
|
632 |
644 |
633 self.__updateActionButtons() |
645 self.__updateActionButtons() |
634 |
646 |
635 @pyqtSlot(QTreeWidgetItem, int) |
647 @pyqtSlot(QTreeWidgetItem, int) |
636 def on_packagesList_itemActivated(self, item, column): |
648 def on_packagesList_itemActivated(self, item, column): |
677 checkbox. |
689 checkbox. |
678 |
690 |
679 @param checked state of the checkbox |
691 @param checked state of the checkbox |
680 @type bool |
692 @type bool |
681 """ |
693 """ |
682 self.on_packagesList_itemPressed( |
694 self.on_packagesList_currentItemChanged(self.packagesList.currentItem(), None) |
683 self.packagesList.currentItem(), self.packagesList.currentColumn() |
|
684 ) |
|
685 |
695 |
686 @pyqtSlot(bool) |
696 @pyqtSlot(bool) |
687 def on_installedFilesCheckBox_clicked(self, checked): |
697 def on_installedFilesCheckBox_clicked(self, checked): |
688 """ |
698 """ |
689 Private slot to handle a change of the installed files information |
699 Private slot to handle a change of the installed files information |
690 checkbox. |
700 checkbox. |
691 |
701 |
692 @param checked state of the checkbox |
702 @param checked state of the checkbox |
693 @type bool |
703 @type bool |
694 """ |
704 """ |
695 self.on_packagesList_itemPressed( |
705 self.on_packagesList_currentItemChanged(self.packagesList.currentItem(), None) |
696 self.packagesList.currentItem(), self.packagesList.currentColumn() |
|
697 ) |
|
698 |
706 |
699 @pyqtSlot() |
707 @pyqtSlot() |
700 def on_refreshButton_clicked(self): |
708 def on_refreshButton_clicked(self): |
701 """ |
709 """ |
702 Private slot to refresh the display. |
710 Private slot to refresh the display. |
1734 @param packageVersion installed version number |
1742 @param packageVersion installed version number |
1735 @type str |
1743 @type str |
1736 @param vulnerabilities list of vulnerabilities |
1744 @param vulnerabilities list of vulnerabilities |
1737 @type list of Vulnerability |
1745 @type list of Vulnerability |
1738 """ |
1746 """ |
1739 header = self.tr("{0} {1}", "package name, package version").format( |
1747 if vulnerabilities: |
1740 packageName, packageVersion |
1748 header = self.tr("{0} {1}", "package name, package version").format( |
1741 ) |
1749 packageName, packageVersion |
1742 topItem = QTreeWidgetItem(self.infoWidget, [header]) |
1750 ) |
1743 topItem.setFirstColumnSpanned(True) |
1751 topItem = QTreeWidgetItem(self.vulnerabilitiesInfoWidget, [header]) |
1744 topItem.setExpanded(True) |
1752 topItem.setFirstColumnSpanned(True) |
1745 font = topItem.font(0) |
1753 topItem.setExpanded(True) |
1746 font.setBold(True) |
1754 font = topItem.font(0) |
1747 topItem.setFont(0, font) |
1755 font.setBold(True) |
1748 |
1756 topItem.setFont(0, font) |
1749 for vulnerability in vulnerabilities: |
1757 |
1750 title = ( |
1758 for vulnerability in vulnerabilities: |
1751 vulnerability.cve |
1759 title = ( |
1752 if vulnerability.cve |
1760 vulnerability.cve |
1753 else vulnerability.vulnerabilityId |
1761 if vulnerability.cve |
1754 ) |
1762 else vulnerability.vulnerabilityId |
1755 titleItem = QTreeWidgetItem(topItem, [title]) |
1763 ) |
1756 titleItem.setFirstColumnSpanned(True) |
1764 titleItem = QTreeWidgetItem(topItem, [title]) |
1757 titleItem.setExpanded(True) |
1765 titleItem.setFirstColumnSpanned(True) |
1758 |
1766 titleItem.setExpanded(True) |
1759 QTreeWidgetItem( |
1767 |
1760 titleItem, [self.tr("Affected Version:"), vulnerability.spec] |
1768 QTreeWidgetItem( |
1761 ) |
1769 titleItem, [self.tr("Affected Version:"), vulnerability.spec] |
1762 itm = QTreeWidgetItem( |
1770 ) |
1763 titleItem, [self.tr("Advisory:"), vulnerability.advisory] |
1771 itm = QTreeWidgetItem( |
1764 ) |
1772 titleItem, [self.tr("Advisory:"), vulnerability.advisory] |
1765 itm.setToolTip( |
1773 ) |
1766 1, "<p>{0}</p>".format(vulnerability.advisory.replace("\r\n", "<br/>")) |
1774 itm.setToolTip( |
1767 ) |
1775 1, |
1768 |
1776 "<p>{0}</p>".format( |
1769 self.infoWidget.scrollToTop() |
1777 vulnerability.advisory.replace("\r\n", "<br/>") |
1770 self.infoWidget.resizeColumnToContents(0) |
1778 ), |
1771 |
1779 ) |
1772 header = self.infoWidget.header() |
1780 |
1773 header.setStretchLastSection(True) |
1781 self.vulnerabilitiesInfoWidget.scrollToTop() |
|
1782 self.vulnerabilitiesInfoWidget.resizeColumnToContents(0) |
|
1783 |
|
1784 header = self.vulnerabilitiesInfoWidget.header() |
|
1785 header.setStretchLastSection(True) |
|
1786 else: |
|
1787 self.vulnerabilitiesInfoWidget.clear() |
1774 |
1788 |
1775 ####################################################################### |
1789 ####################################################################### |
1776 ## Dependency tree related methods below |
1790 ## Dependency tree related methods below |
1777 ####################################################################### |
1791 ####################################################################### |
1778 |
1792 |