--- a/src/eric7/PipInterface/PipPackagesWidget.py Sun Jul 17 17:46:51 2022 +0200 +++ b/src/eric7/PipInterface/PipPackagesWidget.py Sun Jul 17 18:47:23 2022 +0200 @@ -1145,36 +1145,85 @@ Private method to create the super menu and attach it to the super menu button. """ - self.__pipMenu = QMenu() - self.__installPipAct = self.__pipMenu.addAction( + ################################################################### + ## Menu with pip related actions + ################################################################### + + self.__pipSubmenu = QMenu(self.tr("Pip")) + self.__installPipAct = self.__pipSubmenu.addAction( self.tr("Install Pip"), self.__installPip ) - self.__installPipUserAct = self.__pipMenu.addAction( + self.__installPipUserAct = self.__pipSubmenu.addAction( self.tr("Install Pip to User-Site"), self.__installPipUser ) - self.__repairPipAct = self.__pipMenu.addAction( + self.__repairPipAct = self.__pipSubmenu.addAction( self.tr("Repair Pip"), self.__repairPip ) - self.__pipMenu.addSeparator() - self.__installPackagesAct = self.__pipMenu.addAction( + + ################################################################### + ## Menu with install related actions + ################################################################### + + self.__installSubmenu = QMenu(self.tr("Install")) + self.__installPackagesAct = self.__installSubmenu.addAction( self.tr("Install Packages"), self.__installPackages ) - self.__installLocalPackageAct = self.__pipMenu.addAction( + self.__installLocalPackageAct = self.__installSubmenu.addAction( self.tr("Install Local Package"), self.__installLocalPackage ) - self.__pipMenu.addSeparator() - self.__installRequirementsAct = self.__pipMenu.addAction( + self.__reinstallPackagesAct = self.__installSubmenu.addAction( + self.tr("Re-Install Selected Packages"), self.__reinstallPackages + ) + + ################################################################### + ## Menu for requirements and constraints management + ################################################################### + + self.__requirementsSubenu = QMenu(self.tr("Requirements/Constraints")) + self.__installRequirementsAct = self.__requirementsSubenu.addAction( self.tr("Install Requirements"), self.__installRequirements ) - self.__reinstallPackagesAct = self.__pipMenu.addAction( - self.tr("Re-Install Selected Packages"), self.__reinstallPackages - ) - self.__uninstallRequirementsAct = self.__pipMenu.addAction( + self.__uninstallRequirementsAct = self.__requirementsSubenu.addAction( self.tr("Uninstall Requirements"), self.__uninstallRequirements ) - self.__generateRequirementsAct = self.__pipMenu.addAction( + self.__generateRequirementsAct = self.__requirementsSubenu.addAction( self.tr("Generate Requirements..."), self.__generateRequirements ) + self.__requirementsSubenu.addSeparator() + self.__generateConstraintsAct = self.__requirementsSubenu.addAction( + self.tr("Generate Constraints..."), self.__generateConstraints + ) + + ################################################################### + ## Menu for requirements and constraints management + ################################################################### + + self.__cacheSubmenu = QMenu(self.tr("Cache")) + self.__cacheInfoAct = self.__cacheSubmenu.addAction( + self.tr("Show Cache Info..."), self.__showCacheInfo + ) + self.__cacheShowListAct = self.__cacheSubmenu.addAction( + self.tr("Show Cached Files..."), self.__showCacheList + ) + self.__cacheRemoveAct = self.__cacheSubmenu.addAction( + self.tr("Remove Cached Files..."), self.__removeCachedFiles + ) + self.__cachePurgeAct = self.__cacheSubmenu.addAction( + self.tr("Purge Cache..."), self.__purgeCache + ) + + ################################################################### + ## Main menu + ################################################################### + + self.__pipMenu = QMenu() + self.__pipSubmenuAct = self.__pipMenu.addMenu(self.__pipSubmenu) + self.__pipMenu.addSeparator() + self.__installSubmenuAct = self.__pipMenu.addMenu(self.__installSubmenu) + self.__pipMenu.addSeparator() + self.__requirementsSubmenuAct = self.__pipMenu.addMenu( + self.__requirementsSubenu + ) self.__pipMenu.addSeparator() self.__showLicensesDialogAct = self.__pipMenu.addAction( self.tr("Show Licenses..."), self.__showLicensesDialog @@ -1192,18 +1241,7 @@ self.tr("Create SBOM file"), self.__createSBOMFile ) self.__pipMenu.addSeparator() - self.__cacheInfoAct = self.__pipMenu.addAction( - self.tr("Show Cache Info..."), self.__showCacheInfo - ) - self.__cacheShowListAct = self.__pipMenu.addAction( - self.tr("Show Cached Files..."), self.__showCacheList - ) - self.__cacheRemoveAct = self.__pipMenu.addAction( - self.tr("Remove Cached Files..."), self.__removeCachedFiles - ) - self.__cachePurgeAct = self.__pipMenu.addAction( - self.tr("Purge Cache..."), self.__purgeCache - ) + self.__cacheSubmenuAct = self.__pipMenu.addMenu(self.__cacheSubmenu) self.__pipMenu.addSeparator() # editUserConfigAct self.__pipMenu.addAction( @@ -1229,22 +1267,16 @@ enablePip = self.__isPipAvailable() enablePipCache = self.__availablePipVersion() >= (20, 1, 0) + self.__pipSubmenuAct.setEnabled(enable) self.__installPipAct.setEnabled(not enablePip) self.__installPipUserAct.setEnabled(not enablePip) self.__repairPipAct.setEnabled(enablePip) - self.__installPackagesAct.setEnabled(enablePip) - self.__installLocalPackageAct.setEnabled(enablePip) - self.__reinstallPackagesAct.setEnabled(enablePip) + self.__installSubmenu.setEnabled(enablePip) - self.__installRequirementsAct.setEnabled(enablePip) - self.__uninstallRequirementsAct.setEnabled(enablePip) - self.__generateRequirementsAct.setEnabled(enablePip) + self.__requirementsSubmenuAct.setEnabled(enablePip) - self.__cacheInfoAct.setEnabled(enablePipCache) - self.__cacheShowListAct.setEnabled(enablePipCache) - self.__cacheRemoveAct.setEnabled(enablePipCache) - self.__cachePurgeAct.setEnabled(enablePipCache) + self.__cacheSubmenuAct.setEnabled(enablePipCache) self.__editVirtualenvConfigAct.setEnabled(enable) @@ -1358,9 +1390,26 @@ """ venvName = self.environmentsComboBox.currentText() if venvName: - from .PipFreezeDialog import PipFreezeDialog + from .PipFreezeDialog import PipFreezeDialog, PipFreezeDialogModes + + self.__freezeDialog = PipFreezeDialog( + self.__pip, mode=PipFreezeDialogModes.Requirements, parent=self + ) + self.__freezeDialog.show() + self.__freezeDialog.start(venvName) - self.__freezeDialog = PipFreezeDialog(self.__pip, self) + @pyqtSlot() + def __generateConstraints(self): + """ + Private slot to generate the contents for a constraints file. + """ + venvName = self.environmentsComboBox.currentText() + if venvName: + from .PipFreezeDialog import PipFreezeDialog, PipFreezeDialogModes + + self.__freezeDialog = PipFreezeDialog( + self.__pip, mode=PipFreezeDialogModes.Constraints, parent=self + ) self.__freezeDialog.show() self.__freezeDialog.start(venvName)