diff -r 698660ef7350 -r c6afba2049cf eric7/Project/Project.py --- a/eric7/Project/Project.py Fri Jun 03 12:09:02 2022 +0200 +++ b/eric7/Project/Project.py Fri Jun 03 19:54:57 2022 +0200 @@ -2341,6 +2341,7 @@ self.pdata["MAKEPARAMS"]["MakeEnabled"]) self.menuMakeAct.setEnabled( self.pdata["MAKEPARAMS"]["MakeEnabled"]) + self.menuOtherToolsAct.setEnabled(True) self.projectAboutToBeCreated.emit() @@ -3033,6 +3034,7 @@ self.pdata["MAKEPARAMS"]["MakeEnabled"]) self.menuMakeAct.setEnabled( self.pdata["MAKEPARAMS"]["MakeEnabled"]) + self.menuOtherToolsAct.setEnabled(True) # open a project debugger properties file being quiet # about errors @@ -3289,6 +3291,7 @@ self.pluginGrp.setEnabled(False) self.makeGrp.setEnabled(False) self.menuMakeAct.setEnabled(False) + self.menuOtherToolsAct.setEnabled(False) self.__model.projectClosed() self.projectClosedHooks.emit() @@ -4386,6 +4389,21 @@ self.makeTestAct.triggered.connect( lambda: self.__executeMake(questionOnly=True)) self.actions.append(self.makeTestAct) + + self.createSBOMAct = EricAction( + self.tr('Create SBOM File'), + self.tr('Create &SBOM File'), 0, 0, + self, 'project_create_sbom') + self.createSBOMAct.setStatusTip( + self.tr("Create a SBOM file of the project dependencies.")) + self.createSBOMAct.setWhatsThis(self.tr( + """<b>Create SBOM File</b>""" + """<p>This allows the creation of a SBOM file of the project""" + """ dependencies. This may be based on various input sources""" + """ and will be saved as a CycloneDX SBOM file.</p>""" + )) + self.createSBOMAct.triggered.connect(self.__createSBOMFile) + self.actions.append(self.createSBOMAct) self.closeAct.setEnabled(False) self.saveAct.setEnabled(False) @@ -4424,6 +4442,7 @@ self.apidocMenu = QMenu(self.tr('Source &Documentation'), toolsMenu) self.apidocMenu.setTearOffEnabled(True) self.makeMenu = QMenu(self.tr('Make'), toolsMenu) + self.othersMenu = QMenu(self.tr('Other Tools'), toolsMenu) self.__menus = { "Main": menu, @@ -4437,6 +4456,7 @@ "Debugger": self.debuggerMenu, "Packagers": self.packagersMenu, "Make": self.makeMenu, + "OtherTools": self.othersMenu, } # connect the aboutToShow signals @@ -4451,6 +4471,7 @@ self.sessionMenu.aboutToShow.connect(self.__showContextMenuSession) self.debuggerMenu.aboutToShow.connect(self.__showContextMenuDebugger) self.makeMenu.aboutToShow.connect(self.__showContextMenuMake) + self.othersMenu.aboutToShow.connect(self.__showContextMenuOthers) menu.aboutToShow.connect(self.__showMenu) # build the show menu @@ -4483,6 +4504,10 @@ self.makeMenu.addActions(self.makeGrp.actions()) self.makeMenu.addSeparator() + # build the 'Other Tools' menu + self.othersMenu.setTearOffEnabled(True) + self.othersMenu.addAction(self.createSBOMAct) + # build the project main menu menu.setTearOffEnabled(True) menu.addActions(self.actGrp1.actions()) @@ -4519,6 +4544,8 @@ self.menuApidocAct = toolsMenu.addMenu(self.apidocMenu) toolsMenu.addSeparator() self.menuPackagersAct = toolsMenu.addMenu(self.packagersMenu) + toolsMenu.addSeparator() + self.menuOtherToolsAct = toolsMenu.addMenu(self.othersMenu) self.menuCheckAct.setEnabled(False) self.menuShowAct.setEnabled(False) @@ -4528,6 +4555,7 @@ self.menuApidocAct.setEnabled(False) self.menuPackagersAct.setEnabled(False) self.menuMakeAct.setEnabled(False) + self.menuOtherToolsAct.setEnabled(False) self.__menu = menu self.__toolsMenu = toolsMenu @@ -5914,6 +5942,25 @@ @rtype str """ return self.pdata["DOCSTRING"] + + ######################################################################### + ## Below are methods implementing the 'SBOM' support + ######################################################################### + + def __showContextMenuOthers(self): + """ + Private slot called before the 'Other Tools' menu is shown. + """ + self.showMenu.emit("OtherTools", self.othersMenu) + + @pyqtSlot() + def __createSBOMFile(self): + """ + Private slot to create a SBOM file of the project dependencies. + """ + import CycloneDXInterface + + CycloneDXInterface.createCycloneDXFile("<project>") # # eflag: noqa = M601